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

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

3天内不再提示

单片机中CRC原理及应用

jf_pJlTbmA9 来源:strongerHuang 作者:strongerHuang 2023-09-27 16:02 次阅读

CRC校验算应该绝大部分理工类同学都学习过,但真正搞明白的没几个,之前给大家分享过《几种常见的校验算法》,今天结合STM32来分享其中CRC相关的内容。

1、关于CRC校验

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

CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

---来自百度百科

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

wKgZomUDzcOAO8PsAAkKHjk6n2k495.jpg

拿STM32参考手册中CRC计算单元来说,使用CRC-32(以太网)多项式:0x4C11DB7─ X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X4 + X2 + X +1

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

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

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比较简单,只有三个比较简单的寄存器,不管是使用寄存器,还是库函数,对于大部分人来说,没有多大难度。

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

wKgaomUDzcaAM4QGAAHj7OoFMuY299.jpg

3、CRC应用

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

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

wKgaomUDzceAex0KAADwxrZmRKw400.jpg

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

wKgZomUDzciANyKKAAPWbYww0CQ900.jpg

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

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

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

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

wKgaomUDzcqASRDOAAHLuv3xeCE181.jpg

简单来说,这里的配置可以对Flash进行CRC计算,关于这里内容比较多,足以单独写一篇文章了,感兴趣的读者可以深入了解一下。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇

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

    关注

    6037

    文章

    44562

    浏览量

    635755
  • STM32
    +关注

    关注

    2270

    文章

    10903

    浏览量

    356275
  • crc
    crc
    +关注

    关注

    0

    文章

    199

    浏览量

    29470
收藏 人收藏

    评论

    相关推荐

    单片机Flash自检和添加CRC常见方法

    市面上很多基于单片机的产品都具有在线或离线升级功能,为了防止升级过程出现意外,一般我们都会对Flash程序数据进行校验,常见的就是添加 CRC 校验信息。
    发表于 05-19 10:49 4944次阅读
    <b class='flag-5'>单片机</b>Flash自检和添加<b class='flag-5'>CRC</b>常见方法

    CRC算法在单片机通信系统的实现

    主要论述了在单片机通信系统CRC算法的设计和在单片机硬件下的编程实现。为了实现单片机系统之间高效无差错的数据传输,必须对数据进行检错,当传
    发表于 03-03 14:02

    单片机crc校验程序有什么作用

    单片机crc校验程序,用于单片机CRC检验方法一、应用场景二、代码实现1.CRC表格2.CRC
    发表于 07-15 06:20

    CRC-8 高效简练的单片机实现方法

    本刊2002 年第9 期《循环冗余校验码的单片机及CPLD实现》[1]和2003 年第8期《DS18B20串行通信误码的解决方法》[ 2]两篇文章, 都讨论了如何在单片机实现 CR
    发表于 04-15 11:09 74次下载

    简单实用的单片机CRC快速算法

    摘要:提供两个实用的、能够在单片机上通过软件来实现的CRC快速算法,其中一个适用于51系列等单片机,另一个适用于PIC单片机,这两种算法十分简单快捷。
    发表于 09-09 17:52 33次下载

    C51实现单片机CRC快速算法

    摘要:本文介绍了CRC的基本原理和计算方法,给出了利用C51实现单片机CRC的快速算法关键字:CRC;C51;单片机;快速算法
    发表于 09-10 11:14 51次下载

    CRC差错检验法在PC与8031单片机串行通讯的应用

    CRC差错检验法在PC与8031单片机串行通讯的应用摘  要  通过对不同校验方法的分析,介绍了一种适合PC
    发表于 03-14 16:44 754次阅读
    <b class='flag-5'>CRC</b>差错检验法在PC<b class='flag-5'>机</b>与8031<b class='flag-5'>单片机</b>串行通讯<b class='flag-5'>中</b>的应用

    单片机通信系统CRC算法与硬件环境编程的实现

    在通信系统从多检错手段CRC是非常著名的一种。CRC-全称循环冗余校验是对数据块校验的一种高效的差错控制方法。在单片机通信系统设计过程
    发表于 03-14 12:45 89次下载

    简单实用的单片机CRC快速算法

    本文提供两个实用的、能够在单片机上通过软件来实现CRC快速算法。
    发表于 03-22 16:40 3次下载

    如何实现软件CRC和所选单片机中使用的硬件CRC的详细资料概述

    目前,越来越多的单片机使用B类安全程序来检测安全要求极高的应用的故障。检测单片机程序存储器故障的主要方法是使用由IEC 60730标准定义的循环冗余校验(Cyclic Redund
    发表于 06-15 09:26 10次下载
    如何实现软件<b class='flag-5'>CRC</b>和所选<b class='flag-5'>单片机</b>中使用的硬件<b class='flag-5'>CRC</b>的详细资料概述

    如何使用51单片机实现CRC校验算法

    介绍了CRC(循环冗余码校验)原理及集成混合信号片上系统单片机C8051F的新特性,推导获得以字节为单位的数据序列CRC码递推算法,利用C8051F单片机的自带CAN2.0B总线接口控
    发表于 12-17 16:09 17次下载
    如何使用51<b class='flag-5'>单片机</b>实现<b class='flag-5'>CRC</b>校验算法

    [单片机] crc32

    [单片机] crc32
    发表于 11-23 17:36 5次下载
    [<b class='flag-5'>单片机</b>] <b class='flag-5'>crc</b>32

    Qt CRC16校验,有时候电脑计算的CRC值和单片机中计算的值不一样

    出现和单片机的检验数据不一样。主要原因是单片机的unsigned char 和char 是一样。而电脑是区分的,所以这也就导致了即使我在单片机
    发表于 11-23 17:51 8次下载
    Qt <b class='flag-5'>CRC</b>16校验<b class='flag-5'>中</b>,有时候电脑计算的<b class='flag-5'>CRC</b>值和<b class='flag-5'>单片机</b>中计算的值不一样

    用于单片机CRC数据校验方法

    用于单片机CRC检验方法一、应用场景二、代码实现1.CRC表格2.CRC函数3.使用demo闲扯一、应用场景前两天做了一个固件的远程升级软件,是基于stm32的固件,传输的数据量少,
    发表于 12-17 18:35 3次下载
    用于<b class='flag-5'>单片机</b>的<b class='flag-5'>CRC</b>数据校验方法

    RA MCUCRC模块和使用方法

    瑞萨RA单片机硬件CRC计算单元采用固定的多项式发生器来计算8位或者32位数据的CRC校验值,对数据传输或数据存储的一致性、完整性进行验证。这篇文章重点介绍RA MCU
    发表于 02-26 11:45 969次阅读
    RA MCU<b class='flag-5'>中</b>的<b class='flag-5'>CRC</b>模块和使用方法