韵湖葱白 发表于 2022-4-22 20:02

【AT-START-F425测评】No.04 CRC


## 前言

AT32F425支持硬件CRC(CRC32)。

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

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

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

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

!(https://s2.loli.net/2022/04/22/jJHZ4RI2EQSz6FY.jpg)

我曾经写过一篇解释CRC的文章,可以围观一把:[史上解释CRC最清楚的文章](https://mp.weixin.qq.com/s/DbAdErPmk6dv_nS_w6-ASQ)

在线CRC网址:[在线CRC](http://www.ip33.com/crc.html)

---

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

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

## 代码

接口如下:

```
uint32_t crc_one_word_calculate(uint32_t data);
uint32_t crc_block_calculate(uint32_t *pbuffer, uint32_t length);
```

需要注意的是:

**每次计算完crc后需要调用`crc_data_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;
    crc_data = crc_single_data_calculate(data, INPUT_FORMAT_WORD);
    crc_data_register_reset();
    crc_data = crc_single_data_calculate(data, INPUT_FORMAT_HALFWORD);
    crc_data_register_reset();
    crc_data = 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 = 0x%X 0x%X 0x%X\r\n", data, crc_data, crc_data, crc_data);
#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秒打印一次。

!(https://s2.loli.net/2022/04/22/Hhyv7gVxF9PuAKU.gif)

![](https://s2.loli.net/2022/03/28/xnJPMjvEfwHs1IS.gif)

Jacktang 发表于 2022-4-24 07:31

<p>这个CRC(循环冗余校验)在线计算比较方便,怎么发现的,不错</p>
页: [1]
查看完整版本: 【AT-START-F425测评】No.04 CRC