在 STM32 开发中,填充未用 FLASH 区域(如统一填充 0xFF)是常见需求,可用于固件完整性校验、防止数据残留等场景。IAR 等 IDE 提供现成 GUI 功能,但 STM32CubeIDE 需通过修改链接文件(.ld)实现。本文基于 ST 官方 LAT1306 应用笔记,详解 FLASH 未用区域填充的原理、两种实操方法及校验和配置,适用于 STM32 全系列芯片。
1. 核心前提:STM32CubeIDE 工具链基础
STM32CubeIDE 采用 GNU GCC Arm 工具链完成编译链接,核心工具分工如下:
- 编译:
arm-none-eabi-gcc编译 C/C++ 源码生成目标文件(.o); - 链接:
arm-none-eabi-gcc(替代arm-none-eabi-ld,优化混合文件支持)整合目标文件,按链接文件(.ld)分配内存; - 文件生成:
arm-none-eabi-objcopy生成 hex/bin 烧录文件; - 填充关键:利用 GNU GCC Linker 的 section 填充功能,实现未用 FLASH 区域的指定值填充。
2. 未用 FLASH 区域填充:两种实操方法(以 0xFF 为例)
填充的核心逻辑是:在链接文件的
SECTIONS节点中,新增一个专门的填充段(如.padding),指定填充值并绑定到 FLASH 区域,覆盖未被其他段占用的空间。以下以 STM32H747(FLASH 起始地址 0x08000000,大小 2048K)为例,提供两种可直接复用的配置方法。2.1 方法 1:使用FILL指令填充
在链接文件(.ld)的
SECTIONS节点中,于最后一个 FLASH 相关段(如.fini_array)之后添加如下配置:SECTIONS {
/* 原有段配置(如.text、.data、.fini_array等)... */
.fini_array : {
/* 原有配置 */
} >FLASH /* 已有段绑定到FLASH区域 */
/* 新增填充段:填充未用FLASH为0xFF */
.padding : {
FILL(0xFF); /* 指定填充值为0xFF */
BYTE(0xFF); /* 确保填充生效的辅助指令 */
. = ORIGIN(FLASH) + LENGTH(FLASH); /* 填充至FLASH末尾 */
} >FLASH /* 绑定填充段到FLASH区域 */
/* 其他配置(如/DISCARD/段过滤)... */
}
2.2 方法 2:使用=直接指定填充值
简化配置逻辑,通过
=直接关联填充值,配置如下:SECTIONS {
/* 原有段配置... */
.fini_array : {
/* 原有配置 */
} >FLASH
/* 新增填充段:简洁写法 */
.padding : {
BYTE(0xFF);
. = ORIGIN(FLASH) + LENGTH(FLASH);
} >FLASH = 0xFF /* 直接指定填充值为0xFF */
/* 其他配置... */
}
2.3 关键说明
- 填充范围:
.padding段会自动占用所有未被其他段(.text、.rodata 等)占用的 FLASH 空间,无需手动计算剩余大小; - 填充值修改:将
0xFF替换为其他需求值(如 0x00、0xAA),即可实现自定义填充; - 配置位置:必须将
.padding段放在所有>FLASH的段之后,确保不覆盖有效代码 / 数据。
3. 进阶需求:预留空间计算校验和
若需对 FLASH 代码区计算校验和(用于固件完整性验证),需在填充时预留指定字节的空间(如 16 位校验和预留 2 字节),步骤如下:
3.1 链接文件配置(预留 2 字节示例)
修改
.padding段的结束地址,减去校验和所需字节数:.padding : {
FILL(0xFF);
BYTE(0xFF);
/* 预留2字节用于存储校验和:LENGTH(FLASH) - 2 */
. = ORIGIN(FLASH) + LENGTH(FLASH) - 2;
} >FLASH
- 变量定义:可通过
#define Number_bytes_checksum 2统一管理预留字节数,便于维护; - 预留字节位置:校验和将存储在 FLASH 的最后 2 字节,需在后续步骤中通过工具或代码写入。
3.2 校验和生成流程
- 按上述配置编译工程,生成 bin 文件(此时 FLASH 最后 2 字节为空);
- 使用校验和工具(如 ST 官方工具、自定义脚本)计算除预留字节外的 FLASH 数据校验和;
- 将计算得到的校验和写入 bin 文件的预留字节位置,生成完整烧录文件;
- 烧录后,设备可通过读取 FLASH 最后 2 字节的校验和,与实时计算的代码区校验和对比,验证固件完整性。
4. 注意事项与避坑指南
- 工具链兼容性:确保使用 STM32CubeIDE 自带的 GNU GCC Arm 工具链,避免第三方工具链导致的语法不兼容;
- 链接文件路径:修改项目自动生成的
.ld文件(如STM32H747I-EVAL_FLASH.ld),若重新生成 CubeMX 代码,需重新添加填充配置; - 填充值合法性:FLASH 擦除后默认值为 0xFF,建议填充值与默认值一致,减少烧录时的改写操作,提升效率;
- 多 FLASH 银行:若芯片支持多 FLASH 银行(如 STM32H7 系列),需在
MEMORY节点中分别定义各银行,针对性添加填充段。
5. 核心优势总结
- 无需额外工具:仅通过修改链接文件实现,无需依赖第三方软件;
- 灵活可控:支持自定义填充值(0xFF/0x00 等),可按需预留校验和空间;
- 兼容性广:适用于 STM32 全系列芯片及 STM32CubeIDE 所有版本(推荐使用最新稳定版);
- 应用场景:固件完整性校验、防止未用 FLASH 区域的数据干扰、统一 FLASH 存储状态。
阅读全文
772