目录
1. 简介
2. 闪存模块组织
3. FLASH基本结构
4. FLASH解锁
5. 使用指针访问存储器
6. 程序存储器全擦除
7. 程序存储器页擦除
8. 程序存储器编程
9. 选项字节
1. 简介
STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程。
读写FLASH的用途:
利用程序存储器的剩余空间来保存掉电不丢失的用户数据;
通过在程序中编程(IAP),实现程序的自我更新。
在线编程(In-Circuit Programming – ICP)用于更新程序存储器的全部内容,它通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序。
JTAG调试接口(JTAG-DP)提供基于JTAG(Joint Test Action Group 联合测试行动小组)协议的5线标准接口。
SWD调试接口(SWD-DP)提供基于SWD(Serial Wire Debug 串行线调试)协议的2线标准接口。
在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口下载程序。
2. 闪存模块组织
小容量产品:是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
中容量产品:是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
大容量产品:是指闪存存储器容量在 256K 至 512K 字节之间的 STM32F101xx和STM32F103xx微控制器。
3. FLASH基本结构
4. FLASH解锁
FPEC共有三个键值:
RDPRT键 = 0x000000A5
KEY1 = 0x45670123
KEY2 = 0xCDEF89AB
解锁:
复位后,FPEC被保护,不能写入FLASH_CR
在FLASH_KEYR先写入KEY1,再写入KEY2,解锁
错误的操作序列会在下次复位前锁死FPEC和FLASH_CR
加锁:
设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR
5. 使用指针访问存储器
使用指针读指定地址下的存储器:
uint16_t Data = *((__IO uint16_t *)(0x08000000));
使用指针写指定地址下的存储器:
*((__IO uint16_t *)(0x08000000)) = 0x1234;
其中:
#define __IO volatile
6. 程序存储器全擦除
可以用整片擦除功能擦除所有用户区的闪存,信息块不受此操作影响。
过程:
① 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
② 设置FLASH_CR寄存器的MER位为’1’;
③ 设置FLASH_CR寄存器的STRT位为’1’;
④ 等待BSY位变为’0’;
⑤ 读出所有页并做验证。
7. 程序存储器页擦除
闪存的任何一页都可以通过FPEC的页擦除功能擦除。
过程:
① 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
② 设置FLASH_CR寄存器的PER位为’1’;
③ 用FLASH_AR寄存器选择要擦除的页;
④ 设置FLASH_CR寄存器的STRT位为’1’;
⑤ 等待BSY位变为’0’;
⑥ 读出被擦除的页并做验证。
8. 程序存储器编程
对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为’1’),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。
过程:
① 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;
② 设置FLASH_CR寄存器的PG位为’1’;
③ 在指定的地址写入要编程的半字;
④ 等待BSY位变为’0’;
⑤ 读出写入的地址并验证数据。
这种模式下CPU以标准的写半字的方式烧写闪存,FLASH_CR寄存器的PG位必须置’1’。FPEC先读出指定地址的内容并检查它是否被擦除,如未被擦除则不执行编程并在FLASH_SR寄存器的PGERR位提出警告(唯一的例外是当要烧写的数值是0x0000时,0x0000可被正确烧入且PGERR位不被置位);如果指定的地址在FLASH_WRPR中设定为写保护,则不执行编程并在FLASH_SR寄存器的WRPRTERR位置’1’提出警告。FLASH_SR寄存器的EOP为’1’时表示编程结束。
字(Word):32位长的数据或指令
半字(Half Word):16位长的数据或指令
字节(Byte):8位长的数据或指令
9. 选项字节
选择字节共有8个字节,由用户根据应用的需要配置;例如:可以选择使用硬件模式的看门狗或软件的看门狗。
在选择字节中每个32位的字被划分为下述格式:
选择字节块中选择字节的组织结构如下:
RDP:写入RDPRT键(0x000000A5)后解除读保护
USER:配置硬件看门狗和进入停机/待机模式是否产生复位
Data0/1:用户可自定义使用
WRP0/1/2/3:配置写保护,每一个位对应保护4个存储页(中容量)
选项字节编程:
① 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
② 解锁FLASH_CR的OPTWRE位
③ 设置FLASH_CR的OPTPG位为1
④ 写入要编程的半字到指定的地址
⑤ 等待BSY位变为0
⑥ 读出写入的地址并验证数据
选项字节擦除:
① 检查FLASH_SR的BSY位,以确认没有其他正在进行的闪存操作
② 解锁FLASH_CR的OPTWRE位
③ 设置FLASH_CR的OPTER位为1
④ 设置FLASH_CR的STRT位为1
⑤ 等待BSY位变为0
⑥ 读出被擦除的选择字节并做验证
STM32F1之I2C通信-CSDN博客
STM32学习笔记_时光の尘的博客-CSDN博客