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

    文章

    1073

    浏览量

    41868
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371116
  • CRC校验
    +关注

    关注

    0

    文章

    84

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯源的CRC硬件计算谁用过吗?MCU的CRC你们喜欢用硬件的还是软件的啊?

    芯源的CRC硬件计算谁用过吗?MCU的CRC你们喜欢用硬件的还是软件的啊?
    发表于 12-01 08:25

    AS32系列MCU芯片中CRC计算模块的应用介绍

    、执行器动作异常甚至整个控制系统宕机。循环冗余校验CRC)作为一种高效的错误检测技术,如同数据传输与存储过程的"安全校验屏障",持续保障MCU与外部设备交互数据的准确性。本文将系统
    的头像 发表于 11-21 15:20 1105次阅读
    AS32系列MCU芯片中<b class='flag-5'>CRC</b><b class='flag-5'>计算</b>模块的应用介绍

    解决SD NAND CRC校验失败的综合指南:瀚海微存储产品的可靠性保障

    在嵌入式系统开发,SD NAND因其小尺寸、高可靠性和易用性成为众多项目的首选存储方案。然而,开发过程中经常会遇到CRC(循环冗余校验)错误的问题,这不仅影响系统稳定性,更可能造成数据丢失。作为
    的头像 发表于 11-21 09:49 267次阅读
    解决SD NAND <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>失败的综合指南:瀚海微存储产品的可靠性保障

    硬件循环冗余校验CRC)模块介绍

    CRC是一种错误检测码,用于检测数据传输或存储的意外更改。它通过对数据应用特定的算法生成一个固定长度的校验值。这个校验值附加在数据后面,接收方可以重新
    发表于 11-21 07:39

    CRC校验的原理和应用

    原理: CRC校验将数据视为一个二进制多项式,用一个预先定义好的生成多项式(Generator Polynomial) 进行模2除法,得到的余数作为CRC校验码。 例如:数据多项式 ÷
    发表于 11-14 06:48

    CRC校验的本质和物理意义

    工业控制系统,Modbus RTU协议的CRC校验如同通信网络的\"免疫系统\",某石化厂DCS系统曾因CRC计算错误导致0.3%的数据包
    发表于 11-13 07:58

    8种常用的CRC算法分享

    CRC 计算单元可按所选择的算法和参数配置来生成数据流的 CRC 码。有些应用,可利用 CRC
    发表于 11-13 07:25

    RVMCU课堂「19」: 手把手教你玩转RVSTAR—CRC计算

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

    请问InDTU IHDMP协议使用的CRC校验使用的什么参数模型?

    InDTU IHDMP协议使用的CRC校验使用的什么参数模型?
    发表于 08-06 07:57

    求助,关于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 926次阅读
    第十八章 浅谈循环冗余<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次下载

    基于Verilog语言实现CRC校验

    CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数
    的头像 发表于 03-24 10:36 2178次阅读
    基于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