MCU模拟eeprom基本功能

来源:互联网 发布:淘宝店推荐 知乎 编辑:程序博客网 时间:2024/05/19 12:15

 MCU模拟eeprom基本功能

 

如果你的MCUflash足够大。并且你的MCU提供自编程flash指令。则可以通过flash模拟出一片eeprom区域。用于存储数据
       本文参考ST公司AN2594文档。使用ST提供的范例。旨在了解如何使用Flash模拟出一片eeprom。






       由表我们得到擦除时间的比较。内部模拟的显然速度快了。然而我要提醒的是如果你存放于模拟EEPROM的数据需要频繁更改。这里的频繁指的是时间小于页擦除时间。由于模拟的eeprom是使用flash,所以只能整页进行擦除。所以建议频繁修改的数据不要使用模拟的eeprom。但是如果只是单纯存放掉电前的数据或者1s钟记录一段数据则是可以考虑的。这样可以节省外部eeprom的成本。




       上图我们得到ST公司提供的例程是使用两页的flash进行模拟。为什么用两页呢。如果只用一页,我考虑了一下。由于只有一页。数据只能一直往下写。会有满的时候。而且更改数据后。前面的数据不会被擦除。当其中一页写满了。就会将该页不重复的数据由下到上得搬到第二页,同时擦除第一页。


        这张图就是最关键的一张图。有利于了解如何存放数据和读取数据。模拟出的eeprom有两部分组成。分别是虚地址和数据。都为16bit。虚地址存在在高位。数据存在低位。
       比如一开始在虚地址0x7777H写入数据0x1232H。数据存放如图所示。如果再在同一地址写入另外一个数,则数据存在下一个位置。但是前面的数据并不会马上被擦除掉。如果此时要使用ST的函数读取0x7777H虚地址的数据。那么读出来的是0X1245H而不是0x1232H。因为读取的时候是从下往上读取。读取到第一个符合该地址的数据。这样就很好理解了。
        当数据写满的时候。这时写入的新数据将被存在第二页。此时会自动调用函数将第一页不重复的数据拷贝到第二页。比如我们的虚地址0X7777H和0X5555H的数据。如图所示。然后将第一页擦除。两页交替使用。说到这里,你也许明白为什么频繁修改的数据不适合存在模拟的eeprom里面了。如果频繁修改。那么很快一页就写满了。然后需要擦除这一页。需要20ms。后面的事你都明白啦?
       由于我的知识有限,只能了解那么多。如果要将程序移植到别的单片机。可以参照这样的思路。呵呵。

下面是一点学习心得。
// Note  By ChenFen
/*
1.使用STM32内部Flash 模拟EEPROM进行读写,定义两页Flash分别为page0 page1
     Flash模拟的起始地址修改位置为eeprom.h中的EEPROM_START_ADDRESS
2.修改eeprom.h 文件中的 NumbOfVar 实现所需存储变量数量
3.修改 VirtAddVarTab[NumbOfVar] 实现虚拟地址的修改
4.写入时写入数据紧跟后面写入虚地址VirtAddVarTab(0<=i<NumbOfVar)
5.每个Page第一个地址写入该页状态(Earse,Reveice,Vild)
6.相同地址再次写入时不会把上次写的擦掉,而是在模拟EEPROM区尾部未写过的地方再次写入数据、  虚地址,
   读的时候是从尾部开始匹配地址,也就是读取最后一次写的内容。
    7.模拟EEPROM区分为2页,如果一页满了把这一页内地址不重复的数据复制到另一页后擦除,2页交替使用。
8.添加字符串存储函数,改变为1个16bit地址存储两位字符串的8bit ASCII码

 

 

STM32的应用手册AN2594提供内部Flash模拟EEPROM的方法,此方法可以很好的应用于外部Flash其他带内部Flash的MCU上。

1.Flash与EEPROM的区别

EEPROM:Electrically erasable programmable read-only memory,电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。

Flash:闪存,它结合了ROM和RAM的长处,不仅具备EEPROM的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失。

EEPROM需要更多的元件及硅,为了降低系统成本,较多的MCU均使用Flash代替EEPROM存储代码及数据。

 

  EEPROM FLASH 写入时间

几毫秒

随机字节:5-10ms

页:字/100us(5-10ms/页)

 字编程时间:20us 擦除时间 无 页/片擦除时间:20ms 写入方式

一旦启动,无需CPU干涉

只需要供电 

 一旦启动,需要CPU干涉 读访问

串行:100us

随机字:92us

页:字节/2.25us

 并行:100ns

字/几个CPU周期

访问时间:35ns

 写/擦除

周期

 10K-1000K周期 10K-100K周期

  • Flash写访问速度快;
  • 外部串行EEPROM写入不会受CPU复位影响,适当的去耦电容可以保持写入的完成;
  • EEPROM不需要擦除,Flash擦除需要时间,Flash的软件设计需要充分考虑复位及中断情况;

2.实现EEPROM模拟

FLASH模拟EEPROM【STM32_AN2594】

至少需要两个大小一样的页:一个提供逐字编程,另一个提供接收前页数据。当其中一页写满了。就会将该页不重复的数据由下到上得搬到第二页,同时擦除第一页。每页的前16位半字标记页状态。

页有三种状态:

  • 擦除:空白页;
  • 接收数据:从其他整页接收数据;
  • 有效用页:包含有效数据,知道所有有效数据转移到其他页才改变状态;

每个变量元素包含虚地址和数据,以便搜索和更新。当数据修改后,修改后的虚地址和数据保存在一个新的位置,取数据时返回最后的数值。FLASH模拟EEPROM【STM32_AN2594】

从上面这幅图了解如何存放数据和读取数据。模拟出的EEPROM有两部分组成,分别是虚地址和数据,都为16bit。虚地址存在在高位,数据存在低位。

比如一开始在虚地址0x7777H写入数据0x1232H。数据存放如图所示。如果再在同一地址写入另外一个数,则数据存在下一个位置。但是前面的数据并不会马上被擦除掉。如果此时要读取0x7777H虚地址的数据。那么读出来的是0X1245H而不是0x1232H。因为读取的时候是从下往上读取。读取到第一个符合该地址的数据。

当数据写满的时候。这时写入的新数据将被存在第二页。此时会自动将第一页不重复的数据拷贝到第二页。比如我们的虚地址0X7777H和0X5555H对应的数据,紧接0X6666H。如图所示。然后将第一页擦除。两页交替使用。写入数据的过程判断该页是否已满,从上往下搜索,找到FFFF,就可以直接写入。若搜索完整页,均无FFFF,说明该页已满,需要写入下一页,并执行搬移与擦除操作。

数据需要频繁更改,不建议使用次方式。

 

 

原创粉丝点击