FLASH和EEPROM芯片延长擦写次数的优化方法

  • 浏览(123次)

我们在电子产品开发时,时常需要断电后保存某些数据,这就需要使用FLASH或者EEPROM芯片,这两种芯片,可擦除的次数是有限制的,通常FLASH为10万次,EEPROM要多一点,为100万甚至1000万次。FLASH的擦除不能单个字节进行,有一个最小单位,存储容量相对比较大,适合大量数据的存储;EEPROM可以单个字节进行擦除,存储容量不大,只适合存储少量的设置数据。

先以FLASH和EEPROM需要写入一个字节为例来说明新数据是如何写入的。假定都是在首地址要写入新数据0x55。
对于FLASH,写操作只能将数据位从1改写为0,如果想要将数据位从0改为1,就需要进行擦除操作,而且这个擦除最小单位是page(可能是256字节或更多)。现在要在首地址写入0x55,稳妥的方法是先擦除这个地方,也就是要擦除第一个page,擦除操作会一并将首地址后面的另外255个字节也擦除掉,如果这255个字节保存有其它数据,还需要把这些数据先进行备份,擦除第一个page后再将0x55和备份的255个字节写进去。也不是必须擦除第一个page,写操作可以完成数据位1到0的转变,利用这一特性结合首地址原来的内容,我们就有可能不用进行擦除操作,比如原来内容为0xFF,显然可以直接写入0x55,原内容为0xF5,同样也可以写入0x55,但如果原内容为0xAA,执行写0x55则会得到完全错误的结果,写完后内容依然为0x00,因为对于0x55所有需要保持为1的位数据0xAA都是0,写0x55会把0xAA为1的位全清0,原来为0的位不会改变。

对于EEPROM,写操作既可以将数据位从1改写为0,也可以将数据位从0改写为1,不需要进行单独的擦除操作,要写0x55直接将0x55写到首地址,不管原来内容为什么,完成写操作后内容都是0x55。

一开始我们说了FLASH和EEPROM都有可擦除的最大次数(EEPROM实际上没有擦除操作),虽然这个数字看着不小,但对于程序来说并不大,比如EEPROM为10万次,如果我们以每秒一次的间隔依次写入0xFF和0x00,则只能维持100000/3600=27.78小时,也就是一天多就可以超出其最大寿命次数,不能再可靠写入所需的内容。

这种可写入的最大次数是芯片的特性决定的,我们无法改变,所以在使用这些芯片时,我们应充分考虑最大写入次数这一参数,要确保产品在实际工作中不超过这一参数。实际上许多时候只要程序做出针对性处理,有可能让产品的最大写入次数超过芯片的寿命,还是以EEPROM来做说明。

假定现在有一个产品,需要保存一些参数,参数的个数并不多,总共为10个字节,用EEPROM来保存就可以满足需求,我们选用了容量为256字节的EEPROM,如果我们不做过多考虑,很有可能就是直接将这10个字节从EEPROM的首地址开始保存,每次改写也是直接修改这部分内容,这样我们最多可以保存参数10万次。只要我们做一点简单处理,就可以将保存参数的次数成倍增加,来看看我们应该如何实现。

直接保存的最简方法:
地址 0x00   0x01   0x02   ...  0x09
内容 data1 data2 data3  ...  data10

改进的保存方法:
处理方法是将256字节按16字节大小分成16等份,按后面格式存储参数
地址 0x10*n +0x00 +0x01  +0x02 ... +0x09  +0x0A  +0x0B +0x0C  +0x0D +0x0E +0x0F
内容                  flag     data1 data2 ...  data9  data10 保留1  保留2  保留3   保留4  check_sum
check_sum=(flag+data1+data2+...+data10+保留1+...+保留4 )&0xFF
flag为0xA5表示当前16个字节为正在使用的记录,为其它值表示当前16字节已经丢弃
读取参数的时候先从地址0x10*n+0x00读flag,如果为0xA5表明当前记录为正在使用中,读出全部内容,并按前面公式进行校验,如果校验出错,则当前参数不可靠,直接使用默认参数,并将当前区域的flag改写为0,同时在地址0x10*(n+1)位置开始将默认参数写入,地址0x10*(n+1)写入内容为0xA5。如果所有区域都没有发现有效记录,在地址0写入默认参数。

每次需要更改参数设定时,先将当前记录位置的flag改为0,然后再下一条记录位置写入新的参数,这个顺序可以做出适当改进,比如对写入时断电等意外情况做出考虑,从而得到更可靠的写入结果,不过就按此方法也都可以满足应用需求。

再来对比一下两种方法,简单的方法只能保存10万次,优化后的方法理论上可增加16倍,达到160万次,如果预估最简方法产品是3年内绝对不会出错,现在就增加到了48年,一个电子产品使用超过3年还是有可能,但用48年的可能性就非常之小,可以视同为0。对于FLASH芯片也是同样道理,这里就不重复举例说明,在应用中也应该做出同样的处理。

Keil集成AStyle代码格式化工具 技术文章

Keil集成AStyle代码格式化工具

借助AStyle代码格式化工具能让我们写的代码看起来工整而且规范,下面来介绍一下keil如何集成AStyle代码格式化工具: 1,将 AStyle.exe 文件放在C:\Local\Tools下,或者...
Java语言的特性 技术文章

Java语言的特性

Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,还用简短的篇幅介绍了Java语言的特性。下面将对这些特性进行扼要的介绍。 1 简单 Java语言的语...
怎样学好Java? 技术文章

怎样学好Java?

如何学好Java语言,是所有初学者都需要面对的问题。其实,每种语言的学习方法都大同小异。初学者需要注意的主要有以下几点: 1,明确自己的学习目标和大的方向,选择并锁定一门语言,然后按照自己的方向努力学...