目录
在讲解这篇博文前,首先要明白为什么使用Flash存储来模拟EEPROM?
主要有以下几个原因:
在使用Arduino开发时,有个内置库可以使用Flash模拟EEPROM,极大的方便了嵌入式数据存储的开发。
如果使用库函数,只是知道调用API,很难理解Flash模拟EEPROM的原理和方法,本篇博文将以AT32F413(flash:256KB)这款MCU为例,详细介绍如何使用Flash模拟EEPROM。
FLASH和EEPROM都为非易失性存储器,在断电后数据仍然可以长期保存,这为FLASH模拟?EEPROM提供了条件,FLASH与EEPROM特点对比如下表所示:
FLASH模拟EEPROM优点:??
由于FLASH在写入数据前,需要将FLASH数据先擦除为0xFF,而FLASH擦除时通常为扇区擦除,例如AT32F403A的扇区大小为2K字节,这个特性决定了不能简单的将旧数据擦除然后写新数?据,因为这样会导致存储在这个扇区内的其他数据也被擦除,并且也会导致FLASH频繁擦除而降低?其使用寿命。??
所以FLASH模拟EEPROM的思路是:
基于以上的考虑,我们设计了以下存储结构:
EERPOM结构??
EEPROM由两个页组成:页0和页1,在使用的时候,1个页处于有效状态,另外一个页处于擦除?状态,读取或者写入数据都在有效状态的页进行。??
数据格式??
存储的数据格式为数据?+?数据地址,地址和数据都是16位方式存储,每一次存储占用32位也就是?4个字节。图中data列为数据,data?address列为数据地址,flash?address列为数据存储的实际?flash地址偏移量。例如上图中页0的flash?address=12处,数据为0x3003,数据地址为0x0002。??
页状态标志??
在第一个数据存储区,存储页状态标志status,页状态标志有3种:??
当知道了页的大小后,就可以算出最大的变量存储个数:页容量/4-1。例如当页大小为1K时,最大?可存储的变量数量为1024/4-1=255。需要注意的是,在实际使用中,应该尽量留出较多的空闲容?量,这样可以减小FLASH擦除次数,提高FLASH寿命。??
另外数据地址不可以超过最大能存储的变量数量,例如当页大小为1K时,最大可存储的变量数量为?1024/4-1=255,那么数据地址data?address不可以大于255。
数据读取??
每一次读取数据都会从页结束地址开始向前寻找最后一个存储的有效数据,例如现在要读取地址为?0x0000的数据。从上图中看到flash?address?=?4和flash?address?=?16都是地址为0x0000的数?据,因为最后一次存储的数据为flash?address?=?16处的数据,所以此时读取地址0x0000的数据为?0x1234。??
数据转移??
当一页数据存满了之后,会将数据传输到空闲页,将会执行以下操作(以页0满,页1空为例):??
EEPROM写入流程如下所示:
实现的EEPROM结构如下图所示,一个页可以由1个或者多个扇区组成,可以根据实际应?用灵活的选择扇区数量,扇区数量越多,可以存储的数据量就越多。通常EEPROM存储区定义在整?个FLASH末尾,这样程序的烧录、执行和EEPROM区域互不影响。