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

    文章

    1038

    浏览量

    41257
  • STM32
    +关注

    关注

    2295

    文章

    11035

    浏览量

    366025
  • CRC校验
    +关注

    关注

    0

    文章

    84

    浏览量

    15635
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    求助,关于TC39x使用Fce_crc在特定PFlash范围内进行CRC32校验失败的问题求解

    我目前正在使用英飞凌在AURIX TC39x系列上提供的Fce_crc库对PFlash和DFlash区域执行CRC32校验。 虽然大多数地址区域返回成功结果,但我观察到在以下 PFlash 地址范围
    发表于 08-01 07:47

    第十八章 浅谈循环冗余校验(CRC)计算单元

    本篇文章介绍了CRC(循环冗余校验),其计算单元CRC-32多项式,32位数据寄存器,4个AHB时钟周期完成
    的头像 发表于 05-29 11:00 ?449次阅读
    第十八章 浅谈循环冗余<b class='flag-5'>校验</b>(<b class='flag-5'>CRC</b>)<b class='flag-5'>计算</b><b class='flag-5'>单元</b>

    想从linux系统读回CYC65215部件的配置程序映像,并检查其CRC是否正确(假设它有附加 CRC),图像有CRC吗?

    我想从 linux 系统读回 CYC65215 部件的配置程序映像,并检查其 CRC 是否正确(假设它有附加 CRC)。图像有 CRC 吗? CRC 是否使用标准多项式的已知算法生成?
    发表于 05-23 06:22

    并行CRC实现

    电子发烧友网站提供《并行CRC实现.pdf》资料免费下载
    发表于 05-20 17:26 ?0次下载

    CRC16-MODBUS+手算+移位运算+C程序+并行运算

    CRC16-MODBUS+手算+移位运算+C程序+并行运算
    发表于 04-22 18:23 ?0次下载

    求助,关于ad7616序列器模式+crc的两个问题求解

    是对的吗?并且这个crc我用所有数据代入得不到这个值。这个crc值应该怎么计算?软件序列器模式和硬件序列器模式都是一样的现象。有人能帮我解答吗?感谢支持!
    发表于 04-15 08:23

    基于Verilog语言实现CRC校验

    CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数
    的头像 发表于 03-24 10:36 ?1582次阅读
    基于Verilog语言实现<b class='flag-5'>CRC</b><b class='flag-5'>校验</b>

    STM32 SPI从机用DMA方式实现全双工,数据在传输过程中就会CRC校验失败,为什么?

    STM32配置成从机全双工,采用DMA方式,出现一个问题:当我把DMA方式配置成DMA_CIRCULAR后,数据在传输过程中就会CRC校验失败。 在完成上述相关配置后,在SPI初始化函数最后加上
    发表于 03-11 07:09

    求助,关于ADS125H02数据通讯格式及CRC校验问题求解

    of the initial data. 第1条,将所有数据“左移扩展为40bit,最右边用1补齐”,与传统的crc计算方法不一致,传统的计算方法是在数据末尾补8个0。是手册笔误还
    发表于 12-03 06:54

    ADS131B04-Q1 SPI通信时,为什么无法得到正常的CRC校验

    你好,我使用 ADS131B04 进行产品开发,使用遇到如下问题还请帮忙解答。谢谢。 1 . SPI 通信时 CRC 不清楚怎么使用,按如下方法使用时无法得到正常的CRC 校验
    发表于 11-22 06:40

    使用MSP430 MCU实现CRC

    电子发烧友网站提供《使用MSP430 MCU实现CRC.pdf》资料免费下载
    发表于 10-23 10:19 ?0次下载
    使用MSP430 MCU实现<b class='flag-5'>CRC</b>

    TAS5805内部的硬件CRC8对应标准的哪种? CRC校验的数据是offset和value值吗?

    TAS5805 内部的硬件 CRC8 对应标准的哪种? CRC 校验的数据是 offset 和 value 值吗?用 PPC 加载文件计算出来的值和在线
    发表于 10-12 06:19

    CRC实施

    电子发烧友网站提供《CRC实施.pdf》资料免费下载
    发表于 09-26 09:44 ?0次下载
    <b class='flag-5'>CRC</b>实施

    问一下各位大佬有关CRC的问题

    最近在写一个收发器的程序,用的是SPI通信。我看到上面说MOSI必须要有正确的CRC才会被接收,但这个CRC属实是没有看懂。 我看上面说,是将MOSI的5-31位进行CRC运算,然后 现在问题如下
    发表于 09-25 16:03

    C2000?器件CRC引擎

    电子发烧友网站提供《C2000?器件CRC引擎.pdf》资料免费下载
    发表于 08-30 10:38 ?1次下载
    C2000?器件<b class='flag-5'>中</b>的<b class='flag-5'>CRC</b>引擎