FLASH简介
FLASH闪存为通用名词,即掉电不丢失的存储器,例如SPI部分中的W25Q64芯片。本节闪存专指STM32内部闪存。
芯片的闪存容量(例如64k)通常指的是闪存中程序存储器的容量。
在编程过程中,任何读写闪存的操作都会使CPU暂停,直至此次闪存编程结束。例如,读写闪存时中断代码无法执行,中断无法及时响应,此时需慎用内部闪存存储数据。
STM32 加大容量XL系列有2个闪存,新加闪存为BANK2,其他系列(LD,MD,HD)仅1个闪存,即BANK1。
1)FLASH简介
在线编程ICP:STlink属于SWD协议下载,串口下载属于系统加载程序下载。
程序中编程IAP:在程序存储器中非程序运行部分写入Bootloader程序,更新程序时,控制程序存储器由程序运行部分跳转到Bootloader,在该部分接收任意通信接口的数据,再控制FLASH读写操作写入程序运行的部分,最后跳回程序运行部分或复位,此时程序更新完成。手写的Bootloader位于程序存储器,系统的Bootloader位于系统存储器。
2)存储器映像
3)闪存模块组织
(C8T6只有64k,即共64页)
主存储器即为程序存储器,信息块中的启动程序即系统存储器,用户选择字节即选项字节。闪存接口寄存器不属于闪存FLASH,属于RAM。
闪存接口寄存器只有擦除和编程,没有读取。读取存储器使用指针即可。
主存储器写入注意事项:写入前必须擦除(未擦除写入数据不执行并提出警告),擦除以最小单位进行(STM32的主存储器最小单位为页;W25C64先分为块BLOCK,再是扇区Sector),擦除后数据位全1,数据只能1写0,不能0写1,擦除和写入都要等待忙。
注:闪存内容位于单独的闪存手册中,不在stm32参考手册中。
4)FLASH基本结构
5)FPEC控制
(1)FLASH解锁
RAM的读写一般可直接进行,FLASH读写需要先解锁寄存器保护(未解锁寄存器保护就写入数据不执行并提出警告)。
KEYR又称钥匙寄存器或密钥寄存器,RDPRT为读保护,KEY1/2为写保护。
(2)使用指针访问存储器
__IO作用:volatile易变变量。 1.防止代码优化。KEIL编译器为最低优化等级,当提高优化等级时,编译器会去除无用的繁杂代码提高运行效率,在变量前加入可防止变量不被优化去除。2.阻止变量进入缓存区。当CPU要快速读写变量时,会把变量移入高速缓存区,但此时若其他外设(例如中断)修改变量值时,其修改的是存储器中的变量,此时CPU读取的缓存区的变量为错误值,加入该前缀即代表该变量为易变变量,无法移入缓存区。
6)擦写流程
(1)全擦除
MER=1即全擦除功能,STRT=1即开始执行,BSY=1即表示芯片忙。页擦除同理。
(2)页擦除
(3)闪存写入
每次只能写入半字16位数据,若要进行半字以下的数据写入或保证修改字节的同时保证另一个字节的数据不变,就只能整页操作,即把整页数据读到SRAM再修改SRAM数据,再把整页擦除并从SRAM中写入,因为SRAM的读写操作可随意进行。
7)选项字节
前缀为n即需要写入反码,由硬件自动计算并写入。
选项字节的位都为反逻辑,即1无效0有效,因为主程序擦除后的值默认为1。
(1)选项字节擦除
OPTWRE:操作选项字节解除闪存KEYR锁后还需解除OPTKEYR锁,OPTWRE为选项字节单独锁OPTKEYR的一位。该锁结构与KEYR类似。
(2)选项字节写入
8)器件电子签名
ID号作用:
FLASH寄存器
闪存锁
选项字节小锁
用于加载闪存里的选项字节内容,其内容与闪存里的选项字节内容对应。
对应闪存中选项字节中保护主存储器的写保护位。
模块实验
实验一:读写内部FLASH
1)接线图
注:可使用STM32 ST-LINK Utility直接读写芯片主存储器各地址内容。
同时可用于配置选项字节。
2)函数
371.解除FLASH写保护 372.启动FLASH写保护 373.主存储器页擦除 374.主存储器全擦除 375.选项字节全擦除 376.主存储器指定位置写入字 377.主存储器指定位置写入半字 378.选项字节写入自定义DATA0/1 379.选项字节写保护 380.选项字节读保护 381.选项字节用户选项3个配置位。
382.获取3个配置位,383-384写/读保护状态,DATA0/1获取需通过指针
386.中断使能 387-388.获取/清除标志位 389.获取状态 390.等待上一次操作
3)代码
1.MyFlash读取、擦除与编程
(1)读取
(2)擦除
(3)编程
2. Store参数数据的读写和存储管理
直接读写闪存不方便,效率低,容易丢失数据,所以在SRAM中定义数组,作为闪存的分身,SRAM更改时把数组整体备份到FLASH中(写操作),上电时把闪存里数据再初始化加载到SRAM中(读)。
该存储位置为主存储器最后一页,若要使用其他位置,则0X0800FC00参数需要改成宏定义。
为了防止程序或者保存在FLASH中的参数过长产生冲突,可在KEIL中更改程序的范围(图中光标位置)。其左边为下载程序开始位置,当使用IAP下载程序时,可将该位置改成手写的BootLoader起始位置。其右边为RAM的起始位置和范围。
Program Size:前2数相加为程序占用FLASH大小,后两数相加为程序占SRAM大小。
4)测试
(1)读FLASH
(2)擦除FLASH
按键1按下:全擦除
按键2按下:页擦除
注:两种擦除方式OLED依旧显示的原因是OLED内部有显存,保存了最后显示的数据,此时重新上电后两种擦除方式OLED都无显示数据,原因是全擦除后主存储器无数据,页擦除后程序损坏。
(3)写入FLASH
(4)RAM读写FLASH
按下KEY1变化数据,按下KEY2清除数据,断电或复位数据不丢失,则实验成功。
实验二:读取芯片ID
1)代码
2)实验现象
(知识自学习专题,课程资料来源江协科技)
(STM32模块完结)