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

发布者:清新天空最新更新时间:2021-01-25 来源: eefocus关键字:CRC校验  STM32 手机看文章 扫描二维码
随时随地手机看文章

    从这一段时间后台反馈的问题可以看得出来,好些朋友对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


2STM32中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

---来自STM32参考手册


输入/输出数据的反转

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

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

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

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

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


2.对输出数据的位反转

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


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


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

图片


3CRC应用

我记得读书那个时候,想要把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的功能。看下图:

图片


简单说,这里的配置可以对Flash进行CRC计算。关于这里内容比较多,足以单独写一篇文章了。可能后面会单独写一篇相关文章。


关键字:CRC校验  STM32 引用地址:CRC校验、STM32中CRC计算单元、CRC应用

上一篇:EEPROM,在项目中我一般会做几项特殊操作
下一篇:STM32中断,及FreeRTOS中断优先级配置

推荐阅读最新更新时间:2024-11-05 00:10

stm32USART使用(库函数)
1,定义GPIO端口、串口USART、中断NVIC初始化结构体。 2,打开相关外设时钟,串口1的时钟和引脚都在APB2总线上所以可以直接|操作,如下 3,给GPIO结构体成员赋值,设置引脚功能,此处用的是USART1,Tx是PA9,Rx是PA10,我们要设置PA9为复用推挽输出,PA10为浮空输入。 4,初始化GPIO端口之后我们就要配置中断分组和串口中断优先级,中断优先级分组只用设置一次。 5,以上配置好之后我们就可以来配置USART了。 6,最后我们不能忘记了编写串口接收中断函数 将函数名字声明到头文件里以上我们的串口初始化程序就编写完毕了!
[单片机]
stm32USART使用(库函数)
STM32速成笔记(1)概述
1. 编程规范 对于新手来讲,编程规范以及代码架构也非常重要,有一个良好的编程规范和代码架构,可以提高开发效率,方便问题排查以及后续的程序维护。这里介绍的编程规范很简单,要求不严格。主要有以下几点 • 变量定义 变量定义时最好是能够体现该变量所属的外设模块,该变量是否为全局变量,静态变量或者指针变量。变量首字母小写,后面的单词首字母大写。举例如下 // 以ADC模块为例,需要定义一个存储AD值的变量,举例说明变量命名方式 // 局部变量 u32 adValue = 0; // 全局变量 u32 gAdcAdValue = 0; // 加一个g表示是全局变量 // 全局静态变量 stati
[单片机]
<font color='red'>STM32</font>速成笔记(1)概述
解决OpenOCD烧录STM32失败, 无法通过SWD连接的问题
OpenOCD烧录STM32失败的问题 Linux下使用 OpenOCD 烧录 STM32, 出现了 Error: init mode failed (unable to connect to the target) 错误. 如果在代码中, 不小心将 PA13,PA14 的 SWD 功能关闭, 例如使用了下面的代码 rcc_periph_clock_enable(RCC_GPIOA); // Need GPIOA clock gpio_primary_remap( AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF, // Optional AFIO_MAPR_TIM2_REMAP_NO
[单片机]
STM32重定向C库printf/scanf
参考例程 ///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口 */ USART_SendData(DEBUG_USART, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); } ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { /* 等待串口输入数据
[单片机]
STM32 SPI和TM1628通信
uint8_t TM1628_WritePro(void) {undefined //SPI1- CR1 |= SPI_Direction_1Line_Tx ; SPI1- CR1 = 0xc3ff; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SetSTB; DelayXu(5); ClrSTB; DelayXu(2); SPI_SendData8(SPI1,0x00); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); SetSTB; De
[单片机]
STM32 JTAG失效恢复
昨天调试一块STM32L151的板子,用的是JlinkOB,调试时,出现下面的错误: JLink Error:could not start CPU core. JLink Warning:CPU could not be halted 这个错误出现的原因是,程序中有修改JTAG端口(PA13,PA14)的语句,当把JTAG当做普通IO口时,JLink就不能返回调试信息,JLink就读不回相应寄存器的值了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_S
[单片机]
STM8|STM32 看门狗使用
STM8和STM32都配备了独立看门狗,其作用之大不言而喻。以下为STM8及STM32的独立看门狗使用例: 对于STM32单片机: #define SYS_IWDG_OPEN IWDG- KR=0xCCCC; #define SYS_IWDG_FEED IWDG- KR=0xAAAA; void SystemIWDG_Config(uint32 OverTime) { RCC- CSR|=RCC_CSR_LSION; while((RCC- CSR&RCC_CSR_LSIRDY)==0); IWDG- KR=0x5555; //使能模块访问 while(IWDG- SR&IWDG_S
[单片机]
STM32 通用定时器
STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器。 STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved