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

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

3天内不再提示

MM32F0140学习笔记——CRC

jf_pJlTbmA9 来源:灵动MM32MCU 作者:灵动MM32MCU 2023-11-10 18:27 次阅读

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

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

功能框图

wKgaomUD4JKAFVSQAAEn72HmVwI508.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_t i = 0; i < length; i++)
{
    CRC->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)   0x00FF0000) | 
            ((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 << 8) ^ CRC_MPEG2_Table[((Result >> 24) ^ *((uint8_t *)pData + i))   0xFF];
        }
    }

    return Result;
}

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

wKgZomUD4JeAG8iyAAJmH3SJpTs854.png
wKgZomUD4JmAL7NUAAE548VaYWo659.png

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

来源:灵动MM32MCU

审核编辑:汤梓红

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

    关注

    146

    文章

    16977

    浏览量

    350215
  • 寄存器
    +关注

    关注

    31

    文章

    5308

    浏览量

    119978
  • crc
    crc
    +关注

    关注

    0

    文章

    199

    浏览量

    29432
收藏 人收藏

    评论

    相关推荐

    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> 勘误表(英文版)

    AN0051 从MM32F031移植到MM32F0140(英文版)

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

    基于MM32F0140的UDS Bootloader学习笔记

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

    MM32F0140学习笔记——窗口看门狗(WWDG)

    MM32F0140学习笔记——窗口看门狗(WWDG)
    的头像 发表于 10-27 09:45 583次阅读
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——窗口看门狗(WWDG)

    MM32F0140学习笔记——FlexCAN 控制器局域网

    MM32F0140学习笔记——FlexCAN 控制器局域网
    的头像 发表于 10-27 09:25 1416次阅读
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——FlexCAN 控制器局域网

    MM32F0140 SPI学习笔记

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

    MM32F0140 DMA学习笔记

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

    MM32F0140 UART学习笔记

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

    MM32F0140 GPIO学习笔记

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