最近在做便携式储能电源的项目,其中需要用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的地址,这个地址为下一次存放数据的地址,而这个地址的前一个地址为上次存放的数据。