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

需要提前掌握的内容

  1. CRC32的基本原理
    可以通过过其他博文或者我附件中的WORD来学习
  2. STM32硬件CRC32校验结果生成
    初学建议使用CubeMX及HAL库

STM32硬件CRC与常规CRC的不同

使用CRC在线计算工具,点击即可到达

STM32硬件CRC32生成案例

给出代码如下:

/* 使用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相同的校验码了

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值