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

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

3天内不再提示

CRC校验 、STM32中CRC计算单元、 CRC应用

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-04 13:54 次阅读

从这一段时间后台反馈的问题可以看得出来,好些朋友对CRC没有什么概念,今天就在这里讲述一下关于CRC校验、STM32中CRC计算单元相关内容。

1关于CRC校验

CRC:Cyclic Redundancy Check,即循环冗余校验码。

CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

---来自百度百科

学电子、计算机相关专业的同学都应该学习过CRC的基础原理。其原理说难不难,可以说就是一个公式。同时,说简单也不简单,这个公式里面包含的内容不简单。

拿STM32参考手册中CRC计算单元来说,使用CRC-32(以太网)多项式: 0x4C11DB7

─ X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X4 + X2 + X +1

关于CRC基础原理的内容比较多,百度、谷歌一下可以看到很多关于CRC原理的内容,我这里就不再过多讲述。

参考维基百科循环冗余校验:

https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%86%97%E9%A4%98%E6%A0%A1%E9%A9%97

2

STM32中CRC计算单元

相信初学STM32的朋友都知道STM32中有个CRC计算单元,如果有不知道的去面壁思过(参考手册中目录一看就能看见CRC章节)。

但很多朋友都仅限知道有CRC计算单元这个东西,基本都没怎么进一步了解过。

STM32全系列产品都具有 CRC 外设(注意,是全系列都有), 对 CRC 的计算提供硬件支持,为应用程序节省了代码空间。

STM32的CRC(循环冗余校验)计算单元使用一个固定的多项式发生器从一个 32 位的数据字中产生 CRC 码。

在众多的应用中,基于 CRC 的技术还常用来验证数据传输或存储的完整性。

根据 EN/IEC60335-1 标准的规定,这些技术提供了验证 Flash 完整性的方法。 CRC 计算单元有助于在运行期间计算软件的签名,并将该签名与链接时生成并存储在指定存储单元的参考签名加以比较。

CRC 主要特性

使用 CRC-32 (以太网)多项式: 0x4C11DB7

— X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1

单输入/输出 32 位数据寄存器

CRC 计算在 4 个 AHB 时钟周期 (HCLK) 内完成

8 位通用寄存器 (可用于临时存储)

---来自STM32参考手册

输入/输出数据的反转

STM32默认不对输入数据和输出数据进行位反转。

1.对输入数据的位反转操作可以设置为按字节/半字 /字为单元进行操作。例如输入数据为 0x1A2B3C4D,

每个字节内逐位反转,结果是 0x58D43CB2

每半字内逐位反转,结果是 0xD458B23C

每个字长内逐位反转,结果是 0xB23CD458

2.对输出数据的位反转

例如输出数据为 0x11223344,反转后为 0x22CC4488

操作STM32的CRC比较简单,只有三个比较简单的寄存器,不管是使用寄存器,还是库函数,对于大部分人来说,没有多大难度。

看下标准库的部分函数源码:

3

CRC应用

我记得读书那个时候,想要把CRC搞明白好难啊,原因在于不知道学这个CRC到底有什么用途。

CRC用途其实非常广泛,我们最常见的就是在一些通信上,比如:Modbus:

再比如之前讲述的MAVLink通信协议:

CRC其主要目的就是验证数据的正确性。在CRC应用中,还有一个重要的作用:通过 CRC 校验对 FLASH 的完整性进行检查。

在对 FLASH 完整性检查的应用中,需要事先计算出整个 FLASH 的 CRC 校验值(不包括最后保存 CRC 值的字节),放在 FLASH 的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个 FLASH 的 CRC 校验值,然后与保存在 FLASH 末尾的 CRC 值进行比较。

这个对Flash添加CRC校验主要目的:在远程升级程序可有效检查程序的完整性。

在IAR EWARM中有这么一个功能:Checksum。不知道大家使用过没,也是可以对Flash添加CRC的功能。看下图:

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

    关注

    28

    文章

    737

    浏览量

    39746
  • STM32
    +关注

    关注

    2239

    文章

    10673

    浏览量

    348770
  • CRC校验
    +关注

    关注

    0

    文章

    81

    浏览量

    15030
收藏 人收藏

    评论

    相关推荐

    fpga报告crc故障是什么意思

    方法,通过对发送的数据进行计算并附加到数据末尾,接收方能够使用相同的校验算法来检测传输中的错误。CRC可以检测多种不同类型的错
    的头像 发表于 01-04 11:06 455次阅读

    CRC校验原理及其软件实现

    电子发烧友网站提供《CRC校验原理及其软件实现.pdf》资料免费下载
    发表于 11-16 10:11 0次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>原理及其软件实现

    如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验

    在运行过程中使用MCU内嵌的CRC硬件模块计算对应代码区域的CRC校验码,并和之前存储的CRC校验
    的头像 发表于 10-27 11:49 868次阅读
    如何在IAR Embedded Workbench中配置生成对应代码区域的<b class='flag-5'>CRC</b><b class='flag-5'>校验</b>码

    奇偶校验crc校验的区别 CRC校验和奇偶校验之间有什么关系?

    奇偶校验crc校验的区别 CRC校验和奇偶校验之间有什么关系? 奇偶
    的头像 发表于 10-17 16:28 2466次阅读

    N32G45x硬件CRC计算Modbus的CRC16

    以前都是使用软件CRC,浪费计算时间,有硬件CRC不用,真是可惜。本次使用硬件CRC对ModBus的CRC进行
    的头像 发表于 10-16 15:01 573次阅读
    N32G45x硬件<b class='flag-5'>CRC</b><b class='flag-5'>计算</b>Modbus的<b class='flag-5'>CRC</b>16

    STM32 CRC使用详解

    电子发烧友网站提供《STM32 CRC使用详解.pdf》资料免费下载
    发表于 09-19 14:58 3次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>CRC</b>使用详解

    labview比较齐的CRC校验模式

    支持各种CRC校验模式,VI附带算法截图,有兴趣的可以研究拓展
    发表于 09-13 16:37 13次下载

    STM32F3 CRC计算单元

    基于CRC的技术用于验证数据完整性(通信) •在功能安全标准(如EN/IEC 60335-1)CRC外围设备 提供了一种验证嵌入式闪存完整性的方法 •单输入/输出32位数据寄存器,但可处理
    发表于 09-12 08:20

    STM32F0 CRC计算单元介绍

    继续,而不在应用程序重新启动( 优先级更高的中断、多次CRC计算等)  每次 应用CRC重置,默认值为0xFFFF_FFFF以保持 与STM32
    发表于 09-12 08:07

    TSMaster中如何自定义CRC校验算法

    在通讯过程中,用户需要利用CheckSum信号对传输数据用自己规定的算法逻辑进行校验,来看数据在传输过程中是否被更改或传输错误。本文主要介绍TSMaster如何设置自己的CRC算法信号。CRC相关
    的头像 发表于 09-09 08:23 999次阅读
    TSMaster中如何自定义<b class='flag-5'>CRC</b><b class='flag-5'>校验</b>算法

    GD32VF103片内CRC单元的应用方法

    详述,请读者查阅相关资料或文献进行学习。 GD32VF103的计算单元 GD32VF103的CRC计算单元使用固定多项式
    发表于 08-16 07:13

    CRC校验码的多种Verilog实现方式

    CRC循环冗余校验码(Cyclic Redundancy Check),检错码。
    的头像 发表于 06-21 15:03 2998次阅读
    <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>码的多种Verilog实现方式

    GD32开发实战指南(基础篇) 第18章 CRC校验

    循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一32位全字的CRC计算结果。
    的头像 发表于 05-19 20:32 3330次阅读
    GD32开发实战指南(基础篇) 第18章 <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>

    CRC校验的问题

    uwExpectedCRCValue_4 = 0x00000026; /* Fourth byte stream CRC */ 我不知道这个校验码是怎么得来的?网上下了好多CRC计算
    发表于 05-11 12:46

    Modbus RTU CRC校验值怎么计算呢?

    Modbus RTU CRC校验详细步骤?CRC值怎么计算
    发表于 05-05 16:05