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 位的主要内容,如果未能解决你的问题,请参考以下文章

如何读取stm32 flash里面的内容

stm32c6t6几个dac

STM32手册中的CAN过滤器16位标识符屏蔽配置错误说明

什么是STM32的高寄存器和低寄存器?

STM32CubeMX配置DMA中 Data Width 的选择

STM32 ADC详解