实例谈一谈Flash模拟EEPROM
谷子
|
2019.12.24
|
0
+关注

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数据也正常。

精选留言
延伸阅读
2020.04.03
4749阅读
更多报告干货
写留言
2803
阅读
收藏
回到顶部