<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 延長(zhǎng)EEPROM使用壽命的方法

          延長(zhǎng)EEPROM使用壽命的方法

          作者: 時(shí)間:2006-05-28 來(lái)源:網(wǎng)絡(luò) 收藏
          (Electrically Erasable Programmable Read一Only Memory)即電子擦除式只讀存儲(chǔ)器,它是一種非揮發(fā)性存儲(chǔ)器,與擦除式只讀存儲(chǔ)器(EPROM)類(lèi)似,電源消失后,儲(chǔ)存的數(shù)據(jù)依然存在,要消除儲(chǔ)存在其中的內(nèi)容,不是用紫外線照射方式,而是以電子信號(hào)直接消除即可。
          正是由于具有以上特點(diǎn),該器件可廣泛應(yīng)用于對(duì)數(shù)據(jù)存儲(chǔ)安全性及可靠性要求高的應(yīng)用場(chǎng)合,如門(mén)禁考勤系統(tǒng),測(cè)量和醫(yī)療儀表,非接觸式智能卡,稅控收款機(jī),預(yù)付費(fèi)電度表或復(fù)費(fèi)率電度表、水表、煤氣表以及家電遙控器等應(yīng)用場(chǎng)合。該類(lèi)型存儲(chǔ)器在可靠數(shù)據(jù)存儲(chǔ)領(lǐng)域會(huì)獲得越來(lái)越廣泛的應(yīng)用。
          但是,有固定的使用,這是指某一位由1寫(xiě)為O或由O寫(xiě)為1的次數(shù)。不同廠家的產(chǎn)品,相同廠家不同型號(hào)、系列的產(chǎn)品,它們的也不盡相同,100萬(wàn)次為常見(jiàn)主流產(chǎn)品。假若某EEPROM為100萬(wàn)次,每秒擦寫(xiě)一次,則其使用時(shí)間為1000000/(360024)=12天。這對(duì)于需要較長(zhǎng)時(shí)間保存數(shù)據(jù)的應(yīng)用場(chǎng)合,顯然不滿足要求。


          1 延長(zhǎng)EEPROM壽命的
          一般應(yīng)用中,要存儲(chǔ)的數(shù)據(jù)比較單一,EEPROM空間與要存儲(chǔ)的數(shù)據(jù)相比要大得多。為此,可采用一種利用存儲(chǔ)器空間延長(zhǎng)EEPROM工作壽命的。
          l:不固定數(shù)據(jù)存放的地址,而是用一個(gè)固定的基地址加上EEPROM內(nèi)的一個(gè)單元的內(nèi)容(即偏移地址)作為真正的地址;若發(fā)現(xiàn)存儲(chǔ)單元已壞(寫(xiě)入和讀出的內(nèi)容不同),則偏移地址加1,重新寫(xiě)入。如果采用100倍的存儲(chǔ)器空間冗余,可將EEPROM的實(shí)際壽命延長(zhǎng)100倍。
          方法2:從第一個(gè)存儲(chǔ)單元開(kāi)始存儲(chǔ)數(shù)據(jù)N次,然后轉(zhuǎn)到下一個(gè)單元再存N次,依次類(lèi)推,當(dāng)最后一個(gè)單元存放N次之后,再轉(zhuǎn)到第一個(gè)單元重新開(kāi)始。本文推薦采用該法,因?yàn)樯弦环N方法存在一個(gè)致命缺陷:當(dāng)某一個(gè)EEPROM單元寫(xiě)壞再用下一個(gè)單元時(shí),原先存儲(chǔ)的數(shù)據(jù)就讀不出來(lái)了。本文后面的內(nèi)容也依此作根據(jù)進(jìn)行闡釋。


          2 EEPROM數(shù)據(jù)儲(chǔ)存地址的確認(rèn)
          嵌入式系統(tǒng)中的EEPROM電源消失后,儲(chǔ)存的數(shù)據(jù)依然存在。確認(rèn)數(shù)據(jù)所存地址是能夠正確將所存數(shù)據(jù)讀出的基本條件,但是掉電后再上電時(shí)如何確認(rèn)數(shù)據(jù)的地址指針呢?可以采用以下的方法。
          2.1 找最大數(shù)據(jù)法
          查找EEPROM中的最大數(shù)據(jù),就是掉電前最后一次存儲(chǔ)的數(shù)據(jù)。該法對(duì)于單片機(jī)來(lái)講,編程時(shí)程序量較大,可采用折半查找法或分塊查找法降低程序代碼量。
          2.2用后還原法
          循環(huán)將當(dāng)前數(shù)據(jù)寫(xiě)入EEPROM后,立即將前面的EEPROM空間都清0再上電,查找數(shù)據(jù)非0的EEPROM空間即可。有的單片機(jī)要求在寫(xiě)入數(shù)據(jù)之前,必須將所有空間都恢復(fù)為OxFF,這樣查找非0xFF的數(shù)據(jù)空間即可。
          2.3地址指針?lè)?/B>
          為每一個(gè)數(shù)據(jù)在EEPROM中設(shè)一個(gè)地址指針EE―ADR[i],這樣只要確認(rèn)EEADR[i]數(shù)值即可找到相應(yīng)數(shù)據(jù)。對(duì)于地址指針?lè)ㄓ邢率鲆恍┘记伞?BR> ①一個(gè)地址指針對(duì)應(yīng)一個(gè)數(shù)據(jù)。該方法思路簡(jiǎn)單,假設(shè)EEPROM空間可以存放50組數(shù)據(jù)和50個(gè)地址ADR[i],一組數(shù)據(jù)占用4個(gè)字節(jié),一個(gè)地址占用1個(gè)字節(jié),共250字節(jié),在儲(chǔ)存數(shù)據(jù)時(shí),使50個(gè)地址指向50組數(shù)據(jù)的首地址,且使小于變量i的ADR[i]都清零,或重新賦值為0xFF。查找數(shù)據(jù)時(shí),找到非O或非0xFF的ADR[i],然后根據(jù)ADR[i]的值來(lái)確定數(shù)據(jù)的儲(chǔ)存地址即可。
          ②用兩個(gè)變量來(lái)記錄數(shù)據(jù)儲(chǔ)存的地址,ADDR一0LD和ADDILNEW分別標(biāo)志當(dāng)前數(shù)據(jù)讀出時(shí)的地址和新采集來(lái)的數(shù)據(jù)下一次要存儲(chǔ)的地址。

          ③用一個(gè)字節(jié)的EEPROM空間作為地址指針。此時(shí),地址指針的數(shù)值總是和數(shù)據(jù)儲(chǔ)存的地址值相等,此種情況最具有技巧性,因?yàn)榇藭r(shí)可以使用最少的地址指針,因而可以最大量的節(jié)省。EEPROM空間,從而延長(zhǎng)EEP―ROM壽命。此方法的思路是:假設(shè)第O字節(jié)作為地址指針,當(dāng)該指針值為1時(shí),數(shù)據(jù)從第一個(gè)地址開(kāi)始儲(chǔ)存;為2時(shí),數(shù)據(jù)從第二個(gè)地址開(kāi)始儲(chǔ)存,依此類(lèi)推。

          3 應(yīng)用實(shí)例
          本人在設(shè)計(jì)智能流量?jī)x表時(shí),使用美國(guó)Microchip公司的PIC16F877單片機(jī)。該單片機(jī)本身自帶有256字節(jié)的EEPROM,其擦寫(xiě)次數(shù)典型值為100萬(wàn)次,主要用其儲(chǔ)存累計(jì)流量和儀表系數(shù)。其中,第201~255字節(jié)用于存儲(chǔ)儀表系數(shù),因其不需要經(jīng)常操作,所以對(duì)這些數(shù)據(jù)不再采用變地址動(dòng)態(tài)存儲(chǔ)。第0字節(jié)儲(chǔ)存數(shù)據(jù)的地址指針,第1~200字節(jié)用來(lái)儲(chǔ)存累計(jì)量。
          對(duì)于累計(jì)量,可以采用浮點(diǎn)數(shù)儲(chǔ)存,只占用3~4個(gè)字節(jié),目的在于用固定的字節(jié)長(zhǎng)度可以保證相同的相對(duì)精度。
          智能流量?jī)x表常年不停地工作,短時(shí)間內(nèi)的流量相對(duì)總的流量而言,可以忽略不計(jì)。因此,為了使單片機(jī)的EEPROM壽命更長(zhǎng),過(guò)一個(gè)時(shí)間片段(例如10s)儲(chǔ)存一次累計(jì)量也可以滿足精度要求。假若出現(xiàn)停電事故,累計(jì)量只有10s的流量誤差,相對(duì)總量可以滿足精度要求。該策略可使EEPROM延長(zhǎng)10倍壽命。
          因本例采用O字節(jié)來(lái)記錄數(shù)據(jù)的存儲(chǔ)地址,若數(shù)據(jù)每存儲(chǔ)一次就換一個(gè)地址,則200字節(jié)可以存200/4=50個(gè)位置,相當(dāng)于儲(chǔ)存數(shù)據(jù)的EEPROM空間擦寫(xiě)一次,第O字節(jié)就擦寫(xiě)50次,因此,第O字節(jié)的壽命是其他的1/50,這顯然不可行。故可以采用如下方式:在第一個(gè)地址儲(chǔ)存50次以后再換下一個(gè)地址儲(chǔ)存,到最后一個(gè)地址也儲(chǔ)存50次再轉(zhuǎn)到第一個(gè)地址儲(chǔ)存時(shí),這樣所有的EEPROM空間使用次數(shù)都相等。
          儲(chǔ)存累計(jì)量流程圖如圖1所示。

          pass:數(shù)據(jù)存儲(chǔ)之前程序循環(huán)的次數(shù),它表征多長(zhǎng)時(shí)間儲(chǔ)存一次數(shù)據(jù)。
          save_adr:數(shù)據(jù)在EEPROM中的存儲(chǔ)地址。
          save_time:某數(shù)據(jù)在同一地址存儲(chǔ)的次數(shù)。
          eeprom_write(eeadr,value):EEPROM寫(xiě)函數(shù)。
          下面是該流程對(duì)應(yīng)的程序(采用澳大利亞HI―TECH公司的PICC demo編譯器)。

          if(save_time>50)//存50次后移一位EEPROM地址

          {save_time=0;clrwdt();

          save_adr+=4;//累計(jì)量用4個(gè)字節(jié)儲(chǔ)存

          if(save_adr>197)//只用1~200字節(jié)存儲(chǔ)累計(jì)量{save_adr=1;}

          eeprom_write(0,save-adr);//save-adr為所存累計(jì)量地址首字節(jié)
          }
          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中存儲(chǔ)的數(shù)據(jù)
          系統(tǒng)中的EEPROM掉電后,再上電時(shí)從EEPROM讀出數(shù)據(jù)的程序比較簡(jiǎn)單。
          void Read_Sum_Q(){ //讀出掉電前的累計(jì)量
          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;

          }

          結(jié)語(yǔ)

          采用實(shí)例所示的方法,10s存一次可使EEPROM壽命延長(zhǎng)10倍,采用50倍的EEPROM空間冗余,又使其奉命延長(zhǎng)50倍,這樣具有1000000次壽命的EEPROM可以不間斷工作時(shí)間為10501000000/(360024365)=15.85年,基本可以滿足各種嵌入式系統(tǒng)的工作要求,大大提高了EEPROM的使用效率。因此,本文介紹的方法在相關(guān)領(lǐng)域具有廣泛的借鑒意義和實(shí)用價(jià)值。

          電度表相關(guān)文章:電度表原理




          關(guān)鍵詞: EEPROM 壽命 方法

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();