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

