延長(cháng)EEPROM使用壽命的方法
正是由于EEPROM具有以上特點(diǎn),該器件可廣泛應用于對數據存儲安全性及可靠性要求高的應用場(chǎng)合,如門(mén)禁考勤系統,測量和醫療儀表,非接觸式智能卡,稅控收款機,預付費電度表或復費率電度表、水表、煤氣表以及家電遙控器等應用場(chǎng)合。該類(lèi)型存儲器在可靠數據存儲領(lǐng)域會(huì )獲得越來(lái)越廣泛的應用。
但是,EEPROM有固定的使用壽命,這是指某一位由1寫(xiě)為O或由O寫(xiě)為1的次數。不同廠(chǎng)家的產(chǎn)品,相同廠(chǎng)家不同型號、系列的產(chǎn)品,它們的壽命也不盡相同,100萬(wàn)次為常見(jiàn)主流產(chǎn)品。假若某EEPROM壽命為100萬(wàn)次,每秒擦寫(xiě)一次,則其使用時(shí)間為1000000/(360024)=12天。這對于需要較長(cháng)時(shí)間保存數據的應用場(chǎng)合,顯然不滿(mǎn)足要求。
1 延長(cháng)EEPROM壽命的方法
一般應用中,要存儲的數據比較單一,EEPROM空間與要存儲的數據相比要大得多。為此,可采用一種利用存儲器空間延長(cháng)EEPROM工作壽命的方法。
方法l:不固定數據存放的地址,而是用一個(gè)固定的基地址加上EEPROM內的一個(gè)單元的內容(即偏移地址)作為真正的地址;若發(fā)現存儲單元已壞(寫(xiě)入和讀出的內容不同),則偏移地址加1,重新寫(xiě)入。如果采用100倍的存儲器空間冗余,可將EEPROM的實(shí)際壽命延長(cháng)100倍。
方法2:從第一個(gè)存儲單元開(kāi)始存儲數據N次,然后轉到下一個(gè)單元再存N次,依次類(lèi)推,當最后一個(gè)單元存放N次之后,再轉到第一個(gè)單元重新開(kāi)始。本文推薦采用該法,因為上一種方法存在一個(gè)致命缺陷:當某一個(gè)EEPROM單元寫(xiě)壞再用下一個(gè)單元時(shí),原先存儲的數據就讀不出來(lái)了。本文后面的內容也依此作根據進(jìn)行闡釋。
2 EEPROM數據儲存地址的確認
嵌入式系統中的EEPROM電源消失后,儲存的數據依然存在。確認數據所存地址是能夠正確將所存數據讀出的基本條件,但是掉電后再上電時(shí)如何確認數據的地址指針呢?可以采用以下的方法。
2.1 找最大數據法
查找EEPROM中的最大數據,就是掉電前最后一次存儲的數據。該法對于單片機來(lái)講,編程時(shí)程序量較大,可采用折半查找法或分塊查找法降低程序代碼量。
2.2用后還原法
循環(huán)將當前數據寫(xiě)入EEPROM后,立即將前面的EEPROM空間都清0再上電,查找數據非0的EEPROM空間即可。有的單片機要求在寫(xiě)入數據之前,必須將所有空間都恢復為OxFF,這樣查找非0xFF的數據空間即可。
2.3地址指針?lè )?/B>
為每一個(gè)數據在EEPROM中設一個(gè)地址指針EE―ADR[i],這樣只要確認EEADR[i]數值即可找到相應數據。對于地址指針?lè )ㄓ邢率鲆恍┘记伞?BR> ①一個(gè)地址指針對應一個(gè)數據。該方法思路簡(jiǎn)單,假設EEPROM空間可以存放50組數據和50個(gè)地址ADR[i],一組數據占用4個(gè)字節,一個(gè)地址占用1個(gè)字節,共250字節,在儲存數據時(shí),使50個(gè)地址指向50組數據的首地址,且使小于變量i的ADR[i]都清零,或重新賦值為0xFF。查找數據時(shí),找到非O或非0xFF的ADR[i],然后根據ADR[i]的值來(lái)確定數據的儲存地址即可。
②用兩個(gè)變量來(lái)記錄數據儲存的地址,ADDR一0LD和ADDILNEW分別標志當前數據讀出時(shí)的地址和新采集來(lái)的數據下一次要存儲的地址。
③用一個(gè)字節的EEPROM空間作為地址指針。此時(shí),地址指針的數值總是和數據儲存的地址值相等,此種情況最具有技巧性,因為此時(shí)可以使用最少的地址指針,因而可以最大量的節省。EEPROM空間,從而延長(cháng)EEP―ROM壽命。此方法的思路是:假設第O字節作為地址指針,當該指針值為1時(shí),數據從第一個(gè)地址開(kāi)始儲存;為2時(shí),數據從第二個(gè)地址開(kāi)始儲存,依此類(lèi)推。
3 應用實(shí)例
本人在設計智能流量?jì)x表時(shí),使用美國Microchip公司的PIC16F877單片機。該單片機本身自帶有256字節的EEPROM,其擦寫(xiě)次數典型值為100萬(wàn)次,主要用其儲存累計流量和儀表系數。其中,第201~255字節用于存儲儀表系數,因其不需要經(jīng)常操作,所以對這些數據不再采用變地址動(dòng)態(tài)存儲。第0字節儲存數據的地址指針,第1~200字節用來(lái)儲存累計量。
對于累計量,可以采用浮點(diǎn)數儲存,只占用3~4個(gè)字節,目的在于用固定的字節長(cháng)度可以保證相同的相對精度。
智能流量?jì)x表常年不停地工作,短時(shí)間內的流量相對總的流量而言,可以忽略不計。因此,為了使單片機的EEPROM壽命更長(cháng),過(guò)一個(gè)時(shí)間片段(例如10s)儲存一次累計量也可以滿(mǎn)足精度要求。假若出現停電事故,累計量只有10s的流量誤差,相對總量可以滿(mǎn)足精度要求。該策略可使EEPROM延長(cháng)10倍壽命。
因本例采用O字節來(lái)記錄數據的存儲地址,若數據每存儲一次就換一個(gè)地址,則200字節可以存200/4=50個(gè)位置,相當于儲存數據的EEPROM空間擦寫(xiě)一次,第O字節就擦寫(xiě)50次,因此,第O字節的壽命是其他的1/50,這顯然不可行。故可以采用如下方式:在第一個(gè)地址儲存50次以后再換下一個(gè)地址儲存,到最后一個(gè)地址也儲存50次再轉到第一個(gè)地址儲存時(shí),這樣所有的EEPROM空間使用次數都相等。
儲存累計量流程圖如圖1所示。
pass:數據存儲之前程序循環(huán)的次數,它表征多長(cháng)時(shí)間儲存一次數據。
save_adr:數據在EEPROM中的存儲地址。
save_time:某數據在同一地址存儲的次數。
eeprom_write(eeadr,value):EEPROM寫(xiě)函數。
下面是該流程對應的程序(采用澳大利亞HI―TECH公司的PICC demo編譯器)。
if(save_time>50)//存50次后移一位EEPROM地址
{save_time=0;clrwdt();
save_adr+=4;//累計量用4個(gè)字節儲存
if(save_adr>197)//只用1~200字節存儲累計量{save_adr=1;}
eeprom_write(0,save-adr);//save-adr為所存累計量地址首字節
}
eeprom_write(savcl_adr,x[O]);
eeprom_write(save_adr+1,x[1]);
eeprom_write(save_adr+2,x[2]);
eeprom_write(save_adr+3,x[3]);
}
}
4 讀出EEPROM中存儲的數據
系統中的EEPROM掉電后,再上電時(shí)從EEPROM讀出數據的程序比較簡(jiǎn)單。
void Read_Sum_Q(){ //讀出掉電前的累計量
y[O]=eeprom_read(save_adr);
y[1]=eeprom_read(1+save_adr);
y[2]_eeprom_read(2+save_adr);
y[3]=eeprom_read(3+save_adr);
p2=(float *)y;
Q=*p2;
}
結語(yǔ)
采用實(shí)例所示的方法,10s存一次可使EEPROM壽命延長(cháng)10倍,采用50倍的EEPROM空間冗余,又使其奉命延長(cháng)50倍,這樣具有1000000次壽命的EEPROM可以不間斷工作時(shí)間為10501000000/(360024365)=15.85年,基本可以滿(mǎn)足各種嵌入式系統的工作要求,大大提高了EEPROM的使用效率。因此,本文介紹的方法在相關(guān)領(lǐng)域具有廣泛的借鑒意義和實(shí)用價(jià)值。
電度表相關(guān)文章:電度表原理
評論