写Flash的流程
(1)解锁
由于程序代码都存储在内部Flash中,因此,STM32本身的Flash平时是锁住的,在写Flash之前要先解锁,控制解锁的寄存器是FPEC 键寄存器 FLASH_KEYR:
FLASH->KEYR = 0x45670123;
FLASH->KEYR = 0xCDEF89AB;
固件库里有FLASH_Unlock();解锁函数,可以直接使用。
(2)按页擦出
Flash只支持按页擦出,不同型号的产品每页的大小不同,以STM32F1xx系列为例,小容量和中容量的产品型号每页大小1kByte,大容量产品型号每页2kByte。固件库中也有擦出函数:FLASH_ErasePage(uint32_t Page_Address)。
(3)使用FLASH_ProgramWord(uint32_t Address, uint32_t Data)函数写入即可
写Flash的注意事项
分页错误
编写程序,向最后一页写入数字20,在读取该地址的数据printf到串口助手,得到数值7,原因:起始终止地址设置错误:WRITE_START_ADDR,WRITE_END_ADDR 。
起始、终止地址
如表1所示,F1系列产品的大容量的地址分页:
表1[1]:STM32F1xx大容量型号的主存储器分页
表格中最后一页为0x0807 F800 - 0x0807 FFFF,程序中也写为:
// 满洲里国峰电子科技 www.guofengdianzi.com
// 微信:GuofengDianZi
#define WRITE_START_ADDR ((uint32_t)0x0807F800)
#define WRITE_END_ADDR ((uint32_t)0x0807FFFF)
结果出错。原因如下:
代码中有如下几句:
// 满洲里国峰电子科技 www.guofengdianzi.com
// 微信:GuofengDianZi
while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
{
FLASHStatus = FLASH_ProgramWord(Address, Data);
Address = Address + 4;
}
由于Address < WRITE_END_ADDR用的是小于号,因此正确的起始终止地址应为:
// 满洲里国峰电子科技 www.guofengdianzi.com
// 微信:GuofengDianZi
#define WRITE_START_ADDR ((uint32_t)0x0807F800)
#define WRITE_END_ADDR ((uint32_t)0x08080000)
作者:伏熊(专业:射频芯片设计、雷达系统。爱好:嵌入式。欢迎大家项目合作交流。)
微信:GuoFengDianZi
引用
[1]:STM32F10xxx闪存编程参考手册,ST Microelectronics,2008年译
来源:https://blog.csdn.net/mzldxf/article/details/102760970