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

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

[复制链接]
攻城狮Melo 发布时间:2026-3-19 16:49

Flash 全片自检过程中巧用 Linker 自定义变量

详细文档:点击下载>

一、核心背景

Flash 自检是功能安全应用 ClassB/SIL 的必备测试项,分为启动时和运行时自检,其中启动时自检需对 Flash 全片 ROM 校验,配置的 ROM 实际占用大小参数必须精准 ,否则自检会失败。本文重点讲解 STM32 功能安全 Flash 自检原理,以及 KEIL 编译环境下通过 Linker(链接器)自定义变量自动获取实际 ROM 大小的方法,解决手动配置参数随代码修改需反复调整的问题。

二、功能安全 Flash 自检原理(以 ClassB 4.0 自检库为例)

采用CRC 算法 对 ROM 区校验,分为CRC 预计算CRC 比较 两个核心步骤,二者配合完成 Flash 全片自检。

1. CRC 预计算

对编译生成的可执行文件生成 CRC 并写入 Flash,需遵循 Flash 空间划分和校验规则,核心步骤: image.png

  1. Flash 划分为CRC 区域程序区 ,CRC 区域起始地址计算公式:CRC区域起始地址=Flash结束地址-4*(Flash大小/1024)(如 2M Flash、起始 0x08000000 时,CRC 起始为 0x81E0000);
  2. 程序区从 Flash 起始地址开始,按 1024 字节划分为连续 Section,最大可用空间为Flash大小-CRC区域大小
  3. 仅对编译生成的 ROM 段(Code、RO、RW 段,需 4 字节对齐)计算 CRC,按 1024 字节为单位划 Section,不足 1024 字节也计为 1 个,为每个 Section 生成对应 CRC 值,前 N-1 个为 1024 字节校验码,最后 1 个为剩余字节校验码,所有 CRC 值按序存入 CRC 区域;
  4. 烧录时,程序二进制代码写入程序区,CRC 值写入 CRC 区域。

2. CRC 比较

程序运行时调用自检库 API 完成校验,核心要求:

  1. 通过自检库提供的STL_MemSubSet_t结构体配置 Flash 自检区域,全片自检仅需定义 1 个该结构体;
  2. 结构体中需准确配置StartAddr(ROM 起始地址)和EndAddr(ROM 结束地址),EndAddr 的精准性是自检通过的关键

三、Linker 自定义符号变量计算实际 ROM 大小(KEIL 环境)

1. 手动配置 ROM 大小的弊端

手动编译后查看 ROM 大小再填入配置参数,每次修改代码会导致 ROM 大小变化,需重新手动调整,否则自检出错,效率低且易出错。

2. 解决方案:复用 KEIL 编译器内置 Linker 变量

KEIL 编译过程中会自动定义包含各段长度信息的 Linker 变量,可直接在用户代码中引用,无需手动计算 ,变量名需匹配 Linker 脚本 Scatter 文件中定义的段名。

3. 实操示例

  1. 以指定 Scatter 文件为例,其定义了ER_IROM1(程序区)、RW_IRAM1~4(RW 数据区)等段;
  2. 代码中通过声明外部 Linker 变量,累加计算实际 ROM 大小,核心代码:

c

运行

uint32_t u32RomSize=0;
extern uint32_t Load$$ER_IROM1$$Length;
extern uint32_t Load$$RW_IRAM1$$Length;
extern uint32_t Load$$RW_IRAM2$$Length;
extern uint32_t Load$$RW_IRAM3$$Length;
extern uint32_t Load$$RW_IRAM4$$Length;

u32RomSize=(uint32_t)&(Load$$ER_IROM1$$Length)+
(uint32_t)&(Load$$RW_IRAM1$$Length)+
(uint32_t)&(Load$$RW_IRAM2$$Length)+
(uint32_t)&(Load$$RW_IRAM3$$Length)+
(uint32_t)&(Load$$RW_IRAM4$$Length);

四、工具与参考资料

  1. 参考文档:UM2590(STM32G4 Series self-test library user guide,版本 3);
  2. 使用工具:MDK KEIL V5.40。

五、核心小结

本文阐述了 STM32 功能安全应用中 Flash CRC 自检的完整原理,同时解决了 Flash 全片自检中 ROM 大小精准配置的问题 —— 通过复用 KEIL Linker 的自定义符号变量 ,自动计算编译后实际的 ROM 占用大小,替代手动配置,避免了代码修改后参数反复调整的问题,保证了 Flash 自检参数的精准性和开发效率。

收藏 评论0 发布时间:2026-3-19 16:49

举报

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