【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)
<p>这个CRC(循环冗余校验)在线计算比较方便,怎么发现的,不错</p>
页:
[1]