本文是《嵌入式开发–STM32软件和硬件CRC的使用》的续篇,又踩到一个坑,发出来让大家避一下坑。
按照G0系列的设置,得出错误的结果
前文对应的是STM32G0系列,今天在用STM32G4系列时,按照前文的设置,用硬件CRC计算得出的结果不对,
待计算的字符串为
正确的结果应该是 0x9118E1C2
但我计算出来的结果不正确,如下图,
G4系列正确的设置
搭配目前最新的CubeMX 6.14和G4 支持包1.6.1,设置如下:
生成后的代码:
void MX_CRC_Init(void)
{
/* USER CODE BEGIN CRC_Init 0 */
/* USER CODE END CRC_Init 0 */
/* USER CODE BEGIN CRC_Init 1 */
/* USER CODE END CRC_Init 1 */
hcrc.Instance = CRC;
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
hcrc.Init.InitValue = 0xffffffff;
hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_WORD;
hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;
if (HAL_CRC_Init(&hcrc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN CRC_Init 2 */
/* USER CODE END CRC_Init 2 */
}
以下是验证图片
注意事项
硬件CRC计算时,输出结果需要取反,才能与主流CRC32的计算结果一致。
验证网站:http://www.ip33.com/crc.html
sys_cnt1 = ~HAL_CRC_Calculate(&hcrc,(u32*)g_text_buf, 2);
大坑
我的工程是以前验证过OK的,今天把工程调出来用就出错了。
区别就是以前的工程用的CubeMX版本是6.10.0,G4系列的支持包版本是1.5.1
最近将CubeMX升级到了6.14,G4系列的支持包版本也升级到了1.6.1
计算结果竟然不一致,大家千万要注意啊。