打印
[MM32生态]

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

[复制链接]
7357|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yang15622383762|  楼主 | 2021-9-28 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做便携式储能电源的项目,其中需要用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的地址,这个地址为下一次存放数据的地址,而这个地址的前一个地址为上次存放的数据。

使用特权

评论回复
沙发
duo点| | 2021-10-3 10:57 | 只看该作者
一句话,就是找到第一个为0xff的地址,这个地址为下一次存放数据的地址,而这个地址的前一个地址为上次存放的数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

67

帖子

0

粉丝