良许Linux教程网 干货合集 单片机Flash自检和添加CRC常见方法

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

市面上有许多基于单片机的产品都带有在线或离线升级功能。为了防止升级过程中发生意外情况,通常我们会对Flash程序数据进行校验。其中最常见的就是添加CRC校验信息。

本文将为大家介绍Keil和IAR中计算CRC值的方法。

Flash自检流程

Flash自检流程一般分为启动时自检和程序运行时自检两个阶段。无论哪种自检,其基本思路都是:

程序编译完成后,计算整个程序的CRC值,然后将该CRC值添加到可执行文件的末尾。再将带有CRC校验值的可执行文件烧录到MCU中。程序启动后,自检代码将重新根据当前Flash内容(不包括预存的CRC校验值)计算一次CRC值,并将其与预先计算并烧录到Flash中的CRC校验值进行比较。如果一致,则通过自检。

这两个自检阶段的区别在于:

程序启动自检是一次性对整个Flash代码范围计算的最终CRC值,而运行时的自检则会分步进行,每次计算一部分。这是为了避免影响其他程序模块的运行。

Flash自检过程中遇到的问题主要可以分为两大类:一类是预先计算CRC值时和上电后计算CRC值的Flash范围设置是否一致。第二类是预先计算CRC时和上电后计算CRC采用的算法是否一致。

接下来,我们将为你详细介绍在Keil和IAR中计算CRC值的方法。

如何添加CRC值

下面我们主要介绍如何添加CRC校验值到可执行文件。

1、基于IAR环境

如果你使用IAR,那么添加CRC值的配置相对比较简单。通过配置IAR的CRC计算参数,自动对整个FLASH空间进行CRC计算,并将计算结果放到FLASH的末尾。

1. 修改Link文件,指定CRC值的存放位置

在Link文件中增加下面语句,指定checksum在FLASH中的存储位置。(可点击图片放大查看)

image-20231029220601790
image-20231029220601790

该语句指定将CRC的值放在FLASH的末尾位置,是整个FLASH空间的末尾,不是应用程序的代码末尾。这样,CRC值的位置就是固定的。不会随代码大小而变化。

在自检代码中,可以通过__checksum读取Flash中保存的CRC校验值来与重新计算的CRC值进行比较。

2. 配置Checksum页面的参数

在link文件中指定了checksum的存储位置后,还要在工程配置菜单中,配置计算CRC值的范围和参数。见下图(可点击图片放大查看):

image-20231029220604791
image-20231029220604791

IAR的checksum页面分为两个部分。

第一部分,也就是红线圈出的部分。定义了FLASH中需要计算CRC的范围和空闲字节填充值。这里注意要留出flash末尾存储CRC值的位置。

剩下的部分,就是对checksum计算参数的设定部分。

Checksum size:选择checksum的大小(字节数)

Alignment:指定checksum的对齐方式。一般,处理器不支持非对齐访问时有用,不填的话默认1字节对齐。

Algorithm:选择checksum的算法

Complement:是否需要进行补码计算。选择“As is”就是不进行补码计算。

Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。

Reverse byte order within word: 对于输入数据,在一个字内反转各个字节的顺序。

Initial value: checksum计算的初始化值

Checksum unit size:选择进行迭代的单元大小,按8-bit,16-bit还是32-bit进行迭代。

3. STM32CRC外设的配置

与上图IARchecksum的配置对应,STM32 CRC外设可以按以下配置:

POLY= 0x4C11DB7(CRC32)

Initial_Crc = 0Xffffffff

输入/输出数据不反转

输入数据:根据实际Flash范围设定,留出CRC校验值的位置

CRC外设初始化及计算代码(可点击图片放大查看):

image-20231029220608837
image-20231029220608837

2、基于Keil环境

KEIL没有提供直接生成CRC值的功能,所以需要借助外部的工具计算CRC值,然后添加到可执行文件的末尾。在X-CUBE-CLASSB软件中提供了bat文件,它会利用外部工具Srecord来生成整个Flash的CRC校验码并放在文件末尾。这个工具同样也可以和标准外设库的ClassB库一起用。下面我们就来看看如何在KEIL工程中利用Srecord工具来添加CRC值。

1. 安装Srecord工具

下载Srecord 工具(http://srecord.sourceforge.net )。将srec_cat.exe,srec_cmp.exe,srec_info.exe拷贝到C:\SREC(自己新建)目录下。

2. 添加crc_gen_keil.bat及crc_load.ini文件到KEIL工程同级目录下

打开X-CUBE-CLASSB软件包中的任意KEIL工程目录,将其中crc_gen_keil.bat及crc_load.ini文件拷贝到自己的KEIL工程目录下。

crc_gen_keil.bat:利用外部工具Srecord来生成整个Flash的CRC校验码并放在文件末尾。

crc_load.ini:这个文件调试时有用,用来配置调试时导入带CRC校验码的HEX,避免对FLASH检测失败导致程序无法正常运行。

image-20231029220611819
image-20231029220611819

这两个文件中的内容也需要根据新工程路径进行修改:

  • 将crc_gen_keil.bat中的TARGET_NAME和TARGET_PATH改成跟新工程一致。否则不能成功的自动生成带CRC校验值的HEX文件。
image-20231029220615709
image-20231029220615709
  • Crc_load.ini文件中的路径和文件也要和实际的一致
image-20231029220619258
image-20231029220619258

3. 添加定义CRC校验码存储区域

image-20231029220621863
image-20231029220621863

(可点击图片放大查看)

在分散加载文件中将CHECKSUM指定在代码的末尾。和IAR不同的是,通过在分散加载文件中+last指定checksum的位置,它不是将其固定放在整个flash地址的末尾,而是放在实际代码的末尾。

image-20231029220624359
image-20231029220624359

(可点击图片放大查看)

4. 添加外部命令让KEIL在编译结束后,自动生成一个带CRC校验值的HEX文件

image-20231029220627836
image-20231029220627836

定义debug和flash download使用的HEX文件路径,使用带CRC校验值的HEX文件。

image-20231029220630520
image-20231029220630520
image-20231029220633097
image-20231029220633097

5. STM32CRC外设的配置

这里需要注意,从X-CUBE-CLASSB的软件包里拷贝出的crc_gen_keil.bat文件,里面的BYTE_SWAP设为1,也就是它在计算CRC值的时候,输入的数据,在一个字内按字节颠倒顺序。

image-20231029220636310
image-20231029220636310

所以直接用HAL_CRC_Calculate函数进行计算结果是不对的。可以参考下面的代码来初始化及进行计算:

image-20231029220639241
image-20231029220639241

(可点击图片放大查看)

或者,将crc_gen_keil.bat文件,里面的BYTE_SWAP改为0, 就可以直接调用HAL_CRC_Calculate函数进行计算了。

总结

本文介绍了基于IAR及ARM KEIL中如何添加CRC校验值的过程。在X-CUBE-CLASSB软件包中,也都可以找到对应的例程。如果在调试中,遇到FLASH CRC校验出错,也不用急。

可以从计算CRC值的范围设置是否一致和采用的CRC算法是否一致这两个方面去找原因。一定要调试看看代码实际执行的情况,比如要测试的地址范围和实际代码执行时计算的地址范围是否一样,防止因为coding错误造成检测不通过。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部