0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MM32F0140系列MCU软硬件CRC示例程序

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-08-04 17:38 次阅读

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两种算法

支持输入数据和输出数据的大小端选择

功能框图

f165370a-13d8-11ed-ba43-dac502259ad0.png

硬件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_ti=0;i< length; i++)
{
    CRC->DR=buffer[i];
}

/* 读取CRC计算结果 */

returnCRC->DR;

软件CRC的实现是将硬件CRC的计算过程用软件代码的形式体现出来,通过MCU运行功能代码实现CRC的计算过程,与硬件CRC相比,需要根据多项式产生CRC表,在计算过程中还需要考虑数据的大小端选择等参数,实现过程相比硬件CRC要复杂很多、计算速度相比硬件CRC要慢很多。

软件CRC示例程序

/* 根据多项式产生查表数据 */

voidCRC_MPEG2_GenerateCRCTable(void)
{
uint32_ti=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_tCRC_MPEG2_SwapEndian(uint32_tdata)
{
return(((data<< 24)&0xFF000000)|
((data<<  8)&0x00FF0000)|
((data>>8)&0x0000FF00)|
((data>>24)&0x000000FF));
}

/* 软件CRC计算过程 */

uint32_tCRC_MPEG2_CalcCRC(uint32_t*Buffer,uint16_tLength)
{
uint8_ti=0;
uint32_tTemp=0,Result=0xFFFFFFFF;
uint32_t*pData;

/*DynamicgenerateCRC-32/MPEG-2table*/

CRC_MPEG2_GenerateCRCTable();

while(Length--)
{
Temp=CRC_MPEG2_SwapEndian(*Buffer++);
pData=&Temp;

for(i=0;i< 4;i++)
{
Result=(Result<< 8)^CRC_MPEG2_Table[((Result>>24)^*((uint8_t*)pData+i))&0xFF];
}
}

returnResult;
}

对于同一组32位114个数值数据分别进行软件CRC和硬件CRC计算,在不考虑软件CRC自动生成查表数据所消耗时间的情况下,软件CRC与硬件CRC在运算执行时间对比如下图所示:

f18a1228-13d8-11ed-ba43-dac502259ad0.pngf1b5df7a-13d8-11ed-ba43-dac502259ad0.png

软件CRC相比于硬件CRC在执行速度上最少有5倍的差距,软件CRC的代码量以及占用SRAM的空间也比硬件CRC要多;所以在MCU带有硬件CRC功能时,通过硬件CRC的计算方式可以大大节省MCU的资源、提升CRC的运算速度,给实际应用带来流畅的检验。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350979
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120230
  • crc
    crc
    +关注

    关注

    0

    文章

    199

    浏览量

    29461
  • MM32
    +关注

    关注

    1

    文章

    106

    浏览量

    756

原文标题:灵动微课堂 (第225讲) | MM32F0140学习笔记——CRC

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    灵动微电子发布全新超值型MM32F0140系列MCU

    MM32F0140 系列 MCU 适用于各类汽车,工业和消费市场,其典型应用包括电池管理、电梯外呼板、断路器、消防、车载诊断仪、照明等。
    发表于 11-16 09:24 1905次阅读
    灵动微电子发布全新超值型<b class='flag-5'>MM32F0140</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b>

    基于MM32F0140系列MCU实现UDS Bootloader的设计

    1、使用MM32F0140系列MCU实现UDS Bootloader  MM32F0140 使用高性能的 Arm®Cortex-M0 内核的 32 位微控制器,最高工作频率可达 72M
    发表于 09-15 16:35

    AN0052从MM32F0130移植到MM32F0140(英文版)

    AN0052 从MM32F0130移植到MM32F0140(英文版)
    发表于 02-22 18:43 0次下载
    AN0052从<b class='flag-5'>MM32F</b>0130移植到<b class='flag-5'>MM32F0140</b>(英文版)

    MM32F0140 产品手册(中文版)

    MM32F0140 产品手册(中文版)
    发表于 02-22 18:45 0次下载
    <b class='flag-5'>MM32F0140</b> 产品手册(中文版)

    MM32F0140 产品手册(英文版)

    MM32F0140 产品手册(英文版)
    发表于 02-22 18:45 0次下载
    <b class='flag-5'>MM32F0140</b> 产品手册(英文版)

    MM32F0140 用户手册(中文版)

    MM32F0140 用户手册(中文版)
    发表于 02-22 18:46 0次下载
    <b class='flag-5'>MM32F0140</b> 用户手册(中文版)

    MM32F0140 用户手册(英文版)

    MM32F0140 用户手册(英文版)
    发表于 02-22 18:46 0次下载
    <b class='flag-5'>MM32F0140</b> 用户手册(英文版)

    MM32F0140 勘误表(中文版)

    MM32F0140 勘误表(中文版)
    发表于 02-22 18:47 0次下载
    <b class='flag-5'>MM32F0140</b> 勘误表(中文版)

    MM32F0140 勘误表(英文版)

    MM32F0140 勘误表(英文版)
    发表于 02-22 18:48 0次下载
    <b class='flag-5'>MM32F0140</b> 勘误表(英文版)

    基于MM32F0140的UDS Bootloader学习笔记

    基于MM32F0140的UDS Bootloader学习笔记
    的头像 发表于 10-30 17:11 766次阅读
    基于<b class='flag-5'>MM32F0140</b>的UDS Bootloader学习笔记

    MM32F0140学习笔记——CRC

    MM32F0140学习笔记——CRC
    的头像 发表于 11-10 18:27 607次阅读
    <b class='flag-5'>MM32F0140</b>学习笔记——<b class='flag-5'>CRC</b>

    MM32F0140 SPI学习笔记

    MM32F0140 SPI学习笔记
    的头像 发表于 09-26 16:51 592次阅读
    <b class='flag-5'>MM32F0140</b> SPI学习笔记

    MM32F0140 DMA学习笔记

    MM32F0140 DMA 学习笔记
    的头像 发表于 09-18 16:57 703次阅读
    <b class='flag-5'>MM32F0140</b> DMA学习笔记

    MM32F0140 UART学习笔记

    MM32F0140 UART学习笔记
    的头像 发表于 09-26 16:45 755次阅读
    <b class='flag-5'>MM32F0140</b> UART学习笔记

    MM32F0140 GPIO学习笔记

    MM32F0140 GPIO学习笔记
    的头像 发表于 09-26 16:42 551次阅读
    <b class='flag-5'>MM32F0140</b> GPIO学习笔记