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

STM32G0指定Flash区域创建:加载与执行地址不一致问题

解决STM32G0 Keil Scatter文件中Flash常量区域加载/执行地址不一致问题

问题原因

你当前的Scatter文件中,ER_PARAMETER_FLASH执行区域未指定独立的加载区域,默认会继承LR_IROM1的加载空间。编译器会将.parameter_section的数据放在LR_IROM1的空闲区域(即你看到的0x08001aa0),仅将执行地址映射到0x0800F800——但Flash中的常量不需要重定位拷贝,这会导致实际存储地址与程序访问地址不符,违背你的需求。

解决方案

要让加载地址与执行地址完全一致,有两种可行的修改方式:

方式1:为执行区域指定加载地址

直接在ER_PARAMETER_FLASH定义中添加LOAD()属性,强制加载地址与执行地址相同:

LR_IROM1 0x08000000 0x0000F800 {  ; 主加载区域,62KB
  ER_IROM1 0x08000000 {  ; 主执行区域
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
}

ER_PARAMETER_FLASH 0x0800F800 0x00000800 LOAD(0x0800F800) {  ; 2KB参数区域,加载/执行地址一致
   *(.parameter_section)
   .ANY (+RO)
}

RW_IRAM1 0x20000000 0x00009000 {  ; RAM区域
   .ANY (+RW +ZI)
}

方式2:新增独立加载区域

为参数Flash区域单独定义加载区域,明确绑定执行区域与加载区域的对应关系:

LR_IROM1 0x08000000 0x0000F800 {  ; 主加载区域,62KB
  ER_IROM1 0x08000000 {  ; 主执行区域
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
}

LR_PARAMETER_FLASH 0x0800F800 0x00000800 {  ; 参数加载区域,2KB
  ER_PARAMETER_FLASH 0x0800F800 {  ; 参数执行区域
   *(.parameter_section)
   .ANY (+RO)
  }
}

RW_IRAM1 0x20000000 0x00009000 {  ; RAM区域
   .ANY (+RW +ZI)
}

验证方法

修改Scatter文件后重新编译,查看生成的.map文件,确认ER_PARAMETER_FLASH区域的Exec Addr和Load Addr均为0x0800F800,且.parameter_section的地址与预期一致。也可通过Keil调试器直接查看0x0800F800起始的Flash内容,确认是否为你定义的0xDEADBEEF等常量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:41