GD32L233支持硬件CRC,超赞。
跟GD32F450相比,它可以支持计算7/8/16/32位的CRC校验码,而不仅仅是32位的校验码。
这有什么好处呢?
懂CRC的都知道,0x34和0x00000034的校验码是不一样的,这不仅仅是计算结果不一样,计算复杂度也不是一个等级的。
据说能看懂这个图的年薪只能到百万,-_-
我曾经写过一篇解释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 }
不同位数的计算结果对比:
1秒打印一次。
[1]
在线CRC: http://www.ip33.com/crc.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)