STM32读写内部Flash

▼魔方 西西 提交于 2019-12-02 12:46:34

写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年译

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!