前言
GD32L233支持硬件CRC,超赞。
跟GD32F450相比,它可以支持计算7/8/16/32位的CRC校验码,而不仅仅是32位的校验码。
这有什么好处呢?
懂CRC的都知道,0x34和0x00000034的校验码是不一样的,这不仅仅是计算结果不一样,计算复杂度也不是一个等级的。
据说能看懂这个图的年薪只能到百万,-_-
我曾经写过一篇解释CRC的文章,可以围观一把:史上解释CRC最清楚的文章
在线CRC网址:在线CRC[1]
GD32L233的CRC是CRC32。
-
对应的标准是:CRC32/MPEG-2
-
多项式是:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1,即:0x04C11DB7
-
初始值是:0xFFFFFFFF
-
输入数据反转:false
-
输出数据反转:false
-
结果异或值是:0x00000000
这个在官方的用户手册上没有写,建议官方把它加上去。
代码
由于GD32L233的支持不同位的CRC码,所以它的接口不一样:
uint32_t crc_single_data_calculate(uint32_t sdata, uint8_t data_format)
GD32F450是:
uint32_t crc_single_data_calculate(uint32_t sdata)
需要注意的是:
每次计算完crc后需要调用crc_data_register_reset
复位寄存器。
测试过程比较简单:
static void crc_test(void)
{
#ifdef CRC_TEST
uint32_t data = 0xabcd1234;
#if defined(GD32) || defined(STM32)
uint32_t crc_data = crc_single_data_calculate(data);
crc_data_register_reset();
#endif
#if defined(GD32M0)
uint32_t crc_data[3];
crc_data[0] = crc_single_data_calculate(data, INPUT_FORMAT_WORD);
crc_data_register_reset();
crc_data[1] = crc_single_data_calculate(data, INPUT_FORMAT_HALFWORD);
crc_data_register_reset();
crc_data[2] = crc_single_data_calculate(data, INPUT_FORMAT_BYTE);
crc_data_register_reset();
#endif
#ifdef STM32
printf("STM32: crc32 of 0x%X = 0x%X\r\n", data, crc_data);
#endif
#if defined(GD32)
printf("GD32: crc32 of 0x%X = 0x%X\r\n", data, crc_data);
#endif
#if defined(GD32M0)
printf("GD32: crc32 of 0x%X = [32]0x%X [16]0x%X [8]0x%X\r\n", data, crc_data[0], crc_data[1], crc_data[2]);
#endif
#endif
}
不同位数的计算结果对比:
数据 | CRC |
---|---|
34 | 893EA4F8 |
1234 | 77227A2D |
ABCD1234 | F7018A40 |
00000034 | 0032C637 |
测试结果
1秒打印一次。
参考资料
[1]
在线CRC: http://www.ip33.com/crc.html
版权声明:本文为CSDN博主「趣Python」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HBYaAnn/article/details/122757823
暂无评论