MM32F0140学习笔记——CRC

crc校验(循环冗余校验error correcting code)是数据通讯中最常采用的校验方式之一,它是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误,它是利用除法及余数的原理来作错误侦测的。
mm32f0140系列mcu带有一个硬件crc计算单元,它采用一个固定的多项式发生器来计算8位、16位或者是32位数据的crc校验值,对数据传输或数据存储的一致性、完整性进行验证。
主要特性如下所示:
● 固定计算多项式 0x04c11db7:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
● 支持8、16、32位宽的数据输入寄存器、32位宽的数据输出寄存器
● 硬件计算时间为3个hclk周期
● 带有可存放中间计算过程的32位宽的数据寄存器
● 支持crc-32和crc-32/mpeg-2两种算法
● 支持输入数据和输出数据的大小端选择
功能框图
硬件crc计算操作步骤
step1、使能crc模块时钟,并复位crc模块
step2、配置crc_cr寄存器,选择crc-32或者crc-32/mpeg-2算法,配置输入数据位宽为8位、16位或者是32位,选择输入、输出数据的大小端
step3、通过配置crc控制寄存器的rst位,将crc恢复到初始状态
step4、依次将数据写入crc数据寄存器中,mcu自动完成crc计算过程
step5、读取crc数据寄存器,得到crc计算结果
硬件crc示例程序
/* 使能crc模块时钟,并复位crc模块 */
rcc->ahbenr |= rcc_ahbenr_crc;rcc->ahbrstr |= rcc_ahbenr_crc;rcc->ahbrstr = ~rcc_ahbenr_crc;  
/* 配置输入输出数据跟随mcu小端,输入数据选择32位宽,使用crc-32/mpeg-2算法 */
crc->cr = 0;  
/* 将crc恢复到初始状态 */
crc->cr |= crc_cr_reset;  
/* 计算crc */
for(uint8_t i = 0; i dr = buffer[i];}  
/* 读取crc计算结果 */
return crc->dr;  
软件crc的实现是将硬件crc的计算过程用软件代码的形式体现出来,通过mcu运行功能代码实现crc的计算过程,与硬件crc相比,需要根据多项式产生crc表,在计算过程中还需要考虑数据的大小端选择等参数,实现过程相比硬件crc要复杂很多、计算速度相比硬件crc要慢很多。
软件crc示例程序
/* 根据多项式产生查表数据 */
void crc_mpeg2_generatecrctable(void){ uint32_t i = 0, j = 0, data = 0, temp = 0; for(i = 0; i < 256; i++) { data = 0; temp = (i << 24); for(j = 0; j < 8; j++) { if((data ^ temp) 0x80000000) { data = ( data << 1 ) ^ 0x04c11db7; } else { data <<= 1; } temp <<= 1; } crc_mpeg2_table[i] = data; }}  
/* 大小端处理 */
uint32_t crc_mpeg2_swapendian(uint32_t data){ return (((data << 24) 0xff000000) | ((data 8) 0x0000ff00) | ((data >> 24) 0x000000ff));}  
/* 软件crc计算过程 */
uint32_t crc_mpeg2_calccrc(uint32_t *buffer, uint16_t length){ uint8_t i = 0; uint32_t temp = 0, result = 0xffffffff; uint32_t *pdata; /* dynamic generate crc-32/mpeg-2 table */ crc_mpeg2_generatecrctable(); while(length--) { temp = crc_mpeg2_swapendian(*buffer++); pdata = temp; for(i = 0; i < 4; i++) { result = (result 24) ^ *((uint8_t *)pdata + i)) 0xff]; } } return result;}  
对于同一组32位114个数值数据分别进行软件crc和硬件crc计算,在不考虑软件crc自动生成查表数据所消耗时间的情况下,软件crc与硬件crc在运算执行时间对比如下图所示:
软件crc相比于硬件crc在执行速度上最少有5倍的差距,软件crc的代码量以及占用sram的空间也比硬件crc要多;所以在mcu带有硬件crc功能时,通过硬件crc的计算方式可以大大节省mcu的资源、提升crc的运算速度,给实际应用带来流畅的检验。
来源:灵动mm32mcu


eUSB2设计注意事项及如何在先进工艺节点中实现应用
2.4G频段的SI24R2E无线单发芯片技术问答,常见问题进行汇总解答
单芯片集成的优势
雷恩大通孔多圈绝对值编码器的特点
实用集成稳压电源
MM32F0140学习笔记——CRC
6.7英寸+8000万+麒麟990,华为手机具有与众不同的魅力
一文简述陶瓷3D打印技术
人工智能的恶意用途:预测、预防和缓解
区块链终端技术将颠覆全球对冲基金行业
p对p兼容AM26LS31、DS26C31的驱动器MS2374
RFID作为物联网发展的最关键技术 为何迟迟不应用在家电上?
温度传感器的类型有哪些
美国敦促台积电在本土生产军用芯片
基于Labview的光伏发电数据监测系统设计
工业机器人远程监控运维物联网解决方案
高频机比工频机好的方面
华景传感科技(无锡)有限公司发生工商变更
ABB提供GIS技术支持 提高长距离输电能力
IM2603芯片 IM2603Typec扩展坞电源管理芯片