STM32F1之FLASH闪存

目录

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博客

  • 31
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光の尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值