需要提前掌握的内容
- CRC32的基本原理
可以通过过其他博文或者我附件中的WORD来学习 - STM32硬件CRC32校验结果生成
初学建议使用CubeMX及HAL库
STM32硬件CRC与常规CRC的不同
使用CRC在线计算工具,点击即可到达
STM32硬件CRC32生成案例
给出代码如下:
1 2 3 4 5 6 7 8 9 10 | /* 使用HAL库,测试STM32硬件CRC32生成码 *************************************/ // 定义并赋值初始变量 uint8_t input_data1[]={0x41,0x42,0x43,0x44}; uint8_t input_data2[]={0x41,0x42,0x43,0x44,0x44,0x43}; // 定义并赋值CRC生成码存放变量 uint32_t crc_check1 = HAL_CRC_Calculate(&hcrc, (uint32_t*)input_data1, 1); uint32_t crc_check2 = HAL_CRC_Calculate(&hcrc, (uint32_t*)input_data2, 2); // 通过串口向PC端发送CRC生成码,并以十六进制显示之 // stm32中printf()函数的配置可以搜寻其他博文 printf("%x, %x", crc_check1, crc_check2); |
将上述代码写入main函数,编译烧录即可得到测试结果,结果如下:
无视相关的说明,测试结果如下:
上述两个十六进制字符串便为STM32硬件CRC32根据不同的输入数据的生成码
使用CRC32在线计算工具生成
不需要太多的理论叙述,如下图所示便可得到我们所需的CRC32生成码:
从上图的配置可以得到和STM32硬件CRC32相同的结果。如果使用常规的CRC32结果会完全不同:
常规CRC32与STM32硬件CRC32的不同点
输入数据按字节反转
以0x41为例:将
同理,将
由于,STM32硬件CRC是以32位为最小单位进行计算,所以对于数据
结果异或值
常规CRC32为
输出数据反转
同上上节内容
总结
一种实现的思路便是现将输入的数据按字节反转后输入常规CRC32,然后再将结果反转并取反即可得到与STM32硬件CRC32相同的校验码了