一、Flash闪存
STM32F1系列的Flash包含程序存储器、系统存储器 和 选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程。
读写Flash的用途:①利用程序存储器剩余的空间来保存掉电不丢失的用户数据。②通过在程序中编程(IAP),实现程序的自我更新。
在线编程(In - Circuit Programming -ICP)用于更新程序存储器的全部内容,他通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序。
在程序中编程(In - Application Programming - IAP)可以使用微控制器支持的任一种通信接口下载程序。
二、Flash闪存模块组织
这里我们使用STM32F103C8T6的话,主程序存储器只有0-63页即仅有64页即64K。在也擦除的时候可以选择全部擦除和页擦除,页擦除需要知道起始地址。
这里是Flash的基本结构图,使用FPEC(Flash Program/Erase Controller)外设对Flash进行擦除和编程。程序存储器存储的是一些代码程序,而系统存储器是出厂自带的信息,选项字节用来配置读写保护和其他用户配置。
FPEC外设共设置了三个键,RDPRT键是解除读保护的键,Key1和Key2需要正确且按顺序输入,否则会锁死FPEC和FLASH_CR。
加锁就比较简单了,将FLASH_CR中的LOCK位设置为1就可以锁住FPEC和FLASH_CR。
三、读写Flash存储器
在读Flash的时候并不需要什么权限,因为不涉及到修改寄存器的值,但是在写Flash的时候却要使用KEY1和KEY2同时还需要套用下面的形式。
a、编程过程
① 先查看芯片是否上锁,然后在进行一下操作。但实际上我们只用每次操作都解锁就行。
② 置FLASH_CR的PG = 1表示写入。
③ *( (__IO uint16_t *)(0x08000000) ) = 0x1234; 注意STM32只能以半字16位的形式写入。
③ BSY位 = 1表示还在写,=0表示写完了。
b、闪存页擦除
① 先查看芯片是否上锁,然后在进行一下操作。但实际上我们只用每次操作都解锁就行。
② 置FLASH_CR的PER = 1表示页擦除,在FLASH_AR选择要擦除的页,STRT = 1表示开始擦除。
③ BSY位 = 1表示还在擦除,=0表示擦除完了。
c、闪存全擦除过程
① 先查看芯片是否上锁,然后在进行一下操作。但实际上我们只用每次操作都解锁就行。
② 置FLASH_CR的MER = 1表示全擦除,STRT = 1表示开始擦除。
③ BSY位 = 1表示还在擦除,=0表示擦除完了。
四、选项字节
可以看到[31 : 24]位 和 [15 : 8]位数据都是[23 : 16]位 和 [7 : 0]位前面代了n,其实就是他们的反码,如果这两个数据不是反码的关系,那么代表数据无效,有错误。
RDP: 写入RDPRT键(0x 000000 A5)后解除读保护。
USER:配置硬件看门狗和进入停机/待机模式是否产生复位。
Data0/1:用户可自定义使用。
WRP0/1/2/3: 配置写保护,每一个位对应保护4个存储页。(中容量)
a、选项字节的擦除
① 检查FLASH_SR的BSY位,已确定没有其他正在进行的闪存操作。
② 解锁FLASH_CR的OPTWRE位。(解锁选项字节自己的锁)
③ 设置FLASH_CR的OPTER位为1。
④ 设置FLASH_CR的STRT位为1。
⑤ 等待BSY位变为0。
b、选项字节的编程
① 检查FLASH_SR的BSY位,已确定没有其他正在进行的闪存操作。
② 解锁FLASH_CR的OPTWRE位。(解锁选项字节自己的锁)
③ 设置FLASH_CR的OPTPG位为1。
④ 写入要编程的半字到指定的地址。
⑤ 等待BSY位变为0。
参考
[15-1] FLASH闪存_哔哩哔哩_bilibili