你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | Flash 全片自检过程中巧用 Linker 自定义变量

[复制链接]
STMCU小助手 发布时间:2025-8-11 14:57

简介 Flash 自检是功能安全应用 ClassB 或者 SIL 必不可少的测试项目,自检包含启动时自检和运行时自检,通常情况下,启动时自检要求对 Flash 全片 ROM 进行自检,在 Flash 全片自检过程中,需要知道 ROM 实际占用的 Flash 大小,如果配置的参数与 ROM 实际大小不一致,那么自检就会失败。

客户询问实际开发过程中是否有较好的方法获取实际的 ROM 大小进行 Flash 全片自检配置,针对客户的疑问,本文介绍功能安全应用中 Flash 自检的原理以及在 KEIL 编译环境下如何使用链接器自定义变量计算实际的 ROM 大小。

  1. 功能安全 Flash 自检原理 STM32 提供了针对功能安全应用的自检库,我们以 ClassB 4.0 为例,自检库实现了 Flash 自检功能,Flash自检采用 CRC算法对 ROM区进行校验,主要分为 CRC 预计算和 CRC 比较两个步骤,下面分别描述两个步骤的主要内容。

CRC 预计算,针对编译生成的可执行文件生成 CRC 并插入 CRC 到可执行文件中,其生成 CRC 的过程要符合如下要求。

image.png

图1. CRC 预计算

(1)Flash 空间划分为CRC 区域和程序区,其中 CRC 区域的起始地址与 Flash 大小相关,其计算的公式如下:CRC区域起始地址=Flash结束地址-4(Flash 大小/1024),如果Flash大小为 2M 字节,起始地址为0x08000000,那么CRC区域的起始地址为0x08200000-4(0x200000/1024)=0x81E0000。

(2)程序区从Flash起始地址开始,分为连续的Section,每个Section的大小为 1024 字节,实际程序能够使用的 Flash 空间最大为 Flash 大小-CRC 区域大小,也就是 Flash Size-4*(Flash Size/1024),对于 2M 空间的 Flash,其程序空间最大为 0x1E0000。

(3)编译生成的可执行文件ROM包含了Code段,RO段以及 RW 段,使用STM32_Programmer_CLI 工具预计算 CRC 的过程,只对实际产生的 ROM 段进行计算,ROM 段必须保证 4 字节对齐,ROM 按照 1024 字节为单位划分为多个Section,通常最后一个 Section 不足 1024 字节,但是也记作一个Section。假设可执行文件的ROM大小为 81928,那么其一共划分为 81 个 Section,其中最后一个Section占用 8 字节空间,STM32_Programmer_CLI 工具针对这个 ROM 生成 81 个CRC 值,其中前 80 个 CRC 值为 1024 字节的校验码,最后一个 CRC 值为 8 字节的校验码。这 80 个 CRC 值按照顺序存放在 CRC 区域空间。

(4)烧录程序的过程中,可执行程序二进制代码和工具生成从 CRC 分别烧录到 Flash 的程序空间和 CRC 空间。

CRC 比较,程序运行阶段,用户程序调用功能安全库提供的自检 API 进行检测,用户需要正确配置 ROM 检测的范围,功能安全库提供了标准的数据结构供用户配置自检范围,结构体如下图所示。

image.png

图2. Flash 自检配置

用户程序通过上述两个数据结构配置 Flash 自检的区域,待测试的 Flash 区域通过 STL_MemSubSet_t 结构体指定,用户可以定义一个或多个 MemSubSet,对于 Flash 全片测试,只需要定义一个 MemSubSet,其中 StartAddr 为 ROM 起始地址, EndAddr 为 ROM 的结束地址,正确的 ROM 结束地址是确保自检通过的必备条件。

  1. 使用 Linker 自定义符号变量计算 ROM 大小 因为在 Flash 自检中,需要正确地配置 ROM 的大小,最简单的办法就是代码编译完成,查看编译的结果得到 ROM 的大小,再把这个值填上去。这种方法存在的问题就是每次修改代码可能会导致 ROM 大小发生变化,这意味着每次都要修改参数,否则自检就会出错。

实际上,在代码编译过程中,KEIL 编译器已经定义了一些变量,用户程序可以直接引用,这些变量包含了可执行文件的各个段的长度信息,如果用户代码需要计算 ROM 大小,直接使用这些变量即可。从 KEIL 的帮助文档中,可以找到这些变量的定义以及如何在用户代码中使用这些变量。

image.png

图3. Linker 自定义符合变量

上图定义的变量可以直接在用户代码中引用,其中 region-name 需要替换为 Linker 脚本 Scatter 文件中定义的段名,我们以下图 Scatter 文件为例,使用下面代码即可计算出实际ROM 大小。 image.png

图4. Scatter 文件

image.png

图5. 计算 ROM 大小

  1. 小结 本文介绍了功能安全应用中,Flash 自检原理以及对 Flash 进行全片自检过程中如何使用Linker 自定义变量计算实际 ROM 大小的方法。

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2501_92678806/article/details/149630721

收藏 评论0 发布时间:2025-8-11 14:57

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版