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

如何在STM32指定Flash区域存储变量?Keil配置问题求助

解决STM32变量无法存入指定Flash位置的问题

问题根源分析

你的分散加载文件和变量定义存在两处核心不匹配:

  • 分散文件中user_flash块使用.ANY (+RO),会匹配所有目标文件的默认只读段,但你的变量定义在自定义的.user_flash段,未被正确识别匹配。
  • 变量使用__IO(volatile)且带初始值,编译器默认会将其视为可写数据(RW),优先分配到RAM而非Flash存储。

具体修复步骤

1. 修改分散加载文件

将user_flash块的内容改为明确匹配自定义段.user_flash,同时修正加载区域总大小避免溢出:

LR_IROM1 0x08000000 0x00008000  {    ; 总大小调整为0x8000(原0x7800+0x800)
  ER_IROM1 0x08000000 0x00007800  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  user_flash 0x08007800 0x00000800  { 
   *( .user_flash )  ; 明确匹配自定义段
  }
  RW_IRAM1 0x20000000 0x00001000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

注意:原LR_IROM1的大小为0x00007800,但ER_IROM1+user_flash总大小为0x7800+0x800=0x8000,必须调整LR_IROM1的大小避免加载区域溢出。

2. 调整变量定义

  • 如果变量仅用于Flash只读存储(如固定配置),添加const修饰符,让编译器识别为只读数据:
const float EE_Myvariable __attribute__((section(".user_flash"))) = 21.0;
  • 如果需要运行时通过Flash擦写API修改该变量,保留__IO并添加used属性防止编译器优化:
__IO float EE_Myvariable __attribute__((section(".user_flash"), used)) = 21.0;

3. 验证结果

重新编译项目后,打开map文件搜索EE_Myvariable,确认其地址落在0x08007800起始的目标Flash区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:07