1.简介

循环冗余校验(CRC)是一种基于二进制除法的数字数据错误检测方法。
CRC算法生成固定的校验和代码长度。
 

2.CRC值是如何计算的,嵌入式应用中如何确定CRC算法?

该算法的输入参数为:
•输入数据也称为“股息”
•生成器多项式或“除数”是一个代数多项式,表示为比特模式:每个项的幂给出比特上的位置,系数给出比特的值。
生成器多项式的阶数不得超过CRC长度。例如,如果我们想要具有32位的CRC,则多项式的最高指数必须是32。
默认情况下,STM32嵌入式应用程序中用于计算CRC-32的标准生成器多项式是十六进制的0x04C11DB7,等于二进制格式的x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。
•初始CRC值
在启动时,该算法将CRC设置为带有被除数的初始CRC值XOR。
一旦CRC MSB等于1,则算法将CRC向左移动一位,并将其与生成器多项式异或。
否则,它只将CRC向左移位一位。
下图描述了STM32 MCU中使用的算法。

您可以参考AN4187 CRC外围设备概述及其固件来了解计算过程:
(https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embe...)。

嵌入式软件给出了CRC的计算实例。软件实现的算法是在函数CrcSoftwareFunc中开发的:

您还可以使用HAL库通过调用函数来计算CRC
•HAL_CRC_Accumulate():使用前一个CRC值和新的CRC值的组合计算8、16或32位数据缓冲区的7、8、16和32位CRC值。
•HAL_CRC_Calculate()计算8、16或32位数据缓冲区的7、8、16、或32位CRC值,与之前的CRC值无关。
为了确定您的CRC是否正确,您可以使用两种不同的方法进行计算并比较结果。
计算CRC有不同的方法:
  • 使用您自己的算法实现,如CrcSoftwareFunc函数
  • 与哈尔图书馆
  • 使用在线计算器

3.STM32 MCU中的CRC功能是什么?

CRC外围设备功能因STM32而异,具体如下:

如果启用了“I/O数据上的可逆性选项”功能,则每个输入和/或输出字节在用于计算之前都会得到反映。输入或/和输出字节的位以相反的顺序使用。
有关CRC功能的详细使用,请参阅设备参考手册。
 

4.关于错误检测和碰撞

冲突是对于两个不同的输入数据类似的CRC。
CRC值具有的比特越多,冲突的概率就越小。
对于CRC-8,有2^8个不同的CRC值-->两个不同数据具有相同CRC的概率为1/256。
增加CRC宽度可以得到更好的错误保护。
CRC不能纠正错误,它只检测错误以再次发送数据为例,或者只作为信息。
必须选择生成器多项式以最大化错误检测能力,同时最小化总体碰撞概率。
 

5.CRC是散列吗?

CRC和散列函数都有一个共同的特性,即它们接受一个输入值并将其减少为一个输出值,通常更短。
哈希是一个安全的函数,用于比较大型数据集。例如,它通常与用于保护数字签名的加密机制一起使用。
CRC用于较小的数据,以防止意外更改,在发送数据时进行随机错误检测。它不适用于防止外部攻击。
 

6.如何计算和生成构建后CRC?

  • 带IAR EWARM工具链

IAR EWARM提供了一种在项目-->选项中生成校验和的方法:


 
  • 带STM32CubeIDE工具链

STM32CubeIDE没有IAR EWARM的此属性,因此我们必须使用外部工具来生成生成后CRC。
 

Srec_cat是SRecord实用程序包中提供的一个工具,它是一个用于内存操作的独立实用程序。

特点:
  • 加载一个或多个二进制文件
  • 剪切特定地址区域
  • 将他们转移到新地址
  • 将它们存储到HEX文件中

例如,Srec_cat可以用于在构建后的二进制文件末尾生成CRC,方法是在工具链中调用它。
该实用程序及其所有相关信息可在Peter Miller的网页上获取:http://srecord.sourceforge.net/.
在“SourceForge下载”部分的下载页面中,选择“1.64 release.zip file”链接。
单击它并下载SRecord 1.64软件包。
下载的ZIP文件夹包含以下项目:
•srec_cat.exe
•srec_cmp.exe
•srec_info.exe
•参考手册srecord-1.63.pdf
•自述文件
此在线研讨会介绍了将srec_cat与STM32CubeIDE一起使用的过程:
STM32CubeIDE-Workshop-2019/动手/06_F746-DISCO-SRC在master·ethanhuanginst/STM32CubeIDE Worksh。。。
 
  • 带Keil MDK工具链

可以以与Keil MDK相同的方式使用srec_cat。
 
  • 将新“bin”文件夹中的srec_cat.exe、srec_cmp.exe和srec_info.exe文件复制到Keil项目的根目录中,如下所示。
  • 启用选项的选项卡“输出”中的选项“创建HEX文件”:


 
  • 启用生成后选项

要在构建后添加CRC,需要在“用户”选项卡中启用“构建/重建后”选项,并调用Srecord命令:
 
  • 在文本编辑器中创建一个空文本文件
  • 将此命令复制到文件中:
.\bin\srec_cat.\Debug\OEM_Dev.hex-intel-裁剪0x08000000 0x08002F02-填充0xFF 0x08000000 x08002F10-CCR16_Little_Endian 0x08002F10-o。\调试\OEM_Dev_CRC16.hex-英特尔
该命令将区段数据从地址0x08000000隔离到0x08002F02,用0xFF填充该扇区未使用的数据,计算隔离区段的CRC并将其放置在地址0x08002F10。
这些操作保存在输出十六进制文件中:OEM_Dev_CRC16.hex
您可以根据自己的使用情况调整此命令。
有关srecord命令的更多信息,请参阅srecord-1.63.pdf。
 
  • 将文件保存为“post-build.bat”。
  • 启用生成后选项并调用此文件:


 
  • 用于调试和下载的十六进制文件必须填写在“调试”选项卡中。

编译后步骤中生成的经过编辑的十六进制文件将用于编程和调试。
创建一个文本文件,例如将其重命名为“Initialize.ini”,并将其保存在项目的根目录中。
将此命令写入文件并保存:LOAD。\调试\OEM_Dev_CRC16.hex增量
在“调试”选项卡中输入此文件:

在“实用程序”选项卡中: