AT32F425支持硬件CRC(CRC32)。
跟GD32F450和STM32F4**相比,它有如下的特点:
这几个特点等价于它可以在有限的范围内自定义CRC了。
下图是之前文章中描述的0x34和0x00000034的CRC码计算过程,供想学习的同学一个参考。
0x34和0x00000034的CRC32计算过程
我曾经写过一篇解释CRC的文章,可以围观一把:史上解释CRC最清楚的文章
在线CRC网址:在线CRC[1]
AT32F425的CRC是CRC32。
上面标等号的是可自定义的部分。
接口如下:
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[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