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
相关产品推荐
相关产品推荐

