使用CRC在线计算工具,点击即可到达
给出代码如下:
/* 使用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生成码:
从上图的配置可以得到和STM32硬件CRC32相同的结果。如果使用常规的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]
,结果如下图:
常规CRC32为0xFFFFFFFF
,即上述结果值与其做异或即取反处理
同上上节内容
一种实现的思路便是现将输入的数据按字节反转后输入常规CRC32,然后再将结果反转并取反即可得到与STM32硬件CRC32相同的校验码了