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

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

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

GD32L233支持硬件CRC,超赞。

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

这有什么好处呢?

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

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%Xrn", data, crc_data);
#endif
#if defined(GD32)
    printf("GD32: crc32 of 0x%X = 0x%Xrn", data, crc_data);
#endif
#if defined(GD32M0)
    printf("GD32: crc32 of 0x%X = [32]0x%X [16]0x%X [8]0x%Xrn", data, crc_data[0], crc_data[1], crc_data[2]);
#endif
#endif
}

不同位数的计算结果对比:

数据CRC34893EA4F8123477227A2DABCD1234F7018A40000000340032C637 测试结果

1秒打印一次。

CRC测试结果
参考资料

[1]

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5715037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存