1. 简介
FLASH 和 EEPROM 都是非易失性储存器,在掉电后数据还会保留。FLASH 和 EEPROM 最 大的区别是擦除方式不同,EEPROM 可以按字节进行擦除,但 FLASH 最小擦除单位是页,一 页通常包含多个字节甚至几 K 字节。FLASH 和 EEPROM 擦写属性决定了 EEPROM 容量小 但擦写寿命比较高,而 FLASH 容量非常大,但擦写寿命短。 在 MCU 主频高的情况下,可以采用 FLASH 模拟 EEPROM 来降低成本。
本文介绍了一种采 用 FLASH 模拟 EEPROM 的方法,实现了 EEPROM 按字节进行数据修改,可防止复位或掉 电产生的数据丢失,当采用的 FLASH 存储空间越大,EEPROM 性能越好。
2. EEPROM 备份区结构
本文以63页DATA FLASH模拟2K字节EEPROM来介绍FLASH模拟EEPROM的方法。
2.1. GD32A50x FLASH 简介
GD32A50x提供高达384KB片上FLASH,其中bank0 256KB,bank1 128KB。基地址和大小如 表2-1. 384KB闪存基地址和大小所示。
表 2-1. 384KB 闪存基地址和大小
2.2. EEPROM 数据备份结构
表 2-2. FLASH 页数据备份存储结构1
表 2-2. FLASH 页数据备份存储结构2
3. FLASH 模拟 EEPROM
方案 3.1. 算法实现
3.1.1. 参数宏
表 3-1. 参数宏
3.1.2. API 函数
函数 eeprom_init 函数 eeprom_init 用于初始化 EEPROM 备份区,并获取当前正在用于 EEPROM 备份的 FLASH 页相对编号。
表 3-2. EEPROM 初始化1
表 3-2. EEPROM 初始化2
表 3-2. EEPROM 初始化3
函数 eeprom_write
函数 eeprom_write 用于索引当前可写的地址,并将数据写到对应 FLASH 地址。注意该函数 的入参 ee_addr 是模拟 EEPROM 地址,范围为 0-135。
表 3-3. EEPROM 写函数
表 3-3. EEPROM 写函数1
表 3-3. EEPROM 写函数2
表 3-3. EEPROM 写函数3
3.1.3. 测试结果
测试在 EEPROM 中改写第一个字节共 16 次。写入数据如图 3-1. 读写数据所示。
图 3-1. 读写数据
代码如表 3-5. 测试 demo 所示。
表 3-5. 测试 demo
表 3-5. 测试 demo2
测试结果如图 3-2. EEPROM 备份区数据所示
图 3-2. EEPROM 备份区数据 图 3-2. EEPROM 备份区数据