前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >M-Arch(雅特力M4)【AT-START-F425测评】No.04 CRC

M-Arch(雅特力M4)【AT-START-F425测评】No.04 CRC

作者头像
滚神大人
发布2022-06-09 21:07:34
4860
发布2022-06-09 21:07:34
举报
文章被收录于专栏:趣Python

前言

AT32F425支持硬件CRC(CRC32)。

跟GD32F450和STM32F4**相比,它有如下的特点:

  • 支持初始值自定义。
  • 支持输入数据按8,16,32位反转。
  • 支持输出数据反转。

这几个特点等价于它可以在有限的范围内自定义CRC了。

下图是之前文章中描述的0x34和0x00000034的CRC码计算过程,供想学习的同学一个参考。

0x34和0x00000034的CRC32计算过程

我曾经写过一篇解释CRC的文章,可以围观一把:史上解释CRC最清楚的文章

在线CRC网址:在线CRC[1]


AT32F425的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

上面标等号的是可自定义的部分。

代码

接口如下:

代码语言:javascript
复制
uint32_t crc_one_word_calculate(uint32_t data);
uint32_t crc_block_calculate(uint32_t *pbuffer, uint32_t length);

需要注意的是:

每次计算完crc后需要调用crc_data_reset复位寄存器,否则它会把上一次的值作为初始值。

测试过程比较简单:

代码语言:javascript
复制
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
#if defined(AT32)
    // crc_reverse_output_data_set(CRC_REVERSE_OUTPUT_DATA);
    // crc_reverse_input_data_set(CRC_REVERSE_INPUT_BY_BYTE);
    // crc_init_data_set(0);
    uint32_t crc_data = crc_one_word_calculate(data);    
    crc_data_reset();
#endif
#if defined(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
#if defined(AT32)
    printf("AT32: crc32 of 0x%X = 0x%X\r\n", data, crc_data);
#endif
#endif
}

不同情况下CRC的计算结果(输入值0xABCD1234):

配置

CRC

CRC-MPEG2(默认)

0xF7018A40

输入数据(BYTE)反转

0x49FC6721

输出数据反转

0x25180EF

初始值0x00000000

0x3005573B

初始值0xF0F0F0F0

0x9C6F4F19

测试结果

1秒打印一次。

CRC测试结果

参考资料

[1]

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 代码
  • 测试结果
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档