[CW32F030系列] 【CW32F030CxTx StartKit测评】06.软硬件方式计算CRC结果进行对比

[复制链接]
 楼主| xld0932 发表于 2022-7-16 10:35 | 显示全部楼层 |阅读模式
<
本帖最后由 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算法模式
3.png


软硬件方式计算CRC结果进行对比
软件计算CRC的方式我们使用开源的CRC Library来实现,它支持CRC-8、CRC-16和CRC-32的计算,可以通过宏定义在crc_cfg.h文件中修改多项式、初始值等宏定义,以达到支持所有的CRC校验算法,可以通过https://gitee.com/qiyongzhong0/crclib去下载最新的开源程序代码。
1.png

下面我们参考官方的示例程序功能,先将CRC Library添加到工程文件中,编写基于MCU硬件的CRC计算和基于CRC Library的CRC计算,将其结果打印出来进行对比,程序和运行结果如下所示:
  1. void CRC_Init(void)
  2. {
  3.     uint8_t  Raw08[8] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
  4.     uint16_t Raw16[4] = {0x1100, 0x3322, 0x5544, 0x7766};
  5.     uint32_t Raw32[2] = {0x33221100, 0x77665544};

  6.     RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_CRC, ENABLE);

  7.     printf("\r\nCRC16_Calc_8bit   : 0x%x", CRC16_Calc_8bit (CRC16_IBM, Raw08, 8));
  8.     printf("\r\nCRC16_Calc_16bit  : 0x%x", CRC16_Calc_16bit(CRC16_IBM, Raw16, 4));
  9.     printf("\r\nCRC16_Calc_32bit  : 0x%x", CRC16_Calc_32bit(CRC16_IBM, Raw32, 2));

  10.     crc16_table_init();
  11.     printf("\r\n");
  12.     printf("\r\ncrclib->crc16_cal : 0x%x", crc16_cal(Raw08, 8));
  13.     printf("\r\n");

  14.     printf("\r\nCRC32_Calc_8bit   : 0x%x", CRC32_Calc_8bit (CRC32_DEFAULT, Raw08, 8));
  15.     printf("\r\nCRC32_Calc_16bit  : 0x%x", CRC32_Calc_16bit(CRC32_DEFAULT, Raw16, 4));
  16.     printf("\r\nCRC32_Calc_32bit  : 0x%x", CRC32_Calc_32bit(CRC32_DEFAULT, Raw32, 2));

  17.     crc32_table_init();
  18.     printf("\r\n");
  19.     printf("\r\ncrclib->crc32_cal : 0x%x", crc32_cal(Raw08, 8));
  20.     printf("\r\n");
  21. }


运行结果
2.png


总结
通过如上的CRC示例,我们发现MCU计算CRC时只需要配置好CRC的算法模式,然后把数据依次填入到CRC数据寄存器中,MCU会自动完成CRC计算,最后通过读取CRC结果寄存器得到计算结果,整个计算过程十分便捷;而基于CRC Library实现的软件计算CRC的方式首先需要根据多项式先产生一个映射表,然后通过查表的方式将需要计算的数据一个个叠加计算,得到最终结果。通过这两个计算方式的过程我们可以看出软件CRC方式全程需要MCU参与计算,相比于MCU的硬件CRC方式对于软件的开销更大,不管从代码量,还是执行速度上来说,硬件CRC具有更明显的优势。


附件
软件工程源代码: Template.zip (7.05 MB, 下载次数: 14)
primojones 发表于 2022-7-24 21:51 | 显示全部楼层
计算的速度怎么样   
onlycook 发表于 2022-8-4 11:03 来自手机 | 显示全部楼层
不管从代码量,还是执行速度上来说,硬件CRC具有更明显的优势。
sanxingnote7 发表于 2022-8-18 18:20 | 显示全部楼层
32位的CRC效果怎么样   
geraldbetty 发表于 2022-8-18 18:53 | 显示全部楼层
如何并发运行CRC呢?   
robertesth 发表于 2022-8-20 12:58 | 显示全部楼层
可以使用查表的算法。
sanfuzi 发表于 2022-8-20 14:31 | 显示全部楼层
现在有crc库可以调用  
vivilyly 发表于 2022-8-20 19:42 | 显示全部楼层
32位的CRC可以吗     
mickit 发表于 2022-9-7 20:30 | 显示全部楼层
硬件方式是如何实现的?
nomomy 发表于 2022-9-8 09:48 | 显示全部楼层
计算的速度还可以吗   
mollylawrence 发表于 2022-9-8 12:38 | 显示全部楼层
用软件实现CRC最多了。   
朝生 发表于 2022-9-8 14:19 | 显示全部楼层
硬件CRC和软件CRC最大区别是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部