如何在STM32固件中生成不含TouchGFX图像的.bin文件?
解决方案:分离TouchGFX图像与固件,实现快速增量升级
一、完全可以生成不含TouchGFX图像的.bin文件
你已经通过链接脚本划分了独立的内存区域,这是实现分离的核心基础,具体操作步骤如下:
1. 配置TouchGFX,指定图像资源存储地址
在TouchGFX Designer中,进入Project Settings → Storage,将图像资源的存储基地址设置为外部闪存的0x90400000,确保编译时所有图像资源会被定向到这个独立区域,不与主固件代码混合。
2. 细化链接脚本,明确段分配规则
基于你现有的链接脚本,进一步明确区分固件段和图像段的分配:
/* 外部闪存分区定义 */ MEMORY { EXT_FLASH_FIRMWARE (rx) : ORIGIN = 0x90000000, LENGTH = 4M /* 主固件区 */ EXT_FLASH_BITMAPS (rx) : ORIGIN = 0x90400000, LENGTH = 12M /* 图像资源区 */ /* 内部Flash、SRAM等原有内存区域保持不变 */ } SECTIONS { /* 主固件核心段分配 */ .text : { KEEP(*(.isr_vector)) /* 中断向量表必须优先放置 */ *(.text*) /* 代码段 */ *(.rodata*) /* 只读数据段 */ } > EXT_FLASH_FIRMWARE /* TouchGFX图像资源段单独分配 */ .touchgfx_bitmaps : { *(.touchgfx_bitmaps*) /* 所有图像资源 */ } > EXT_FLASH_BITMAPS /* .data、.bss等RAM段按原有配置分配到内部SRAM */ .data : { ... } > DTCMRAM AT> EXT_FLASH_FIRMWARE .bss : { ... } > DTCMRAM }
3. 编译生成仅含主固件的.bin文件
在STM32CubeIDE中,通过Post Build Outputs配置提取主固件区域:
- 右键项目 → Properties → C/C++ Build → Settings → Tool Settings → MCU Post build outputs
- 勾选
Convert to binary file (-bin),并修改输出命令,只提取主固件对应的段:
也可以通过地址范围限制提取:arm-none-eabi-objcopy -O binary -j .text -j .rodata -j .data "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}_firmware_only.bin"
最终生成的arm-none-eabi-objcopy -O binary --start-address=0x90000000 --end-address=0x90400000 "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}_firmware_only.bin"_firmware_only.bin仅包含主固件代码,大小仅为几百KB到几MB,升级速度会大幅提升。
二、需要单独生成图像资源的.bin文件
因为图像资源需要预先烧写到外部闪存的固定地址,后续固件升级无需重复烧录,所以必须单独生成图像资源的.bin文件:
1. 生成图像资源.bin
同样在Post Build Outputs中添加命令,提取.touchgfx_bitmaps段:
arm-none-eabi-objcopy -O binary --only-section=.touchgfx_bitmaps "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}_bitmaps.bin"
2. 预先烧写图像资源
使用STM32CubeProgrammer或你的升级工具,将_bitmaps.bin烧写到外部闪存的0x90400000起始地址,完成后后续升级仅需烧写主固件.bin即可。
三、主固件访问图像资源的实现逻辑
无需额外修改代码,只需确保两点:
- TouchGFX配置中已正确设置图像存储基地址为
0x90400000,TouchGFX框架会自动从该地址读取图像数据 - 主固件初始化阶段完成外部W25Q128闪存的驱动配置,确保总线和读写功能正常
四、优化后的升级流程
- 首次烧录:先烧写图像资源.bin到
0x90400000,再烧写主固件.bin到0x90000000 - 后续升级:仅烧写主固件.bin到
0x90000000,跳过图像资源烧录,升级时间可压缩至数分钟以内
内容的提问来源于stack exchange,提问作者Geisterfahrer
相关产品推荐
相关产品推荐

