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库函数:
