You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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配置提取主固件区域:

  1. 右键项目 → Properties → C/C++ Build → Settings → Tool Settings → MCU Post build outputs
  2. 勾选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即可。

三、主固件访问图像资源的实现逻辑

无需额外修改代码,只需确保两点:

  1. TouchGFX配置中已正确设置图像存储基地址为0x90400000,TouchGFX框架会自动从该地址读取图像数据
  2. 主固件初始化阶段完成外部W25Q128闪存的驱动配置,确保总线和读写功能正常

四、优化后的升级流程

  1. 首次烧录:先烧写图像资源.bin到0x90400000,再烧写主固件.bin到0x90000000
  2. 后续升级:仅烧写主固件.bin到0x90000000,跳过图像资源烧录,升级时间可压缩至数分钟以内

内容的提问来源于stack exchange,提问作者Geisterfahrer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:35:07