久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2866|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久亚洲精品 | 看片国产 | 日韩成人专区 | 91免费观看视频 | 黄色一级视频免费 | 国产一区二区三区四区五区3d | 日韩av成人| 欧美成人影院在线 | 欧美精品1区 | 国产高清视频 | 午夜精品久久久久久久星辰影院 | 日本久久久久久 | 日韩一区精品 | 依人成人 | 99精品免费 | 日韩一二三区 | 欧美中文字幕一区二区三区亚洲 | 亚洲久在线 | 亚洲精品日韩精品 | 日韩欧美一区二区三区在线播放 | 国产精品一区二区无线 | 国产粉嫩尤物极品99综合精品 | 亚洲二区在线 | 免费视频一区二区 | 先锋资源亚洲 | 综合精品在线 | 国产精品久久久久久久久免费高清 | 午夜视频在线 | 久久99久久99精品免视看婷婷 | 午夜小电影 | 久久久蜜桃 | 亚洲视频在线播放 | 不卡av在线 | 天天干天天干 | 日韩国产在线观看 | 精品国产乱码久久久久久a丨 | 久久久做| 青草青草久热精品视频在线观看 | www.中文字幕.com | 欧美黄在线观看 | 日韩第一夜 |