本帖最后由 xld0932 于 2022-7-16 10:38 编辑
循环冗余校验(CRC)主要应用于核实数据传输或数据存储的正确性和完整性。CW32F030系列MCU内部集成了CRC计算单元,支持多种CRC算法对输入数据进行CRC计算。平常项目中像Modbus通讯、Xmodem协议传输、以及以太网通讯等等都少不CRC计算,应用场合特别多;所以对于MCU中支持的CRC功能在软件层面极大的降低了软件的处理时间和工作量,同时可靠的保证了运算结果的执行速度和正确性。
主要特性 - 3种输入数据位宽:8-bit、16-bit、32-bit
- 3种多项式:
- CRC-16多项式1:X16+X15+X2+1
- CRC-16多项式2:X16+X12+X5+1
- CRC-32多项式:X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1
- 10种常用的算法:基于多项式、初始值、结果异或值、输入/输出反转的组合
CW32F030支持的CRC算法模式
软硬件方式计算CRC结果进行对比 软件计算CRC的方式我们使用开源的CRC Library来实现,它支持CRC-8、CRC-16和CRC-32的计算,可以通过宏定义在crc_cfg.h文件中修改多项式、初始值等宏定义,以达到支持所有的CRC校验算法,可以通过https://gitee.com/qiyongzhong0/crclib去下载最新的开源程序代码。
下面我们参考官方的示例程序功能,先将CRC Library添加到工程文件中,编写基于MCU硬件的CRC计算和基于CRC Library的CRC计算,将其结果打印出来进行对比,程序和运行结果如下所示: void CRC_Init(void)
{
uint8_t Raw08[8] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
uint16_t Raw16[4] = {0x1100, 0x3322, 0x5544, 0x7766};
uint32_t Raw32[2] = {0x33221100, 0x77665544};
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_CRC, ENABLE);
printf("\r\nCRC16_Calc_8bit : 0x%x", CRC16_Calc_8bit (CRC16_IBM, Raw08, 8));
printf("\r\nCRC16_Calc_16bit : 0x%x", CRC16_Calc_16bit(CRC16_IBM, Raw16, 4));
printf("\r\nCRC16_Calc_32bit : 0x%x", CRC16_Calc_32bit(CRC16_IBM, Raw32, 2));
crc16_table_init();
printf("\r\n");
printf("\r\ncrclib->crc16_cal : 0x%x", crc16_cal(Raw08, 8));
printf("\r\n");
printf("\r\nCRC32_Calc_8bit : 0x%x", CRC32_Calc_8bit (CRC32_DEFAULT, Raw08, 8));
printf("\r\nCRC32_Calc_16bit : 0x%x", CRC32_Calc_16bit(CRC32_DEFAULT, Raw16, 4));
printf("\r\nCRC32_Calc_32bit : 0x%x", CRC32_Calc_32bit(CRC32_DEFAULT, Raw32, 2));
crc32_table_init();
printf("\r\n");
printf("\r\ncrclib->crc32_cal : 0x%x", crc32_cal(Raw08, 8));
printf("\r\n");
}
运行结果
总结 通过如上的CRC示例,我们发现MCU计算CRC时只需要配置好CRC的算法模式,然后把数据依次填入到CRC数据寄存器中,MCU会自动完成CRC计算,最后通过读取CRC结果寄存器得到计算结果,整个计算过程十分便捷;而基于CRC Library实现的软件计算CRC的方式首先需要根据多项式先产生一个映射表,然后通过查表的方式将需要计算的数据一个个叠加计算,得到最终结果。通过这两个计算方式的过程我们可以看出软件CRC方式全程需要MCU参与计算,相比于MCU的硬件CRC方式对于软件的开销更大,不管从代码量,还是执行速度上来说,硬件CRC具有更明显的优势。
附件 |