【发布时间】:2021-06-20 06:02:27
【问题描述】:
我尝试在我的 STM32L4 上使用 HAL_CRC 来计算 16 位 CRC,但不知何故,无论输入是什么,我总是得到相同的结果...
CRC 初始化
hcrc.Instance = CRC;
hcrc.Init.CRCLength = CRC_POLYLENGTH_16B; //as I have a 16bit polynome
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
hcrc.Init.GeneratingPolynomial = 0x1021; //MCRF4xx polynome
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; //I want to init with 0xFFFF
hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE; //input inversion
hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE; //output inversion
hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; //I have byte input
if (HAL_CRC_Init(&hcrc) != HAL_OK)
{
Error_Handler();
}
然后用
调用计算uint32_t result;
uint8_t pBuffer[3] = {0x33, 0x33, 0x55};
result = HAL_CRC_Calculate(&hcrc,pBuffer,3);
但结果始终是0xe000ed04,对于这种特定情况,我希望0xC91B,但如果更改输入,至少它应该会改变。有人发现此代码 sn-p 有问题吗?我在 HAL 库中找不到任何 16 位 CRC 的示例代码。
我知道HAL_CRC_Calculate() 的返回值是uint32_t,所以我的结果将是两个低字节——在本例中为0xed04。至少这是我对函数描述的解释。
【问题讨论】:
-
你想如何从 3 个字节计算 CRC16?它必须能被 16 位整除...第三个参数是半字数 - 你有 3 个字节,即 1,5 个半字,而不是
3。 -
@KamilCuk
CRC_INPUTDATA_FORMAT_BYTES标志应该允许3成为正确的输入单位(字节数,而不是半字数),但您指出的问题是数字对于 16 位 CRC,字节数应该能被 2 整除,否则 HAL 将只处理输入的3 / 2 == 1半字,或者在这种情况下是前两个字节。 -
那么我该如何计算这个输入的 CRC16 呢?即使它只计算前两个字节的 CRC,输出仍应随输入而变化......
-
@po.pe 抛开
n==3的问题,uint8_t pBuffer[4] = {0x33, 0x33, 0x55}; result = HAL_CRC_Calculate(&hcrc,pBuffer,4);对你有什么好处? -
不,KamilCuk 不正确。 CRC-n 可以根据任意位数计算,与 n 无关。