M-Arch(番外5)GD32L233评测-CRC(附 史上解释CRC最清楚的文章)

文章目录[隐藏]

前言

GD32L233支持硬件CRC,超赞。

跟GD32F450相比,它可以支持计算7/8/16/32位的CRC校验码,而不仅仅是32位的校验码。

这有什么好处呢?

懂CRC的都知道,0x34和0x00000034的校验码是不一样的,这不仅仅是计算结果不一样,计算复杂度也不是一个等级的。

e2170895339b12d4a929336c3eb663df.png

0x34和0x00000034的CRC32计算过程

据说能看懂这个图的年薪只能到百万,-_-

我曾经写过一篇解释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秒打印一次。

ebf07e5a11c9528b5cfb018d5f3e13b6.gif

CRC测试结果
aaa88221498d136e8a8cd54ebae77219.gif
ab5f86ffcde06e0e12a4863cf3eef2d8.png
46855393c2eb5f1b5ba72d6b22da013a.gif

参考资料

[1]

在线CRC: http://www.ip33.com/crc.html

版权声明:本文为CSDN博主「趣Python」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HBYaAnn/article/details/122757823

生成海报
点赞 0

趣Python

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

全国一等奖,H题:用电器分析识别装置

大家好,我是张巧龙,今天继续给大家带来电赛题目:用电器分析识别装置。 01    视频展示 【全国一等奖】21年电赛H题:用电器分析识别装置02    方案设计 2.1  系统总体方案 通

时隔10年,STM32标准外设库再次升级

关注星标公众号,不错过精彩内容作者 | strongerHuang微信公众号 | strongerHuang有一个读者问了我这样一个问题:能请教一个问题吗,就是STM32F071的PORTE端口怎么用&

定时器触发STM32 ADC的采样转换示例

开发板:STM32F446 Nucleo开发板IDE:  keil MDK初始化配置工具:stm32cubeMx例程内容:通过定时器触发ADC规则通道及注入通道的模数转换工作。下面基于STM32CubeMx进行些必要