发新帖

ST STM32与国民n32g45x 硬件CRC32 非4字节倍数的校验方法

[复制链接]
1854 0

本文包含源代码、原理图、PCB、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ST STM32与国民n32g45x 硬件CRC32 非4字节倍数的校验方法
在使用ST STM32与国民n32g45x 硬件CRC32做校验的时候你可能遇到两个问题:



1、与很多在线CRC32的网站或者PC端的CRC32校验工具计算结果不一致!至于不一样的原因下面简单介绍一下


STM32与n32g45x CRC32校验码与PC工具不一致的原因是因为他们使用的CRC参数模型不一样,常用的参数模型如下表所示
  
CRC算法名称
  
多项式公式
WIDTH
POLY
INIT
XOROUT
REFIN
REFOUT
CRC-4/ITU
x4 + x + 1
4
03
00
00
TRUE
TRUE
CRC-5/EPC
x5 + x3 + 1
5
09
09
00
FALSE
FALSE
CRC-5/ITU
x5 + x4 + x2 + 1
5
15
00
00
TRUE
TRUE
CRC-5/USB
x5 + x2 + 1
5
05
1F
1F
TRUE
TRUE
CRC-6/ITU
x6 + x + 1
6
03
00
00
TRUE
TRUE
CRC-7/MMC
x7 + x3 + 1
7
09
00
00
FALSE
FALSE
CRC-8
x8 + x2 + x + 1
8
07
00
00
FALSE
FALSE
CRC-8/ITU
x8 + x2 + x + 1
8
07
00
55
FALSE
FALSE
CRC-8/ROHC
x8 + x2 + x + 1
8
07
FF
00
TRUE
TRUE
CRC-8/MAXIM
x8 + x5 + x4 + 1
8
31
00
00
TRUE
TRUE
CRC-16/IBM
x16 + x15 + x2 + 1
16
8005
0000
0000
TRUE
TRUE
CRC-16/MAXIM
x16 + x15 + x2 + 1
16
8005
0000
FFFF
TRUE
TRUE
CRC-16/USB
x16 + x15 + x2 + 1
16
8005
FFFF
FFFF
TRUE
TRUE
CRC-16/MODBUS
x16 + x15 + x2 + 1
16
8005
FFFF
0000
TRUE
TRUE
CRC-16/CCITT
x16 + x12 + x5 + 1
16
1021
0000
0000
TRUE
TRUE
CRC-16/CCITT-FALSE
x16 + x12 + x5 + 1
16
1021
FFFF
0000
FALSE
FALSE
CRC-16/X25
x16 + x12 + x5 + 1
16
1021
FFFF
FFFF
TRUE
TRUE
CRC-16/XMODEM
x16 + x12 + x5 + 1
16
1021
0000
0000
FALSE
FALSE
CRC-16/DNP
x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1
16
3D65
0000
FFFF
TRUE
TRUE
CRC-32
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 +  x + 1
32
04C1
  
1DB7
FFFF
  
FFFF
FFFF
  
FFFF
TRUE
TRUE
CRC-32/MPEG-2
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 +  x + 1
32
04C1
  
1DB7
FFFF
  
FFFF
0
FALSE
FALSE


STM32与n32g45x使用的CRC参数模型为CRC32-MPEG-2 而有些很多在线CRC32的网站或者PC端的CRC32校验工具使用的CRC参数模型为CRC-32,大家通过上表可以看下这两个模型的不一致的地方在REFIN REFOUT XOROUT,这三个参数,那么这三个参数是做什么的呢,我们接着看下表


  
参数名称
  
参数说明
  
WIDTH
  
宽度,即生成的CRC数据位宽,如CRC-8,生成的CRC为8位。
  
POLY
  
十六进制多项式,省略最高位1,如 x8 + x2 + x + 1,二进制为1 0000 0111,省略最高位1,转换为十六进制为0x07。
  
INIT
  
CRC初始值,和WIDTH位宽一致。
  
REFIN
  
true或false,在进行计算之前,原始数据是否翻转,如原始数据:0x34  = 0011 0100,如果REFIN为true,进行翻转之后为0010 1100 = 0x2c。
  
REFOUT
  
true或false,运算完成之后,得到的CRC值是否进行翻转,如计算得到的CRC值:0x97 = 1001 0111,如果REFOUT为true,进行翻转之后为11101001 = 0xE9。
  
XOROUT
  
计算结果与此参数进行异或运算后得到最终的CRC值,和WIDTH位宽一致。


通过这个表格可以直达这三个参数分别控制 输入数据是否翻转  输出数据是否翻转 输出数据是否异或,如果你使用的CRC校验工具参数模型比较全面,进行CRC校验的时候选择参数模型CRC32/MPEG-2,那么得到的结果是与STM32与n32g45x CRC校验结果一致的,到这么你应该明白为什么STM32与n32g45x CRC校验结果与很多在线CRC32的网站或者PC端的CRC32校验工具计算结果不一致了吧。原因就是,使用的参数模型不一致。这里我也推荐两个CRC模型非常全面的计算工具,如下图
image.png

image.png

这两个CRC校验工具 参数模型都是非常全面的 下载地址在下面附件
GCRC.zip (5.63 MB, 下载次数: 0)
CRC计算器 V1.2.zip (187.57 KB, 下载次数: 0)


2、ST STM32与国民n32g45x 硬件CRC32 只支持4字节的倍数校验,那么如果遇到非4字节倍数的数据怎么办呢。这里我封装了两个函数,大家可以直接使用,整体思路就是 先用自带的硬件CRC对4字节倍数的数据进行校验,然后将不足4字节倍数的数据通过软件算法补齐,这样就可以校验非4字节倍数的数据了。
2.1 crc32/mpeg2参数模型函数
函数是基于国民技术的n32g45x 写的 如果要用在STM32上 请修改相应的库函数和寄存器,下面贴出函数源码:

试读已结束,请付费阅读全文。您的付出将为创作者提供动力,持续输出优质文章。

  本文只能试读98%,付费后可阅读全文。 

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多

客服中心

微信扫描二维码 服务时间:周一至周日 8:30-22:00
快速回复 返回顶部 返回列表