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