1. Flash 与 EEPROM 核心特性差异
- EEPROM:非易失存储,支持单字节擦写,改写无需整扇区擦除。
- APM32F4xx 内置 Flash:非易失存储;擦除操作强制按扇区执行;单字节只可以把 1 写为 0,无法直接把 0 写回 1;想要恢复为 0xFF,必须执行整个扇区擦除。
软件模拟 EEPROM 本质就是用 RAM 缓冲补偿 Flash “只能扇区擦除” 硬件限制。
资料获取:AN1094_APM32F4xx Flash模拟EEPROM 应用笔记
2. 模拟 EEPROM 写、读操作完整原理流程
写操作完整步骤(原文)
- 在 RAM 开辟一块与 Flash 扇区大小完全一致的缓冲区;
- 将目标 Flash 扇区全部原始数据读取至 RAM 缓冲区;
- 在 RAM 缓冲区修改需要更新的目标字节;
- 判断扇区是否已经处于擦除状态(全 0xFF);非擦除状态,执行扇区擦除;
- 将 RAM 缓冲区完整写回 Flash 扇区。
读操作完整步骤
Flash 读操作等同于普通内存直接寻址读取,直接指针解引用读取指定地址字节: *(uint8_t*)地址,不需要缓冲区、不需要擦除动作。
3. 方案三大核心技术难点与文档给出解决对策
- RAM 缓存大小约束 扇区 5‑11 大小 128KB,模拟 EEPROM 需要同等大小 RAM 缓存;APM32F4xx 最大可用 RAM 达不到 128KB。 ✅对策:只选用 16KB 规格扇区(扇区 1‑3),RAM 仅需要 16KB 缓冲区。
- 扇区 0 风险 扇区 0 是程序启动扇区,上电从此处取指令;如果用作模拟 EEPROM,擦除会破坏程序代码,造成系统死机。 ✅对策:禁止使用扇区 0;模拟 EEPROM 只能分配扇区 1、2、3。
- 部分字节改写冲突 Flash 不能单字节擦除,如果直接改写扇区内局部字节,新旧数据混杂,产生数据错乱。 ✅对策:每次局部修改,先把整个扇区读到 RAM 缓存,修改缓存,擦除扇区,回写完整扇区内容。
4. 存储扇区、RAM 缓存运行机制
- Flash 存储区:扇区 1‑3(16KB)作为非易失数据保存介质;编译通过
__attribute__((section(...)))指定段地址,防止编译器链接把应用代码覆盖模拟 EEPROM 的 Flash 区域。 - RAM 缓冲区:必须和选用 Flash 扇区尺寸相等;写操作时临时保存扇区全部原始数据,避免擦除扇区时未修改的数据丢失。
5. OTP、选项字节不可用于模拟 EEPROM 的原因
阅读全文
80