FLASH模拟EEPROM

内部 flash 保存要运行的代码和常量 外部 flash 存储需要掉电保存的用户数据

STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32 位寄存器

序号 寄存器名称 缩写 主要功能
1 闪存访问控制寄存器 FLASH_ACR (你清单中缺少的) 处理等待周期和预取缓冲区。
2 闪存键寄存器 FLASH_KEYR 写入 KEY1/KEY2 以解锁 FLASH_CR
3 选择字节键寄存器 FLASH_OPTKEYR 解锁选择字节操作。
4 闪存状态寄存器 FLASH_SR 指示操作是否完成、是否有报错。
5 闪存控制寄存器 FLASH_CR 选择擦除/编程模式,启动操作。
6 闪存地址寄存器 FLASH_AR 告诉 FPEC 你要操作的具体地址。
7 选择字节寄存器 FLASH_OBR 指示当前选择字节的状态(读保护等)。

其中 FPEC 键寄存器总共有 3 个键值:

RDPRT 键 = 0X0000 00A5 解除 读保护(Read Protection)

KEY1 = 0X4567 0123

KEY2 = 0XCDEF 89AB

系统复位后,FLASH_CR 是被硬件锁定的(LOCK 位为 1),禁止任何擦除或编程操作。你必须先后向 FLASH_KEYR 寄存器写入 KEY1,再写入 KEY2。

STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据),当 FLASH_CR 寄存

器的 PG 位为‘1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数

据,FPEC 都会产生总线错误。在编程过程中(BSY 位为’1’),任何读写内存的操作都会使

CPU 暂停,直到此次闪存编程结束。

同样,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的

(其值必须是 0xFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。

FLASH相关HAL库函数:

评论