STM32 HAL_CRC 16 位
Posted
技术标签:
【中文标题】STM32 HAL_CRC 16 位【英文标题】:STM32 HAL_CRC 16 Bit 【发布时间】: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 无关。
【参考方案1】:
文档表明您需要使用__HAL_RCC_CRC_CLK_ENABLE();
启用 CRC 硬件时钟。你这样做了吗?
【讨论】:
我会检查的,但我认为 HAL 初始化会处理这个... HAL 确实解决了这个问题.. 通过为您提供启用时钟的功能 :) 更严肃的一点是,请务必检查相应源文件顶部的注释 - @987654322 @ 例如。通常(总是?)有一个“如何使用这个驱动程序”部分,它解释了需要做什么以及按照什么顺序。在 CRC 驱动程序的情况下,启用时钟实际上已列在此处,因此阅读可能会为您节省一些精力。以上是关于STM32 HAL_CRC 16 位的主要内容,如果未能解决你的问题,请参考以下文章