注:本文是作者以前发表在其个人博客,现在发布到“聚丰开发”专栏
开发电子产品时,常常需要断电后保存某些数据,这就需要使用 flash或eeprom芯片,这两种芯片,可擦除的次数是有限制的,通常flash为10万次,eeprom要多一点,为100万甚至1000万次。 flash的擦除不能单个字节进行,有一个最小单位,存储容量相对比较大,适合大量数据的存储;eeprom可以单个字节进行擦除,存储容量不大,只适合存储少量的设置数据。
先以flash和eeprom需要写入一个字节为例来说明新数据是如何写入的。假定都是在首地址要写入新数据0x55。不管是flash还是eeprom。 对于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芯片也是同样道理,这里就不重复举例说明,在应用中也应该做出同样的处理。
iPhone 11 Pro要停车?iPhone 11 Pro价格暴跌
物联网短期难获利,芯片以外无法赚钱
对自动驾驶汽车抱持希望但也抱持怀疑态度
5G将至,中兴携5G终端方案亮相IFA 2018
中国再次研究出黑科技!米波雷达潜力巨大,先天具反隐身优势
延长FLASH和EEPROM芯片写入次数的小方法
使用 NVIDIA BlueField DPU 加速 Suricata IDS / IPS
工业AI未来将如何为炼油业提供动力
中科院云南天文台发现太阳暗条触发和物质转移机制
拯救者电竞手机的90W氮化镓充电器今日上市
贸泽电子荣获第十一届中国财经峰会“2022(行业)影响力品牌”奖
为什么芯片大厂都将接口IP作为打造安全SoC着力点呢?
中国厂商华为在全球电信基础设施市场的份额仍在增长
三星成功研发出拥有4K分辨率的笔记本OLED面板
物联网、雾计算到云端大数据
充电器5V1A电源管理IC芯片U6215
锂电池安全监控器AD8280
什么是CAN总线?-2
直播精彩回顾(四)| 虹科Flow——数据管道的可观察性解决方案
iPhone8最新消息:这是iPhone8的最靠谱渲染图