新闻  |   论坛  |   博客  |   在线研讨会
如何使用Flash模拟EEPROM
美男子玩编程 | 2024-01-17 14:00:54    阅读:124   发布文章

在讲解这篇博文前,首先要明白为什么使用Flash存储来模拟EEPROM?

主要有以下几个原因:

  • 成本效益:许多微控制器(MCU)和系统芯片(SoC)内置有Flash存储,但没有专门的EEPROM。使用已有的Flash存储模拟EEPROM可以减少额外硬件成本。

  • 更大的存储容量:通常,Flash存储提供比EEPROM更大的存储容量。这使得在没有牺牲太多物理空间的情况下可以存储更多数据。

  • 灵活性和可扩展性:通过软件,可以灵活地设计和调整EEPROM模拟的大小和结构,以适应不同的应用需求。这种方法比使用固定大小的物理EEPROM更具可扩展性。

  • 数据持久性:尽管Flash存储的写入次数有限,但它仍然能够提供足够的耐用性来满足大多数应用的需要。通过适当的数据管理,可以最大限度地延长Flash存储的寿命。

  • 数据保护和安全性:许多现代微控制器提供了Flash存储的安全功能,如写入保护、加密等,这有助于保护存储在Flash中的数据不被未经授权访问。

  • 易于编程和集成:使用Flash存储来模拟EEPROM可以充分利用现有的Flash编程工具和技术,同时也简化了硬件设计。

在使用Arduino开发时,有个内置库可以使用Flash模拟EEPROM,极大方便了嵌入式数据存储的开发。

如果使用库函数,只是知道调用API,很难理解Flash模拟EEPROM的原理和方法,本篇博文将以AT32F413(flash:256KB)这款MCU为例,详细介绍如何使用Flash模拟EEPROM。

实现代码:https://download.csdn.net/download/m0_38106923/88717668

1

FLASH与EEPROM简介

FLASH和EEPROM都为非易失性存储器,在断电后数据仍然可以长期保存,这为FLASH模拟 EEPROM提供了条件,FLASH与EEPROM特点对比如下表所示:

图片


FLASH模拟EEPROM优点:  

  • 低成本:可节约一颗EEPROM芯片;  

  • 存储、读取速度快:通讯速度快于使用I2C或者SPI通讯的EEPROM元件;  

  • 抗干扰能力强:由于FLASH在单片机内部,不会存在通讯总线被外部干扰的问题;  

  • 容量可调:可根据实际使用,灵活调整存储空间大小。

2

FLASH模拟EEPROM原理

2.1、EERPOM数据结构

由于FLASH在写入数据前,需要将FLASH数据先擦除为0xFF,而FLASH擦除时通常为扇区擦除,例如AT32F403A的扇区大小为2K字节,这个特性决定了不能简单将旧数据擦除然后写新数 据,因为这样会导致存储在这个扇区内的其他数据也被擦除,并且也会导致FLASH频繁擦除而降低 其使用寿命。  

所以FLASH模拟EEPROM的思路是:

  • 新数据存储不影响旧数据; 

  • 尽量减少FLASH擦除次数,延长FLASH使用寿命。  

基于以上的考虑,我们设计了以下存储结构:


图片


EERPOM结构

EEPROM由两个页组成:页0和页1,在使用的时候,1个页处于有效状态,另外一个页处于擦除 状态,读取或者写入数据都在有效状态的页进行。  

数据格式  

存储的数据格式为数据 + 数据地址,地址和数据都是16位方式存储,每一次存储占用32位也就是 4个字节。图中data列为数据,data address列为数据地址,flash address列为数据存储的实际 flash地址偏移量。例如上图中页0的flash address=12处,数据为0x3003,数据地址为0x0002。  

页状态标志  

在第一个数据存储区,存储页状态标志status,页状态标志有3种:  

  • 有效状态:EE_PAGE_VALID,status = 0x0000,读取和写数据在此页进行;  

  • 数据转移状态:EE_PAGE_TRANSFER,status = 0xCCCC,另外一页满了,正在传输有效数 据到本页;  

  • 擦除状态:EE_PAGE_ERASED,status = 0xFFFF。  数据写入  每一次写入数据前,都会从页起始地址开始寻找第一个未存储数据的区域(值为0xFFFFFFFF),然后将待写入的数据和数据地址写到未存储数据的区域。例如上图中页0的flash address = 20处,值 为0xFFFFFFFF,就是第一个未存储数据的区域。  

当知道了页的大小后,就可以算出最大的变量存储个数:页容量/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空为例):  

  • 将页1状态标记为数据传输状态(EE_PAGE_TRANSFER);  

  • 将所有有效数据复制到页1;  

  • 擦除页0;  

  • 将页1状态标记为有效状态(EE_PAGE_VALID)。

EEPROM写入流程如下所示:


图片


2.2、EERPOM物理结构

实现的EEPROM结构如下图所示,一个页可以由1个或者多个扇区组成,可以根据实际应 用灵活的选择扇区数量,扇区数量越多,可以存储的数据量就越多。通常EEPROM存储区定义在整 个FLASH末尾,这样程序的烧录、执行和EEPROM区域互不影响。


图片



*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客