注:本文是作者以前發(fā)表在其個(gè)人博客,現(xiàn)在發(fā)布到“聚豐開發(fā)”專欄
開發(fā)電子產(chǎn)品時(shí),常常需要斷電后保存某些數(shù)據(jù),這就需要使用 FLASH或EEPROM芯片,這兩種芯片,可擦除的次數(shù)是有限制的,通常FLASH為10萬次,EEPROM要多一點(diǎn),為100萬甚至1000萬次。 FLASH的擦除不能單個(gè)字節(jié)進(jìn)行,有一個(gè)最小單位,存儲容量相對比較大,適合大量數(shù)據(jù)的存儲;EEPROM可以單個(gè)字節(jié)進(jìn)行擦除,存儲容量不大,只適合存儲少量的設(shè)置數(shù)據(jù)。
先以FLASH和EEPROM需要寫入一個(gè)字節(jié)為例來說明新數(shù)據(jù)是如何寫入的。假定都是在首地址要寫入新數(shù)據(jù)0x55。不管是FLASH還是EEPROM。 對于FLASH,寫操作只能將數(shù)據(jù)位從1改寫為0,如果想要將數(shù)據(jù)位從0改為1,就需要進(jìn)行擦除操作,而且這個(gè)擦除最小單位是page(可能是256字節(jié)或更多)。
現(xiàn)在要在首地址寫入0x55,穩(wěn)妥的方法是先擦除這個(gè)地方,也就是要擦除第一個(gè)page,擦除操作會一并將首地址后面的另外255個(gè)字節(jié)也擦除掉,如果這255個(gè)字節(jié)保存有其它數(shù)據(jù),還需要把這些數(shù)據(jù)先進(jìn)行備份,擦除第一個(gè)page后再將0x55和備份的255個(gè)字節(jié)寫進(jìn)去。也不是必須擦除第一個(gè)page,寫操作可以完成數(shù)據(jù)位1到0的轉(zhuǎn)變,利用這一特性結(jié)合首地址原來的內(nèi)容,我們就有可能不用進(jìn)行擦除操作,比如原來內(nèi)容為0xFF,顯然可以直接寫入0x55,原內(nèi)容為0xF5,同樣也可以寫入0x55,但如果原內(nèi)容為0xAA,執(zhí)行寫0x55則會得到完全錯(cuò)誤的結(jié)果,寫完后內(nèi)容依然為 0x00,因?yàn)閷τ?x55所有需要保持為1的位數(shù)據(jù)0xAA都是0,寫0x55會把0xAA為1的位全清0,原來為0的位不會改變。
對于EEPROM,寫操作既可以將數(shù)據(jù)位從1改寫為0,也可以將數(shù)據(jù)位從0改寫為1,不需要進(jìn)行單獨(dú)的擦除操作,要寫0x55直接將0x55寫到首地址,不管原來內(nèi)容為什么,完成寫操作后內(nèi)容都是0x55。
一開始我們說了FLASH和EEPROM都有可擦除的最大次數(shù)(EEPROM實(shí)際上沒有擦除操作),雖然這個(gè)數(shù)字看著不小,但對于程序來說并不大,比如EEPROM為10萬次,如果我們以每秒一次的間隔依次寫入0xFF和0x00,則只能維持 100000/3600=27.78小時(shí),也就是一天多就可以超出其最大壽命次數(shù),不能再可靠寫入所需的內(nèi)容。
這種可寫入的最大次數(shù)是芯片的特性決定的,我們無法改變,所以在使用這些芯片時(shí),我們應(yīng)充分考慮最大寫入次數(shù)這一參數(shù),要確保產(chǎn)品在實(shí)際工作中不超過這一參數(shù)。實(shí)際上許多時(shí)候只要程序做出針對性處理,有可能讓產(chǎn)品的最大寫入次數(shù)超過芯片的壽命,還是以EEPROM來做說明。
假定現(xiàn)在有一個(gè)產(chǎn)品,需要保存一些參數(shù),參數(shù)的個(gè)數(shù)并不多,總共為10個(gè)字節(jié),用EEPROM來保存就可以滿足需求,我們選用了容量為256字節(jié)的 EEPROM,如果我們不做過多考慮,很有可能就是直接將這10個(gè)字節(jié)從EEPROM的首地址開始保存,每次改寫也是直接修改這部分內(nèi)容,這樣我們最多可以保存參數(shù)10萬次。只要我們做一點(diǎn)簡單處理,就可以將保存參數(shù)的次數(shù)成倍增加,來看看我們應(yīng)該如何實(shí)現(xiàn)。
直接保存的最簡方法:
地址 0x00 0x01 0x02 ... 0x09
內(nèi)容 data1 data2 data3 ... data10
改進(jìn)的保存方法:
處理方法是將256字節(jié)按16字節(jié)大小分成16等份,按后面格式存儲參數(shù)
地址 0x10*n +0x00 +0x01 +0x02 ... +0x09 +0x0A +0x0B +0x0C +0x0D +0x0E +0x0F
內(nèi)容 flag data1 data2 ... data9 data10 保留1 保留2 保留3 保留4 check_sum
check_sum=(flag+data1+data2+...+data10+保留1+...+保留4 )&0xFF
flag為0xA5表示當(dāng)前16個(gè)字節(jié)為正在使用的記錄,為其它值表示當(dāng)前16字節(jié)已經(jīng)丟棄。
讀取參數(shù)的時(shí)候先從地址0x10*n+0x00讀flag,如果為0xA5表明當(dāng)前記錄為正在使用中,讀出全部內(nèi)容,并按前面公式進(jìn)行校驗(yàn),如果校驗(yàn)出錯(cuò),則當(dāng)前參數(shù)不可靠,直接使用默認(rèn)參數(shù),并將當(dāng)前區(qū)域的flag改寫為0,同時(shí)在地址0x10*(n+1)位置開始將默認(rèn)參數(shù)寫入,地址0x10* (n+1)寫入內(nèi)容為0xA5。如果所有區(qū)域都沒有發(fā)現(xiàn)有效記錄,在地址0寫入默認(rèn)參數(shù)。
每次需要更改參數(shù)設(shè)定時(shí),先將當(dāng)前記錄位置的flag改為0,然后再下一條記錄位置寫入新的參數(shù),這個(gè)順序可以做出適當(dāng)改進(jìn),比如對寫入時(shí)斷電等意外情況做出考慮,從而得到更可靠的寫入結(jié)果,不過就按此方法也都可以滿足應(yīng)用需求。
再來對比一下兩種方法,最簡方法只能保存10萬次,改進(jìn)的方法理論上增加了16倍,達(dá)到160萬次,如果預(yù)估最簡方法產(chǎn)品是3年內(nèi)絕對不會出錯(cuò),現(xiàn)在就增加到了48年,一個(gè)電子產(chǎn)品使用超過3年還是有可能,但用48年的可能性就非常之小,可以視同為0。對于FLASH芯片也是同樣道理,這里就不重復(fù)舉例說明,在應(yīng)用中也應(yīng)該做出同樣的處理。
-
芯片
+關(guān)注
關(guān)注
456文章
50950瀏覽量
424725 -
FlaSh
+關(guān)注
關(guān)注
10文章
1638瀏覽量
148188 -
EEPROM
+關(guān)注
關(guān)注
9文章
1023瀏覽量
81701
發(fā)布評論請先 登錄
相關(guān)推薦
評論