在GD32VF103内部有一个CRC(循环冗余校验计算单元),使用它可以对数据的完整性和正确性进行校验,比如固件的完整性和正确性校验、通信数据的校验等。它使用固定的32位多项式:0x4C11DB7: X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1 。该 32 位 CRC 多项式与以太网 CRC 计算多项式相同。
CRC的寄存器只有三个:数据寄存器、独立数据寄存器、控制寄存器。
数据寄存器接收输入数据并保存计算结果。
独立数据寄存器是一个独立的数据存储单元,可以作为临时寄存器使用。
控制寄存器用来复位数据寄存器。
第一次使用这个CRC发现它计算的结果跟网上在线计算器算出的结果不一样,目前知道的原因有两个,一是数据反转,有些算法会将输入数据和输出数据反转,而芯片内部的CRC没有这些操作。CRC-32有多种计算方法,这个CRC-32/MPEG-2与本芯片的CRC计算方法是一样的,都没有反转。
二是计算顺序,网上的工具对输入的数据计算方向都是从左到右,而芯片内部的计算方向是从32位的高位字节到低位字节(大端)。
所以要得到相同的结果,其中一方必须做出调整。这里以hello world为例来看看计算结果,代码中初始化它是这样的
在程序中存储是这样的
计算crc的时候一次放入32位,从高位开始算,最后的计算序列是llehow o\0dlr。
将这个序列放到网络计算器计算的确可以得到相同的结果,这里有个字符串结束标志\0,ASCII没有办法输入,所以使用hex方式。
对于低于32位的数据,芯片的CRC会在高位补0,而网络计算器计算的时候也必须补足32位。下面是计算字符’!‘得到的结果。
芯片CRC:
网络计算器:
这里不补0是不行的,目前还没有搞清楚网络计算器关于少于32位的数据是怎么计算的,补0和补1都不对。
搞清楚了芯片的CRC怎么算的,那应用起来就没问题了。以后在设计OTA升级或者数据通信的时候就可以用上了。
bilibili:科G栈
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)