FEE 模块作为底层驱动层和上层应用层之间的一个中间层,通过物理地址映射、索引号抽象化,完全屏蔽了对底层硬件的复杂操作。降低上层应用程序开发人员的开发难度,提高开发效率,使用更灵活。用户再也不用担心EEPROM 空间受限,有效的降低了开发成本。本篇我们介绍使用Flash两个单独的区域来实现EEPROM的模拟。
1. 什么是FEE?
EEPROM: Electrically Erasable and Programmable ROM(Read Only Memory)(电可擦写只读存储器),支持Bytes擦写,写周期长,擦写数据时电流比Flash大,容量低(KB数量级),常用于低端产品中。
Flash:闪存。“闪存”也是一种非易失性的内存,只能块擦除,擦写速度快,功耗低 ,兆数量级或更大。
FEE: Flash EEPROM Emulation (闪存模拟电可擦只读存储器),FEE取长补短,综合两者优势。
2. FEE机制
至少需要两块相同大小的未使用的 Flash 区域,该区域是指最小擦除单位(Section)。用户所需要保存的数据总量不能大于一个Section 的大小。如果用户数据量太大,可以选择 Section 大小比较大的区域,也可以采用多个连续 Section 合并的方法来解决。
每次写入操作时,先根据Bank索引号找出当前页,然后遍历当前页中的已有记录,直到找出下一个空记录地址,向下一个空的地址写入BlockNum来标志该单元被使用,然后写入用户数据。读取时,通过Block索引号获取物理地址,然后读出它的数据空间。写入时,如果当前页面剩余的空间不足写入一个新的记录,则新纪录被写入另一页。这样的实现模型交替使用FLASH的两页来保存EEPROM数据。
3. FEE_Read流程图
4. FEE_Write流程图
5. 实例调试
本例基于MPC5744P平台,用两个16KB的页来模拟内部EEPROM。
配置Bank信息如下:
{0X00,0X00800000U,16 KB,0X00803FFFU},/*bank号,起始地址,地址长度,末尾地址*/
{0X01, 0X00804000U, 16 KB, 0X00807FFFU}
配置Block信息如下:
{0x10U,8U,FALSE,200U,0U},/*Block号,Block长度,是否支持立即数,周期,是否支持NvM*/
{0x11U, 10U, FALSE, 200U, 0U},
定义一个testFeeBlock数组作为写入的数据。
uint8_t testFeeBlock[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
执行写和读的操作。
Fee_Write(0x10, testFeeBlock);
Fee_MainFunction();
Fee_Read(0x10, 0, testFeeReadBlock, 8);
Fee_MainFunction();
执行写FEE操作之后,查看0x00800000内存地址的数据,可发现数据已经被写入。
执行读FEE操作之后,查看变量testFeeReadBlock,发现数据已经正确读出。
在100ms任务内循环写入该Block,不定时查看两个页面的数据,可发现页的交替正常,并且读出的Block数据也正常。