找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1368|回复: 26
打印 上一主题 下一主题
收起左侧

单片机EEPROM/FLASH如何长寿保存总运行时间?

  [复制链接]
跳转到指定楼层
楼主
ID:997026 发表于 2022-6-6 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前有一个呼吸机方案,该方案有两种运行模式,一种是开机就运行,除非关闭电源停止。另一种是定时运行,就是设定运行时间,比如设定2个小时,2小时到后机器停止。

现在想检测总运行时间,就是统计开机运行和定时运行的总时间,并记录下来。这个总时间是不可设置和修改的。就跟汽车的总里程表一样的,运行一次就不断往上累加。

实现原理不复杂,但我想用纯软件实现,不加掉电检测电路,我有个疑问是,如果机器开起来,时间不断增加,要不断往EEPROM里写数据,比如我这个呼吸机要用三年,折合几万小时,写这么多次,EEPROM撑的住吗?

有没有什么好的思路和算法,可以既能完美保存数据又可以延长EEPROM/FLASH寿命的?我在想汽车里面的总里程表,车子开十几年,总里程达到几十万公里,也没见出现问题,我想他里面一定不是单纯的写数据而已,肯定有什么比较好的算法。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-6-7 00:37 | 只看该作者
要看你用什么Eeprom 了, 每家的标准不一样, 通常Eeprom 再小 也有128字节吧? 就算  4 个字节用来记录,均衡使用的话, 也有 32个 区域可以轮流使用, 假定, 1分钟记录 1次, 一个小时, 60次,也就是所有区域 擦写两次, 一天 48次, 一年 17520 次,假定,你的Eeprom 按最差的工艺, 2万次 擦写,也够用 1年,那么, 适当,增加 Eeprom 大小,或者,扩大写入间隔,就能延长 使用周期了。
回复

使用道具 举报

板凳
ID:883242 发表于 2022-6-7 01:22 | 只看该作者
硬件解决方案:用铁电,几亿次写寿命够你用的了。

软件解决方案:写到满就换一个区域继续写呗,把写满的区间加起来就是总区间。
回复

使用道具 举报

地板
ID:283954 发表于 2022-6-7 06:12 | 只看该作者
以stc12为例,4个扇区,每个扇区512字节,一万次擦写,每分钟记录一次,如果使用得当,两个扇区可用155年,四个可用310年。应该够了吧。
回复

使用道具 举报

5#
ID:213173 发表于 2022-6-7 07:21 | 只看该作者
以STC15系列单片机为例,其内置EEPROM容量4~43K,IAP型更是可以自行分配EEPROM容量。影响EEPROM寿命的关键因素主要是擦写次数。用户手册标明10万次以上。EEPROM是以扇区512字节为单位读写,其字节初始状态全部是0xff,要重写数据必须先以扇区擦除。也就是只能写0,不能写1,只有擦除才能置1(由其材料物理特性决定)。那么不擦除扇区是不是就不能写?答案是否定的。以处理5个字节数据为例,1个字节用于保存所占用的地址信息,4个字节用于保存有效数据。按地址顺序记录,写满一个扇区写下一个扇区或擦除重写,大幅降低擦除频次。再配合掉电保存方式,使其使用寿命无限延长。
回复

使用道具 举报

6#
ID:219796 发表于 2022-6-7 09:41 来自手机 | 只看该作者
年月日时分秒十二个字节不就够了么?
回复

使用道具 举报

7#
ID:110604 发表于 2022-6-7 15:16 | 只看该作者
其实可以用自带电池的rtc模块记录,里面sram可以写无数次
回复

使用道具 举报

8#
ID:1033160 发表于 2022-6-8 11:42 | 只看该作者
以STC15系列单片机为例,其内置EEPROM容量4~43K,IAP型更是可以自行分配EEPROM容量。影响EEPROM寿命的关键因素主要是擦写次数。用户手册标明10万次以上。EEPROM是以扇区512字节为单位读写,其字节初始状态全部是0xff,要重写数据必须先以扇区擦除。也就是只能写0,不能写1,只有擦除才能置1(由其材料物理特性决定)。那么不擦除扇区是不是就不能写?答案是否定的。硬件解决方案:用铁电,几亿次写寿命够你用的了。  软件解决方案:写到满就换一个区域继续写呗,把写满的区间加起来就是总区间
回复

使用道具 举报

9#
ID:1033160 发表于 2022-6-8 11:42 | 只看该作者
硬件解决方案:用铁电,几亿次写寿命够你用的了。

软件解决方案:写到满就换一个区域继续写呗,把写满的区间加起来就是总区间
回复

使用道具 举报

10#
ID:965189 发表于 2022-6-8 12:04 | 只看该作者
我的一个东西记录时间,一分钟保存一次,秒忽略。
回复

使用道具 举报

11#
ID:161164 发表于 2022-6-8 15:38 | 只看该作者
如用的是STC89C52,有5k EEProm (5120Byte)
每分钟在新地址写两个Byte(int)
写的值为EEProm的写满次数
那么写到0x7FFF就有5120/2*32767=83883520分钟=159年
回复

使用道具 举报

12#
ID:161164 发表于 2022-6-8 16:19 | 只看该作者
又想到一个新点子
利用STC伪EEProm的特性(可写0不可写1)
只用一个扇区(512Byte)就可以计录508年
首先头两Byte用来记录擦除次数
然后每分钟对每一Byte清零一个位元

B11111110
B11111100
B11111000
当这地址为0时清零下一地址
当这一扇区全零时就已经过了(512-2)*8=4080分钟
当擦除次数达到0xFFF7(65535)时
机器就运行了65535*4080=267382800分钟=508年
回复

使用道具 举报

13#
ID:624769 发表于 2022-6-8 16:36 来自手机 | 只看该作者
lkc8210 发表于 2022-6-8 16:19
又想到一个新点子
利用STC伪EEProm的特性(可写0不可写1)
只用一个扇区(512Byte)就可以计录508年

你这个想法很好,但是行不通。
5年前开始,只要stc出新型号就实验(stc32和stc16没有试过,有条件的话,你试试),结论是stc的单片机不是只能1写0,是只能ff写其他值,你可以按你的想法试试,一次次改写,然后最高位和最低位,都会不受控的随机的变1,甚至,我降低要求,先写个随便什么值,再写0x00,都不是每次能成功,即第二次写入,只能确保破坏原值,不能保证写成目标值,即便你要改成0x00。所以,写入后擦除再写,是唯一办法。
回复

使用道具 举报

14#
ID:161164 发表于 2022-6-8 16:59 | 只看该作者
本帖最后由 lkc8210 于 2022-6-8 17:04 编辑
188610329 发表于 2022-6-8 16:36
你这个想法很好,但是行不通。
5年前开始,只要stc出新型号就实验(stc32和stc16没有试过,有条件的话, ...

太遗憾了那就改为每分钟对一个Byte写0x00
当这一扇区全零时就已经过了(512-2)=510分钟
当擦除次数达到0xFFF7(65535)时
机器就运行了65535*510=267382800分钟=63年
还可以接受吧?

回复

使用道具 举报

15#
ID:1033264 发表于 2022-6-8 17:16 来自手机 | 只看该作者
ID:10331609# 2022-6-8 11:42 硬件解决方案:用铁电,几亿次写寿命够你用的了。  软件解决方案:写到满就换一个区域继续写呗,把写满的区间加起来就是总区间
回复

使用道具 举报

16#
ID:329625 发表于 2022-6-8 18:50 | 只看该作者
理论方面是满足的,具体的还要参考你用的芯片的次数
回复

使用道具 举报

17#
ID:883242 发表于 2022-6-8 22:27 | 只看该作者
dalaoshi 发表于 2022-6-7 06:12
以stc12为例,4个扇区,每个扇区512字节,一万次擦写,每分钟记录一次,如果使用得当,两个扇区可用155年, ...

每分钟一次,一万次擦写是7天!!!哪来的155年???

既然分扇区,那么即使是字节可以单独写,那也要整个扇区擦除。不擦你怎么把80h改成7fh呢???
回复

使用道具 举报

18#
ID:161164 发表于 2022-6-8 22:50 | 只看该作者
Hephaestus 发表于 2022-6-8 22:27
每分钟一次,一万次擦写是7天!!!哪来的155年???

既然分扇区,那么即使是字节可以单独写,那也要 ...

155x365x24x60=81,468,000分钟
81,468,000/1024/10000=7.95
即每个字节写8次
大概和我12楼的想法类似
但被13楼证明了是不可能的
回复

使用道具 举报

19#
ID:230742 发表于 2022-6-8 23:00 | 只看该作者
为什么不用掉电检测呢?就算加电路也不复杂吧。那不是比这简单多了?
回复

使用道具 举报

20#
ID:883242 发表于 2022-6-8 23:02 | 只看该作者
lkc8210 发表于 2022-6-8 22:50
155x365x24x60=81,468,000分钟
81,468,000/1024/10000=7.95
即每个字节写8次

了解了,写8次就是12楼的做法,但是13楼确定这种办法不能用。
回复

使用道具 举报

21#
ID:283954 发表于 2022-6-8 23:09 | 只看该作者
188610329 发表于 2022-6-8 16:36
你这个想法很好,但是行不通。
5年前开始,只要stc出新型号就实验(stc32和stc16没有试过,有条件的话, ...

还好有你的实验结果,要不然做的时候还不知道会浪费多少时间,但你这一结果表示FLASH偶尔能把原来的0写成1,那不就违反的FLASH的物理特性了?所以还得再小心求证了。

lkc8210君的想法很好,我原本想用到两个扇区,现在一个就行了。
回复

使用道具 举报

22#
ID:624769 发表于 2022-6-8 23:46 | 只看该作者
dalaoshi 发表于 2022-6-8 23:09
还好有你的实验结果,要不然做的时候还不知道会浪费多少时间,但你这一结果表示FLASH偶尔能把原来的0写成 ...

也不算 把 0 写成 1,   感觉就是 里面电荷乱了,

试验的最初目的,是事先在Eeprom 里面存入  512个 值,用掉一个 清掉一个。
本来是认为,只要 我写0x00, 不管原来什么数据,都能清掉吧? 后来发现,永远清不完,才专门写了测试程序去做这样一个试验。然后发现,只要 非0xff的地方, 写入 0x00  90%以上都不会变 0x00 也不会保留原值,而是变成一个随机值, 有的地方1会变 0 有的地方会 0变1, 而一旦出现这种状况的 地址,在重新擦除之前,不管你怎么改写,都无法变成 0x00  或者 0xff,   基本上,尝试多次写入 任意值 之后, 用二进制来看, 会稳定的在类似: 01000000  和 00010010 这样的值之间变化。就是 大部分是0 有1~2个会是1,位置还会游走。
具体原因不清楚。也许是 Flash 的正常特性,也许是 STC 的 IAP 的漏洞缺陷? 总之, 差不多测试了 百来片(80片以上绝对有)的STC单片机,几乎覆盖STC全系列( 除了 STC16, STC32 没有测试过,) 这个问题一直存在。 关于手册上的, 只能把 1 写成 0,这个说法,和事实严重不符的问题,也反映过,总被他们按照“写入前必须擦除扇区” 来敷衍,从不给正面回答。
正好12#提到这个想法,我就顺便说一下亲身经历,避免有人和我一样中招。
回复

使用道具 举报

23#
ID:883242 发表于 2022-6-9 00:04 | 只看该作者
188610329 发表于 2022-6-8 23:46
也不算 把 0 写成 1,   感觉就是 里面电荷乱了,

试验的最初目的,是事先在Eeprom 里面存入  512个 值 ...

那就是SLC、MLC、TLC……的区别了。没想到死大、惨集成度这么低的芯片也会用到MLC。。。。。

SLC是一个存储单元只记录0、1两个值,1可以写成0,0不能写成1。符合你的预测。

TLC是一个存储单元分8个电压等级,000、001、010、011、100、101、110、111,读这个存储单元是测量电压,然后给出3bit数据。这种结构当然是你的测试结果了。
回复

使用道具 举报

24#
ID:283954 发表于 2022-6-9 02:15 | 只看该作者
188610329 发表于 2022-6-8 23:46
也不算 把 0 写成 1,   感觉就是 里面电荷乱了,

试验的最初目的,是事先在Eeprom 里面存入  512个 值 ...

我到这个站找到相关话题的研讨。
去搜索下这篇文章
EEV b log的FLASH memory write without pre-erase

我的英文水平有限,勉强看得懂,原来很多FLASH是不允许在本来已经是0的单元再写0的,这是关键的说明:

CAUTION
A flash memory location must be in the erased state before being programmed. Cumulative programming of bits (back-to-back program operations without an intervening erase) within a flash memory location is not allowed. Re-programming of existing 0s to 0 is not allowed as this overstresses the device.

但有些新品牌的FLASH可以这么做,所以还能再等待。

既然说明书说对已经是0的单元重新写0会造成过度劳累,你有空还可做一个实验,把要重写的那个字节(8位)读出后,把0先变成1,再补上要写的0,再写入,这样就可避免在原来的0再写0,就不会“过度劳累”,看看有什么结果哈。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

25#
ID:1033481 发表于 2022-6-9 13:51 | 只看该作者
不需要不停的写进去,每隔10分钟写一次甚至半小时写一次就好了,因为有些机器不是按照分钟收费啊。这样可以让寿命提高N倍
回复

使用道具 举报

26#
ID:624769 发表于 2022-6-9 18:03 | 只看该作者
Hephaestus 发表于 2022-6-9 00:04
那就是SLC、MLC、TLC……的区别了。没想到死大、惨集成度这么低的芯片也会用到MLC。。。。。

SLC是一 ...

原来如此,涨知识了, 看来 STC用的就是 MLC 或者 TLC 的Flash 了。这样,Eeprom的问题,就解释的通了。
就是这么简单的一个问题,他们技术部门为啥要藏着掖着的?用MLC,TLC的U盘也不是没有,讲出来很丢人么?
回复

使用道具 举报

27#
ID:624769 发表于 2022-6-9 18:10 | 只看该作者
lkc8210 发表于 2022-6-8 16:59
太遗憾了那就改为每分钟对一个Byte写0x00
当这一扇区全零时就已经过了(512-2)=510分钟
当擦除次数达到0 ...

仔细想一想,其实按照你的计数方式,Eeprom 的主意也不是不能打,经过我 上万次的测试,发现,虽然再次写入,不能改写成目标值,但是破坏原值,还是可以确保的。站在Eeprom 利用最大化,榨干剩余价值的立场来讲,我觉得不然,这样:
与其,每个单元写 0x00, 不如我们写 0x5A;
按你的思路,我们一个扇区,全写成 0x5A;  就是 510分钟。
再全写 0xA5, 不管变成啥 反正,都 非0x5A 了,就 1020 分钟了。
然后,反复擦除,写到报废,就 126 年了。
就算,1秒写一次, 拼上一个扇区的寿命,能写2年,4个扇区,能8年,基本产品也报废了。 这主意不错吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表