查看: 2101|回复: 5
打印 上一主题 下一主题

STM32的CRC校验

[复制链接]

45

主题

47

帖子

616

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
616
跳转到指定楼层
楼主
发表于 2018-9-3 16:12:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
CRC即循环冗余校验码(Cyclic Redundancy Check),是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。


1. STM32的CRC校验

1.1. 所有的STM32芯片都内置了一个硬件CRC计算模块,可以很方便地应用到需要进行数据校验的程序中,这个CRC计算模块使用常见的以太网标准CRC-32计算多项式:
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,写成16进制就是:0x04C11DB7。


1.2. 使用这个内置CRC模块的方法非常简单,调用 HAL_CRC_Init 函数初始化CRC外设,然后调用 HAL_CRC_Accumulate 或者 HAL_CRC_Calculate 函数计算32位CRC,STM32的硬件CRC单元是以32位的字为单位计算的,需要4字节对齐。

1) HAL_CRC_Accumulate 函数,会累积之前的CRC计算数值。
2) HAL_CRC_Calculate 函数,不累积之前的CRC计算数值,每次计算前都会复位数据寄存器:__HAL_CRC_DR_RESET(hcrc)。


1.3. STM32F0,F3系列相对于STM32F1系列来说,CRC功能有所增强,具体表现在:输入翻转,输出翻转,长度可调,初始值可调,多项式可调。


STM32系列各个功能之间的区别具体可以看看应用笔记:

1) STM32微控制器应用程序移植和兼容性检测指导手册

2) 在STM32家族中使用CRC外设


2. ST官方的CRC算法流程图和分步计算示例

2.1. CRC算法流程图



2.2. 分步计算示例
分步计算条件:Input_Data = 0xC1,POLY = 0xCB,Initial_Crc = 0xFF。


3. STM32的硬件CRC算法
虽然STM32上的CRC单元用起来很简单,但是它计算出来的结果与主流实例的CRC32算法有些不同,具体表现如下:

1) 每个字节的位序相反: STM32是按32位,高位在先,而主流实例每字节里面是从低位开始的;
2) 结果出来后,主流实例与0xffffffff异或了,而stm32f没有。


STM32 的硬件CRC单元是以32位的字为单位计算的,需要4字节对齐,32位字的字节顺序采用大端模式,在上位机验证时需要注意。

下面是经过验证的函数,和STM32硬件计算出来的结果一致。
  1. uint32_t stm32crc(uint32_t *ptr, uint32_t len)
  2. {
  3. ? ? uint32_t xbit, data;
  4. ? ? uint32_t crc32 = 0xFFFFFFFF;
  5. ? ? const uint32_t polynomial = 0x04c11db7;

  6. ? ? for(uint32_t i = 0; i < len; i ++)
  7. ? ? {
  8. ? ?? ???xbit = 1 << 31;
  9. ? ?? ???data = ptr[i];
  10. ? ?? ???for (uint32_t bits = 0; bits < 32; bits++)
  11. ? ?? ???{
  12. ? ?? ?? ?? ?if (crc32 & 0x80000000)
  13. ? ?? ?? ?? ?{
  14. ? ?? ?? ?? ?? ? crc32 <<= 1;
  15. ? ?? ?? ?? ?? ? crc32 ^= polynomial;
  16. ? ?? ?? ?? ?}
  17. ? ?? ?? ?? ?else
  18. ? ?? ?? ?? ?? ? crc32 <<= 1;

  19. ? ?? ?? ?? ?if (data & xbit)
  20. ? ?? ?? ?? ?? ? crc32 ^= polynomial;

  21. ? ?? ?? ?? ?xbit >>= 1;
  22. ? ?? ???}
  23. ? ? }
  24. ? ? return crc32;
  25. }
复制代码

4. 不同方式实现的C程序代码
包括4字节对齐算法,单字节算法,大小端转换代码。
游客,如果您要查看本帖隐藏内容请回复

运行结果:

0

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
沙发
发表于 2018-9-3 20:53:46 | 只看该作者
STM32的硬件CRC校验与主流的CRC32算法不同,需要好好研究一下。

0

主题

1

帖子

6

积分

新手上路

Rank: 1

积分
6
板凳
发表于 2018-11-19 14:00:18 | 只看该作者
参考参考 谢谢

0

主题

1

帖子

14

积分

新手上路

Rank: 1

积分
14
地板
发表于 2019-1-4 16:54:36 | 只看该作者
先谢楼主分享

0

主题

1

帖子

16

积分

新手上路

Rank: 1

积分
16
5#
发表于 2019-3-15 21:20:03 | 只看该作者
谢谢分享,辛苦了

0

主题

1

帖子

16

积分

新手上路

Rank: 1

积分
16
6#
发表于 2019-7-11 14:57:32 | 只看该作者
学习一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表