<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 提高 MSP430G 系列單片機的 Flash 擦寫(xiě)壽命的方法

提高 MSP430G 系列單片機的 Flash 擦寫(xiě)壽命的方法

作者: 時(shí)間:2012-12-04 來(lái)源:網(wǎng)絡(luò ) 收藏

每個(gè)頁(yè)存在3 種可能狀態(tài):

擦除態(tài):該頁(yè)是空的。

已寫(xiě)滿(mǎn)數據狀態(tài):該頁(yè)已經(jīng)寫(xiě)滿(mǎn)數據。

有效頁(yè)狀態(tài):該頁(yè)包含著(zhù)有效數據并且該頁(yè)尚未寫(xiě)滿(mǎn),仍可向子頁(yè)寫(xiě)入數據。

圖三介紹了使用子頁(yè)的方式實(shí)現 模擬EEPROM的數據處理。

2.2.1 軟件描述

在軟件實(shí)現上,為了便于軟件處理,建議定義一些關(guān)鍵宏定義和結構體,指定 模擬EEPROM 的起始、結束地址、頁(yè)的大小、子頁(yè)的大小、每個(gè)頁(yè)的子頁(yè)數目等參數,同時(shí)將需要操作的參數封裝起來(lái),便于軟件操作和管理,不建議定義許多離散的標志變量。

在軟件操作上, 模擬EEPROM模塊需要提供幾個(gè)API 接口給應用程序調用。

• 通過(guò)typedef 關(guān)鍵字定義設備類(lèi)型,typedef unsigned char u8;

• ChkFstPowerOnInfo()用于檢測芯片是否為第一次上電并初始化EEPROM 參數到內存,原型如下。

Void ChkFstPowerOnInfo(void);

• FlashWrite()用于寫(xiě)Flash,傳遞的形參包括指向待寫(xiě)入數據的指針,待寫(xiě)入數據在子頁(yè)中的起始字節編號,寫(xiě)入數據的長(cháng)度,原型如下。

void FlashWrite( u8 *array, u8 startNum, u8 length );

• FlashErase()用于擦除Flash,傳遞的形參是子頁(yè)的編號,在擦除函數中需要根據子頁(yè)的編號判斷是否需要執行頁(yè)的擦除操作,原型如下。

void FlashErase(u8 seg_sn);

2.2.2 軟件流程圖

軟件啟動(dòng)后,初始化模擬EEPROM流程圖描述如下。

調用API,向模擬EEPROM 寫(xiě)入數據的軟件流程如圖五所示。在軟件處理中,要特別注意目標指針的切換和保證寫(xiě)入數據的正確性,在代碼空間允許的情況下,可以增加一些校驗算法來(lái)保證。

采用劃分子頁(yè)的方案總結如下。

• 每次寫(xiě)入模擬EEPROM的數據長(cháng)度為定長(cháng),即為子頁(yè)的長(cháng)度。

• 軟件需要定義一個(gè)存儲變量結構體,用于刷新和同步模擬EEPROM內容。在將數據寫(xiě)入模擬EEPROM之前,程序員需要按照約定的數據格式,在內存中將所有的目標存儲變量進(jìn)行整理。

• 在軟件處理上,需要計算當前寫(xiě)入和下一次寫(xiě)入的物理地址;在每一次執行寫(xiě)入操作后,根據子頁(yè)長(cháng)度大小,將指向子頁(yè)的目的操作指針自動(dòng)累加。

• 待一個(gè)頁(yè)(Page)寫(xiě)滿(mǎn)后,需要將最后更新的模擬EEPROM數據拷貝到下一個(gè)頁(yè),再對寫(xiě)滿(mǎn)頁(yè)執行一次擦除操作。

• 在嵌入式軟件處理上需加入合適的校驗機制,保證寫(xiě)入數據的正確性并監測用于模擬EEPROM功能的Flash 子頁(yè)是否已經(jīng)失效。

2.3 兩種方案的對比分析

兩種方案的對比分析見(jiàn)表二。

表二 兩種方案的對比分析

表二 兩種方案的對比分析

3. 實(shí)際的嵌入式應用

根據軟件需要,建議采用字節(8bit)做為操作的最小粒度,適用性會(huì )更廣泛。

3.1 Flash 存儲器的提升對于 的Flash 存儲器,可以保證至少10000 次的編程和擦除。如圖六所示。

圖六 MSP430G 系列單片機Flash 編程和擦除壽命

圖六 Flash 編程和擦除

采用劃分小頁(yè)結合至少分配2 個(gè)大頁(yè)的操作方式,則可以大大增加Flash 模擬EEPROM 的壽命。例如,對于 ,如果將每個(gè)小頁(yè)的尺寸劃分為16 字節,采用2 個(gè)大頁(yè)(每頁(yè)512 字節)作為模擬EEPROM 使用,則可以提供64 個(gè)操作子頁(yè)((512/16)x2=64),可以保證至少640000 次的壽命。

3.2 掉電時(shí)的異常處理

如果正在進(jìn)行Flash 數據存儲時(shí)發(fā)生掉電,數據可能會(huì )保存不成功,存在異常。為了增強健壯性,在軟件處理上,需要考慮設備異常掉電等可能會(huì )導致Flash 擦寫(xiě)失敗的情況。

在軟件處理中,當成功保存Flash 數據后,再寫(xiě)入該子頁(yè)的狀態(tài)標志。上電后,用戶(hù)程序將查找最后一次寫(xiě)入的子頁(yè),再將該子頁(yè)的數據內容并恢復到內存中的數據結構中。

4. 系統可靠性設計

4.1 時(shí)鐘源的選擇

由于驅動(dòng)Flash 的時(shí)鐘源(ACLK、MCLK、SMCLK)和時(shí)鐘頻率可以設定,為了保證在將數據寫(xiě)入模擬EEPROM時(shí)的可靠性,建議在將Flash 的時(shí)鐘頻率降低后,再對其進(jìn)行操作。例如將Flash 的時(shí)鐘頻率降低到1MHz 后,進(jìn)行寫(xiě)入操作。需要注意,在降低了時(shí)鐘頻率后,若此時(shí)鐘源也是定時(shí)器(Timer)的時(shí)鐘源,則可能會(huì )影響到定時(shí)器的定時(shí)準確性,需要軟件上做好處理。

4.2 代碼在RAM中運行

由于向Flash 寫(xiě)入數據操作是通過(guò)執行Flash 中程序代碼,對Flash 進(jìn)行擦除和編程操作。由于對Flash 的編程需要mcu 內部執行一個(gè)升壓操作,所以如果有足夠的內存空間,建議將編程、擦除等關(guān)鍵代碼拷貝到RAM中運行,可以使用關(guān)鍵字__ramfunc 指定,如下圖七所示。



評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>