STM32——Flash闪存
以上部分,主存储器:程序存储器;
启动程序代码:系统存储器;
用户选择字节:选项字节
以下是闪存的管理员,用于擦除和读写的地址
C8T6一共64K,主存储器为64页
以下是整体框图:
FLASH的整体流程:
1、解锁+加锁
通过键寄存器对FLASH进行解锁(先用KEY1解锁,再用KEY2解锁),上一步完成后,要尽快加锁:加锁的时候在LOCK位写1即可锁住
2、使用指针访问存储器
读取寄存器地址为0X08000000的内容,将其强制转换为16位的指针类型,前一个*表示:指针取内容,将该地址下的内容取出(不需要解锁那一步,写才需要)
__IO用了define定义为变量,当编译器没有优化的时候,这个可加可不加,但是当编译器优化时,为防止有些必须代码被优化掉,可在其前加__IO,防止被优化
3、全擦除过程
在程序中,并没有判断LOCK位是否为1的过程,直接执行解锁功能
也不会去读出并验证所有页的数据
此时的信息块(系统存储器+选项字节)不受影响
闪存页擦除
4、写编程
如果需要写入很多数据就不断调用写入程序即可
5、选项字节的擦除(了解)
6、选项字节写入(了解)
7、器件电子签名(了解)
代码部分:
首先是编写MyFlash文件,包含写编程、擦除和读的程序;
之后再建立一个实现参数读写和存储管理功能的Store,其中建立一个数组用于放置掉电不丢失的数据,调用函数自动备份到Flash中;
之后在主函数通过写入数据调用store的数组,并备份到Flash中,实现任意读写参数,掉电不丢失功能
1、MyFlash
读取函数(32位、16位、8位)
全擦除函数
页擦除函数:
编程字节:
2、store模块
(1)先定义一个SRAM数组,用于管理FLASH最后一页数据,实现参数的任意读写和保存,需要备份再统一转到闪存中
512:16位2字节正好对应闪存一页1024字节
(2)判断闪存是否是第一次初始化
判断该页地址下的第一个半字是否是A5A5——不是,则表明第一次初始化,先进行页擦除——在该页的第一个半字处写入A5A5——将剩余的字节均写为0
(2)上电后将闪存的数据全都转移到SRAM中,保证掉电数据不丢失(闪存——SRAM的数据转移)
(3)SRAM——闪存的数据转换函数
(4)清除所有数据函数(先将SRAM的数据清零——再将数据从SRAM转移到闪存)
主函数:除了初始化各类函数外,主要实现按键1按下数据增加
按键2按下数据全部清0
数据掉电不丢失且复位也不会改变
实验结果如下:
FLASH
读取芯片ID:
直接在main中编写:
显示结果:
STM32江科大老师的视频完结!