FLASH简介
闪存存储器接口是一个外设,是这个闪存的管理员。
我们使用的STLink就是SWD协议下载,下载的时候会更新Flash当中的全部内容。Bootloader就是串口下载,我们目前使用过的就是ICP下载方式。
对于IAP下载程序,我们就需要自己写一个Boot loader程序,将其放在程序更新的时候不会覆盖的地方,需要更新程序的时候,我们控制程序跳转到我们自己写的Bootloader当中,在这里我们就可以接收任意一种通信接口传过来的数据,之后我们控制Flash读写,将收到的数据写入到程序正常运行的地方,写完之后再控制程序跳转到正常运行的地方。或者直接复位,这样程序就完成了自我升级。
上图的存储器地址要记忆达到看到地址就知道它位于什么区域,有什么特性,大概是干什么的。
闪存模块组织
主存储器:程序存储器,存放程序代码。
信息块:启动程序代码就是系统存储器;用户选择字节即选项字节,存放一些独立的参数。
闪存存储器接口寄存器:不属于闪存,就是一个普通的外设,存储介质是SRAM
主存储器进行了分页,擦除和写保护都是以页为单位的,每页的大小都是1K。页的地址只要是以000、400、800、C00结尾的都一定是页的起始地址
Flash基本结构图
FPEC如何操作
RDPRT键是解除读保护的密钥,操作闪存的第一步就是解锁,最后一步就是加锁。
STM32内部的存储器是直接挂载在总线上的,因此我们可以直接使用指针来进行访问,读取是不需要进行解锁的。
volatile的作用就是可以防止我们的指定的代码被编译器优化,从而不会影响我们的功能,并且这样我们的变量不会经过缓存优化,直接从内存中找,这样我们对于变量的修改就可以及时的反应,保证数据更改的同步。
如果开启了编译器优化,在无意义加减变量,多线程更改变量,读写与硬件相关的存储器时都需要加上volatile,防止被编译器优化,如果默认不开启编译器优化,那么就可以不用加。
全擦除
MER为1指定的就是擦除,START为1就是芯片开始干活。然后芯片就会自动执行全擦除的过程。由于擦除需要时间,所以就要判断状态寄存器BSY(Busy)位是否为1,当为0的时候才会继续执行后面的流程。读出验证可以不用。
页擦除
编程/写入
STM32在写入闪存之前会检查指定地址有没有擦除,如果没有擦除就写入,那么STM32就不会执行写入的操作,除非写入的数据全是0.
字:Word是32位
半字:HalfWord是16位
字节:Byte是8位数据
选项字节
上表的意思就是在RDP写入数据的时候要同时在nRDP写入该数据的反码,如果芯片检测到这两个存储器不是反码的关系,那就代表数据无效,有错误。写反码的过程硬件会自动计算并写入。
选项字节擦除
在开始上面的流程之前也要先解锁闪存。