1、简介
EEPROM具有可byte write/byte read以及高达百万次可靠的擦写次数,通常被使用者用来存放程序中会时常变更的非挥发性资料。对于单晶片产品,通常不具有内建的EEPROM能够提供给使用者,而是基于Flash来存放使用者的资料。但是Flash的擦写次数无法与EEPROM比拟。现在我们提出一个机制,能够组合两个page以上的Data Flash来模拟EEPROM使用,使用SRAM加速读写资料的速度、能够达到百万次可靠的擦写次数、记录擦写循环次数,并且可以将资料量分成数个较小的资料群以减少Data Flash page数量。
● 使用 SRAM 加速读写资料速度
当进行资料写入的时候,会同步写入Data Flash和SRAM;一旦当前使用的Data Flash page已经写满,就会使用下一个Data Flash page,并且能够直接将SRAM存放的资料存入,节省一般将资料移入新的Data Flash page,需要搜寻全部Data Flash中已写入的资料的时间。 当需要读取资料的时候,可以直接由SRAM中读出资料,无须从Data Flash中寻找需要的资料,能够节省搜寻过程的时间,Data Flash中的资料只用来初始化SRAM。
● 达到百万次可靠的擦写次数
这样使用Data Flash模拟EEPROM的方法,能够使用byte write/byte read以及超过百万次可靠的擦写次数。
● 记录擦写循环次数
使用者可以由写入Counter的值了解Data Flash page的擦写循环次数。
● 将资料量分成数个较小的资料群以减少 Data Flash page 数量
对于NuMicro® Cortex®-M0系列,如图 1-1所示,如果使用者需要存放的资料量增加,为了满足要求的可靠擦写次数,需要的Data Flash page数量会大量增加。因此,我们建议使用者可以将 要存放的资料量分成数个较小的资料群,利用较少的Data Flash page数量就可以达到需要的可靠擦写次数。
2、模拟EEPROM
本节将介绍如何使用Data Flash模拟EEPROM,并且利用SRAM加速资料读写的速度。
2.1 机制原理
在使用Data Flash模拟EEPROM时,使用者必须使用至少2个page以上的Data Flash,并且将每一page的Data Flash,以每两个字节为单位划分成若干个区块,如图 2-1所示,以NuMicro®Cortex®-M0系列为例,每一个page的Data Flash大小为512字节。第一个区块记录目前擦写循环次数的Counter值,其余存放资料的地址和值。同时SRAM也划分一个区块,用来记录存放的资料。当使用者要存放资料的时候,会将资料的地址和值依序写到第一个Data Flash page,并且将值 写入对应地址的SRAM。如果第一个Data Flash page的空间被写满时,会将目前已写入的有效资 料(非0xFF) 从SRAM整理到第二个Data Flash page,并清除第一个Data Flash page。
使用SRAM来存放资料,可以减少从Data Flash读取资料的时间;当Data Flash page写满要将资料整理到下一个Data Flash page的时候,直接从SRAM读出资料,无须从Data Flash中寻找需要的资料,能够节省搜寻Data Flash中有效资料的时间。
Counter值能夠帮助使用者了解,目前已经使用过的可擦写次数。使用者可以有效掌握剩余的可靠擦写次数,推算产品的可用年限。
2.2 初始化Data Flash
在使用者开始执行主程序前,首先需要初始化要调用的Data Flash page。由于只有保存资料的Data Flash page具有有效的Counter值(非0xFFFF),我们可以通过寻找有效的Counter值来找出保存资料的Data Flash page。接着除了指向可以写入资料的地址,还需要将已保存的资料写到SRAM。详细流程请参考图2-2,并请考函数Init_EEPROM()和Search_Valid_Page()。
2.3 写入资料
当使用者有资料写入的时候,首先比对是否已与SRAM中的资料相同。如果资料相同,则不需要执行写入,略过写入资料步骤;如果资料不同,则需要更新资料。
资料写入时,会同时写入到Data Flash和SRAM,接着判断目前使用的Data Flash page是否已经写满。如果还有未写入的空间,就指向下一个地址;如果Data Flash page已经写满,则将SRAM中有效的资料(非0xFF)写入下一个调用的Data Flash page储存。 相对于一般需要搜寻整个Data Flash page的方式,直接从SRAM中写入有效资料,可以大幅缩 短,当目前Data Flash page已经写满,要调用下一个Data Flash page的时间。
如果目前使用的Data Flash page已经是可调用的最后一个Data Flash page,就将Counter增加计数1,再将SRAM中有效的资料(非0xFF)写入第一个可调用的Data Flash page。
使用者可以读取Counter的值,了解目前已经使用过的可擦写次数。
完成资料写入后,清除已写满的Data Flash page。当有新的资料需要写入的时候,将写入新的Data Flash page。
2.4 读取资料
读取资料的时候,只需要将SRAM中的值读出即可,不需要从Data Flash page中寻找最后更新的资料,可以大幅节省读取资料需要的时间。详细流程请参考图 2-4,并请参考函数Read_Data()。
2.5 读取 Counter 值
使用者可以读取Counter的值了解目前Data Flash page已经使用多少次可擦写循环,并推算目前剩余的可靠擦写次数。请参考函数Get_Cycle_Counter()。
2.6 资料读写范例
在主程序运行之前,首先需要初始化Data Flash。如图 2-5所示,我们选择组合两个page的Data Flash来模拟EEPROM使用。初始化过程会先找出目前储存有效资料的Data Flash page,Page 1,并将有效资料(非0xFF)放入SRAM。此范例中储存的资料量为8个字节,在SRAM中以队列方式存放这些资料。最后指向下一个可以写入资料的地址。
当使用者要写入0x07[0x68] (地址[资料]) 的时候,如图 2-6所示。首先会判断与SRAM中的资 料是否相同。由于目前SRAM中的值与0x68不相等,因此会将资料的地址和值写入Data Flash的区块,并且将值写入对应地址0x07的SRAM阵列中。因为目前的Data Flash page并未写满,仅需要指向下一个可以写入资料的地址即可。 |
|