stm32中的flash

总结stm32中的flash

前言

flash就是非易失性闪存,一般来说stm32需要外接flash芯片以扩大整个系统的内存大小。

这里的flash就是指stm32中的内部自带的flash存储,而不是额外的芯片。

stm32flash一般用来保存程序代码,或者是要求断电不丢失的数据

flash的模块组织

在stm32中根据不同的产品容量,有着不同的flash大小。我们主要记载中容量大小的flash。

下图是中容量大小的flash模块组织,这个flash的内存组织是需要牢记的

我们可以知道:

  • 主存储器就是 程序存储器
  • 信息块中的启动程序代码就是 stm32官方写的bootloader程序,就是系统存储器 和 stm32芯片的id号
  • 信息块中的用户选择字节就是 选项字节 或者说选择字节
  • 闪存存储器接口寄存器就是 flash的管理者,我们通过控制整个东西来控制整个flash,在手册中称之为闪存编程和擦除控制器(FPEC)

可以知道flash中可以修改的是 程序存储器、选项字节 系统存储器是无法修改的

FPEC模块

处理闪存的编程和擦除操作,它包括7个32位的寄存器:

  • FPEC键寄存器(FLASH_KEYR)

  • 选择字节键寄存器(FLASH_OPTKEYR)

  • 闪存控制寄存器(FLASH_CR)

  • 闪存状态寄存器(FLASH_SR)

  • 闪存地址寄存器(FLASH_AR)

  • 选择字节寄存器(FLASH_OBR)

  • 写保护寄存器(FLASH_WRPR)

只要CPU不访问闪存,闪存操作不会延缓CPU的执行。

选项字节

选择字节共有8个字节,由用户根据应用的需要配置;例如:可以选择使用硬件模式的看门狗或软件的看门狗。

在选择字节中每个32位的字被划分为下述格式:

flash编程

flash上的操作包括:

  • 页擦除、全擦除
  • 写数据
  • 加锁、解锁

擦除

flash中有两种方式来擦除,在flash的编程手册中提供了这两种擦除方式的程序过程图:

页擦除:

全擦除:

读、写数据(主闪存编程)

需要注意:

  • 对主闪存编程每次可以写入16位,每次非16位的编程都会导致FPEC产生总线错误。
  • 在写数据之前必须要先解锁falsh
  • 在读写flash时,任何读写flash的操作都会导致cpu暂停,直至此次闪存结束

加锁、解锁

复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块,这个特定的序列是在FLASH_KEYR写入两个键值(KEY1和KEY2,下面的键值);错误的操作序列都会在下次复位前锁死FPEC模块和FLASH_CR寄存器。

写入错误的键序列还会产生总线错误;

总线错误发生在第一次写入的不是KEY1,或第一次写入的是KEY1但第二次写入的不是KEY2时;FPEC模块和FLASH_CR寄存器可以由程序设置FLASH_CR寄存器中的LOCK位锁住,这时可以通过在FLASH_KEYR中写入正确的键值对FPEC解锁。

键值

共有三个键值:

RDPRT键 = 0x000000A5

KEY1 = 0x45670123

KEY2 = 0xCDEF89AB

相关函数

1
2



stm32中的flash
https://ysc2.github.io/ysc2.github.io/2024/02/14/stm32中的flash/
作者
Ysc
发布于
2024年2月14日
许可协议