PC端实现STM32硬件CRC32计算结果(基本原理)

需要提前掌握的内容

  1. CRC32的基本原理
    可以通过过其他博文或者我附件中的WORD来学习
  2. 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函数,编译烧录即可得到测试结果,结果如下:
测试结果
无视相关的说明,测试结果如下:
CF534AE1, 45EE68FB
上述两个十六进制字符串便为STM32硬件CRC32根据不同的输入数据的生成码

使用CRC32在线计算工具生成

不需要太多的理论叙述,如下图所示便可得到我们所需的CRC32生成码:
[0x41, 0x42, 0x43, 0x44]生成码
[0x41,0x42,0x43,0x44,0x44,0x43]生成码
从上图的配置可以得到和STM32硬件CRC32相同的结果。如果使用常规的CRC32结果会完全不同:
常规CRC32计算结果

常规CRC32与STM32硬件CRC32的不同点

输入数据按字节反转

以0x41为例:将0x41写成二进制为:0100 0001,将其反转为:1000 0010,反转后的数十六进制为:0x82
同理,将[0x41, 0x42, 0x43, 0x44]依次反转便为[0x82, 0x42, 0xc2, 0x22],同时字节的存放也需要反转,即[0x22, 0xc2, 0x42, 0x82],结果图如下:
输入数据反转
由于,STM32硬件CRC是以32位为最小单位进行计算,所以对于数据[0x41, 0x42,0x43,0x44,0x44,0x43]其反转后应为:[0x22,0xc2,0x42,0x82,0x00,0x00,0xc2,0x22],结果如下图:
数据反转2

结果异或值

常规CRC32为0xFFFFFFFF,即上述结果值与其做异或即取反处理

输出数据反转

同上上节内容

总结

一种实现的思路便是现将输入的数据按字节反转后输入常规CRC32,然后再将结果反转并取反即可得到与STM32硬件CRC32相同的校验码了