STM32G071KB如何选择Flash地址存储掉电可保留的变量?
STM32G071KB HAL_FLASH_Program 地址参数设置说明
核心问题先明确
绝对不能直接使用SRAM起始地址0x20000000作为Address参数,原因有二:
- 0x20000000属于SRAM地址区间,SRAM是易失性存储,掉电后所有数据会自动清空,完全达不到断电保留数据的需求
HAL_FLASH_Program是专门用于操作STM32内置Flash的API,仅能识别Flash地址区间的合法地址,传入SRAM地址会直接返回参数错误,甚至触发硬件异常
合法Address参数设置规则
STM32G071KB的内置Flash总大小为128KB,地址区间为0x08000000 ~ 0x0801FFFF,所有Address参数必须落在该区间内,同时满足以下要求:
- 不得占用固件已使用区域
你需要先确认自己编译出的固件占用的Flash大小,选择未被固件占用的空白页作为存储区域。STM32G0系列Flash的页大小为2KB,比如你的固件总大小为60KB,占用前30个页,那可以选择从0x08010000(第32个页起始地址)作为存储起始地址,避免擦写时破坏运行固件。 - 地址必须对齐
对齐要求和你传入的TypeProgram参数强绑定:- 当
TypeProgram为FLASH_TYPEPROGRAM_DOUBLEWORD(单次写入8字节):Address必须8字节对齐 - 当
TypeProgram为FLASH_TYPEPROGRAM_FAST(快速模式单次写入32字节):Address必须32字节对齐
- 当
- 写前必须先擦除对应页
Flash仅能对值为全0xFF的空白位置执行写入操作,写入前需要先调用HAL_FLASHEx_Erase擦除对应地址所在的Flash页,再执行写入操作。
示例配置
如果你需要预留最后1个2KB的Flash页作为掉电数据存储区,STM32G071KB最后一页的起始地址为0x0801F800,可以直接将该值作为Address参数传入即可。
内容的提问来源于stack exchange,提问作者lukewalker_p2501
相关产品推荐
相关产品推荐

