关于MCU内部flash存储数据的寿命及提高擦写次数的方法

cathy的头像

最近在做便携式储能电源的项目,其中需要用flash实时存储电池的电量(1~100),由于芯片的最小擦写次数时10000次,所以,对于flash的擦写寿命进行了研究,下面是网友的一些见解,觉得有些道理,这里记录一下,以防后续忘记,也供大家参考。

一、FLASH寿命测试(源自网络,有兴趣者可自行测试)

测试的flash型号是sst39vf160,由于测试时间的问题,只测试了一个扇区4个字节,用了整整一个星期才完成所有测试,测试结果总结如下:

1、flash有寿命限制,sst39vf160手册上说是10万次,实验片的实测却超过80万次。

2、每一个位的寿命是独立的,也就是说,一个字节的bit0失效了,bit1仍然可以正常操作。

3、flash的寿命指的是被改写的次数,如果一次擦除或写操作不改变某一个位的内容,该位就不会被磨损。比如一个字节被反复执行“擦除-写入0xfe”操作,把bit0损坏后,该字节高7位的寿命丝毫不受影响。

4、flash磨损后,总是表现为擦除不干净,多擦除几次又能够擦干净,随着磨损程度的加剧,越来越难以擦除干净,但只要擦干净了,写入一定是正确的。但写入的数据是否牢固就没有办法测了。

5、只要原来内容是1的位,总是可以被写入,但只要原来内容是0的位,就只有擦除才能改为1.

实测数据,对一个字节反复写0和擦除,寿命指的是写0的次数。

第一次擦除不干净的寿命:876842次

第一次出现连续两次擦除仍然不干净的寿命:1169465次

第一次出现连续4次擦除仍然不干净的寿命:1769609次

第一次出现连续8次擦除仍然不干净的寿命:1886879次

二、为什么FLASH擦写有次数限制?

FLASH的非易失存储原理是往浮栅MOS管的栅极中注入电荷,只要电荷在,MOS管在电路中的开关状态就不变。而改变浮栅存储的电荷,需要对浮栅加压操作,这个操作会破坏浮栅的物理结构,进而影响MOS存储单元的寿命。也就是说,只有逻辑状态改变才影响MOS管的浮栅寿命。FLASH的写入-擦除循环仅指浮栅注入电荷、释放电荷的循环,逻辑状态不变,对浮栅而言擦写操作其实是不执行的,自然对其物理结构没有影响。

三、如何提高FLASH的擦写次数

采用“空间换时间”的方法。所谓“空间换时间”,是指利用相对多的代码空间来换取相对多的存储次数。即在一页内,可以依次将数据写入FLASH,当写满一页后,再全部擦除。比如一个扇区为512字节,现存储32字节的数据块,一页就可以写16个数据块,写满后再全部擦除,这样该页的擦写次数就可以提高16倍。

下面以32字节的数据块为例,来简要说明“空间换时间”的软件实现方法。

(1)保存数据:每次保存数据时,从低地址到高地址依次(以32为步进)判断INDEX的内容。如果为FFH,表示该地址空间未写过数据,写入需要更新的数据;如果不为FFH,表示该地址空间已写过数据,继续查询;如果所有的INDEX(16个)都不为FFH,表示该页已经写满,执行擦除指令后从首地址写入数据。

(2)读取数据:每次读取数据时,从高地址到低地址依次(以32为步进)判断INDEX的内容,这是为了查询到最新的数据。如果不为FFH,表示该地址已写过数据,读取数据;如果所有的INDEX(16个)都为FFH,表示该页还未写入数据。

一句话,就是找到第一个为0xff的地址,这个地址为下一次存放数据的地址,而这个地址的前一个地址为上次存放的数据。

版权声明:本文为CSDN博主「teclimber」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baodewang/article/details/111247653
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。