打印
[CW32F030系列]

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

[复制链接]
662|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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具有更明显的优势。


附件
软件工程源代码: Template.zip (7.05 MB)

使用特权

评论回复
沙发
primojones| | 2022-7-24 21:51 | 只看该作者
计算的速度怎么样   

使用特权

评论回复
板凳
onlycook| | 2022-8-4 11:03 | 只看该作者
不管从代码量,还是执行速度上来说,硬件CRC具有更明显的优势。

使用特权

评论回复
地板
sanxingnote7| | 2022-8-18 18:20 | 只看该作者
32位的CRC效果怎么样   

使用特权

评论回复
5
geraldbetty| | 2022-8-18 18:53 | 只看该作者
如何并发运行CRC呢?   

使用特权

评论回复
6
robertesth| | 2022-8-20 12:58 | 只看该作者
可以使用查表的算法。

使用特权

评论回复
7
sanfuzi| | 2022-8-20 14:31 | 只看该作者
现在有crc库可以调用  

使用特权

评论回复
8
vivilyly| | 2022-8-20 19:42 | 只看该作者
32位的CRC可以吗     

使用特权

评论回复
9
mickit| | 2022-9-7 20:30 | 只看该作者
硬件方式是如何实现的?

使用特权

评论回复
10
nomomy| | 2022-9-8 09:48 | 只看该作者
计算的速度还可以吗   

使用特权

评论回复
11
mollylawrence| | 2022-9-8 12:38 | 只看该作者
用软件实现CRC最多了。   

使用特权

评论回复
12
朝生| | 2022-9-8 14:19 | 只看该作者
硬件CRC和软件CRC最大区别是什么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司资深现场应用工程师
简介:诚信·承诺·创新·合作

67

主题

2995

帖子

29

粉丝