專利名稱:一種flash存儲器擦寫方法
技術領域:
本發(fā)明涉及一種存儲介質(zhì)的擦寫方法,具體涉及一種FLASH存儲器的擦 寫方法,適用于擦寫頻繁的嵌入式測量和控制系統(tǒng)中的FLASH存儲器。
背景技術:
當前,嵌入式微控制器MCU在電子測量和控制領域得到了廣泛的應用,而 在嵌入式測量和控制系統(tǒng)中,通常有一些系統(tǒng)狀態(tài)數(shù)據(jù)、運行參數(shù)或測量數(shù)據(jù) 需要保存在非易失性存儲器中。
FLASH存儲器是一種在EPROM和EEPROM的制造技術基礎上發(fā)展起來 的一種可擦除、非易失性存儲元件,由于它具有功耗低、擦寫速度快、價格便 宜的特點,在嵌入式系統(tǒng)中得到了越來越多的應用。嵌入式系統(tǒng)中使用的FLASH 存儲器有兩種, 一種是在MCU之外擴展的FLASH芯片,通常是用串行通信方 式實現(xiàn)讀、寫和擦除操作的;另外一種是MCU內(nèi)部集成的FLASH存儲器,通 過按一定步驟設置內(nèi)部寄存器來完成擦除和寫入操作。
FLASH存儲器的擦寫次數(shù)是有一定限制的,也就是說它有一定的使用壽命。 專門的FLASH芯片,擦寫次數(shù)可達10萬次而MCU內(nèi)部集成的FLASH存儲 器,擦寫次數(shù)一般僅為l萬次。由于FLASH存儲器的擦寫次數(shù)是有限的,如果 頻繁地擦寫FLASH存儲器的某個固定區(qū)域,就會使該區(qū)域在較短的時間內(nèi)達到 使用壽命,從而降低了 FLASH存儲器的使用壽命,以至于影響整個系統(tǒng)的使用 壽命。
為延長FLASH存儲器使用壽命,可采取的措施主要是將數(shù)據(jù)平均地寫到用 來存儲數(shù)據(jù)的整個FLASH存儲區(qū)域,避免在某些存儲區(qū)域頻繁地擦寫,確保在 整個系統(tǒng)的使用壽命期內(nèi),F(xiàn)LASH存儲器不會達到它的使用壽命。
在有操作系統(tǒng)和文件管理系統(tǒng)的電子產(chǎn)品中,F(xiàn)LASH存儲器作為大容量文 件存儲器,可以采用較復雜的算法來均衡FLASH存儲器的擦寫,延長它的使用 壽命,如磨損均衡算法等。而在如上所述的嵌入式測量和控制系統(tǒng)中,通常沒有操作系統(tǒng)和文件管理系統(tǒng),而且用來存儲數(shù)據(jù)的FLASH存儲器容量也比較 小, 一般只有幾K到幾十K字節(jié),因此不可能采用較復雜的算法來管理。具體 來說,若僅僅將數(shù)據(jù)平均地寫到小容量的FLASH存儲區(qū)域內(nèi),在正常連續(xù)寫入 MCU中的情行下,不采用復雜的算法也是可以實現(xiàn)的,但是嵌入式儀器儀表在 不使用時通常會關閉電源,或在使用過程中出現(xiàn)掉電現(xiàn)象,在重新上電工作后 需要知道上次正常工作或掉電前寫入的有效數(shù)據(jù)在FLASH存儲器中的存儲位 置,即有效數(shù)據(jù)區(qū)的起始地址和結束地址(至少需要知道結束地址),這就需要在 FLASH存儲器中有幾個固定單元用來保存這些地址,否則無法實現(xiàn)平均寫入的 目的。如此一來,這些用于保存地址的單元還是會被頻繁地擦寫,會首先達到 擦寫飽和值,從而影響到整個存儲芯片的壽命。因而,如上所述的平均寫入內(nèi) 容的方法,并不能從根本上解決延長FLASH存儲器使用壽命的問題。
發(fā)明內(nèi)容
本發(fā)明目的是提供一種能夠延長嵌入式系統(tǒng)中FLASH存儲器使用壽命的 FLASH存儲器擦寫方法。
為達到上述目的,本發(fā)明采用的技術方案是一種FLASH存儲器擦寫方法, 包括以下步驟
(1) 設置數(shù)據(jù)幀結構,每一數(shù)據(jù)幀內(nèi)含有8倍數(shù)的字節(jié)數(shù),復數(shù)個數(shù)據(jù)幀 組成存儲區(qū)域內(nèi)的一頁,所述存儲區(qū)域劃分為N頁,編號0頁 (N-l)頁;
(2) 選定最后一個所述數(shù)據(jù)幀所在頁為當前頁,若該頁已寫滿則轉入下一 頁I,將I頁設為當前頁,當所述I頁為存儲區(qū)域中的N-l頁時,1+1頁為0 頁;
(3) 寫入數(shù)據(jù);
(4) 當前頁I被寫滿后,轉入下一頁,并重新設定該頁為當前頁I,選擇 擦除第1-1頁或第1+1頁內(nèi)容的兩種擦除方式中的一種,執(zhí)行擦除;
(5) 在正常工作過程中,重復步驟(3),直至當前頁為第N-l頁,所述第1+1 頁為O頁;在重新上電后,重復步驟(2)。
上述技術方案中,步驟(l)中所述數(shù)據(jù)幀結構可包含起始字、數(shù)據(jù)域和結束 字,還可加入校驗字,以便對寫入數(shù)據(jù)正確性的檢測,各字節(jié)組合構成8的倍數(shù),以避免數(shù)據(jù)幀跨頁存儲。將FLASH存儲器的存儲空間劃分成N頁,編號 為0頁 (N-1)頁,每一頁內(nèi)可存儲若干個數(shù)據(jù)幀,最后一個數(shù)據(jù)幀所在的頁 稱為當前頁,在當前頁內(nèi)寫入數(shù)據(jù),寫滿一頁后執(zhí)行步驟(4)中的擦除,擦除方 式分為兩種,根據(jù)存儲數(shù)據(jù)需要保存周期的長短選擇
① 要保存的數(shù)據(jù)只有一個數(shù)據(jù)幀的,選擇擦除第I-1頁。在FLASH存儲 器的數(shù)據(jù)存儲區(qū)中始終只有一個頁(當前頁I)保存有數(shù)據(jù),其它頁都是空的。 使用時,當前頁(假設是第1-1頁)寫滿后,在數(shù)據(jù)幀第一次正確寫入下一頁(第 I頁)后,馬上就把當前頁(第1-1頁)數(shù)據(jù)擦除,而寫入第一個數(shù)據(jù)幀的頁(第I 頁)成為新當前頁。從第0頁到第N-l頁輪流成為當前頁,第N-1頁寫滿后, 下一個寫入的頁重新回到第0頁,這樣不斷循環(huán)使用,就使得數(shù)據(jù)存儲區(qū)的每 個存儲單元得到完全均衡的擦寫;
② 要保存盡量多的數(shù)據(jù)幀,選擇擦除第I+1頁。在FLASH存儲器的數(shù)據(jù)
存儲區(qū)中除第一輪循環(huán)時會有多個空頁存在,從第二輪循環(huán)開始,始終只有當
前頁后面的一頁是空的,其它頁都會存有數(shù)據(jù), 一共可以保存N-1頁數(shù)據(jù)。使
用時,當前頁(假設是第1-1頁)寫滿后,在數(shù)據(jù)幀第一次正確寫入下一頁(第I
頁)后,這個寫入第一個數(shù)據(jù)幀的頁(第I頁)就成為當前頁,然后擦除新當前頁
(第I頁)之后的一個頁(第1+1頁)。這樣數(shù)據(jù)存儲區(qū)不斷循環(huán)使用,使得每個 存儲單元得到完全均衡的擦寫。
在所述步驟(5)中,所謂正常工作,是指在一次上電后的循環(huán)擦寫操作,在 這個過程中沒有出現(xiàn)關電、掉電等中斷操作的現(xiàn)象,F(xiàn)LASH存儲器保持正常 的擦寫工作,那么重復步驟(3)實現(xiàn)循環(huán);而當出現(xiàn)中斷現(xiàn)象(包括掉電、重啟 等),那么需要從步驟(2)開始重復,以找到當前頁,繼續(xù)寫入數(shù)據(jù),如此在失 電后FLASH存儲器亦能找到上次寫入的頁位置,而非從新開始,實現(xiàn)均衡擦 寫,延長FLASH的使用壽命。
上述技術方案中,所述數(shù)據(jù)幀結構依次包括起始字、數(shù)據(jù)區(qū)域、結束字及 校驗字,所述結束字與校驗字之間設置補償字,使所述數(shù)據(jù)幀的字節(jié)數(shù)為8 的倍數(shù)。起始字、結束字為一或二個字節(jié),可采用除FFH之外的特定十六進 制數(shù),比如55H、 AAH或AA55H等,其作用是保證一幀數(shù)據(jù)的完整性;數(shù)據(jù) 域是要保存的具體數(shù)據(jù),至少一個字節(jié);校驗字是它前面所有字節(jié)的校驗碼,可以采用l字節(jié)的CHECKSUM校驗碼或2字節(jié)的CRC16校驗碼,其作用是 保證寫入數(shù)據(jù)的正確性。當由這四部分數(shù)據(jù)組成的數(shù)據(jù)幀的字節(jié)數(shù)不是正好為 8的倍數(shù)時,在結束字和校驗字之間插入補償字FFH,使得整個數(shù)據(jù)幀的字節(jié) 數(shù)等于8的倍數(shù)。
另一種方法是,在校驗字之后到下一個8的倍數(shù)的地址之前的這些字節(jié)就 不再用來存儲數(shù)據(jù),下一次數(shù)據(jù)幀從下一個8的倍數(shù)的地址開始寫入。
進一步的技術方案是,所述步驟(3)之前先確定當前頁中寫入數(shù)據(jù)的幀位置, 根據(jù)數(shù)據(jù)幀結構査找出該當前頁中的最后一幀完整幀,并以該幀的下一幀的地 址作為寫入數(shù)據(jù)的起始地址,然后執(zhí)行步驟(3)寫入數(shù)據(jù)。數(shù)據(jù)幀在寫入過程中,
發(fā)生意外掉電情況時,會出現(xiàn)一個數(shù)據(jù)幀沒有完整寫入FLASH存儲器,再上電 后找到的最后一幀數(shù)據(jù)就不會是完整的數(shù)據(jù)幀,它不會同時有正確的起始字和 結束字,這通過對起始字和結束字的比較就可以判斷出來。由于在寫入數(shù)據(jù)幀 時,通過校驗保證了寫入的正確性,之后才會進行擦除操作,所以存儲的數(shù)據(jù) 至少會有一幀是正確的,當遇到最后一幀數(shù)據(jù)不完整時,它前面的一幀數(shù)據(jù)一 定是完整的,這樣只要將最后一幀不完整數(shù)據(jù)前面的一幀數(shù)據(jù)作為最后一個有 效數(shù)據(jù)即可,跳過這個不完整的數(shù)據(jù)幀,而在它后面空白區(qū)的下一個幀的起始 地址就是初始寫入地址。
進一步的技術方案是,所述步驟(3)中,在每寫完一幀數(shù)據(jù)M后,讀取該 幀的數(shù)據(jù)M,利用所述校驗字檢測讀取數(shù)據(jù)M與寫入數(shù)據(jù)S的吻合性,若檢 測出未吻合,則轉入下一數(shù)據(jù)幀,重新寫入該幀數(shù)據(jù)S,若吻合則轉入下一數(shù) 據(jù)幀,寫入下一幀數(shù)據(jù)S+1。
上述技術方案中,所述步驟(4)中,選擇擦除第1+1頁內(nèi)容的擦除方式情況 下,擦除前先判斷第1+1頁是數(shù)據(jù)頁或是空白頁,為數(shù)據(jù)頁時執(zhí)行擦除,否則 跳過擦除,進入下一步驟。
由于上述技術方案運用,本發(fā)明與現(xiàn)有技術相比具有下列優(yōu)點本發(fā)明首 先設置數(shù)據(jù)幀結構,將存儲區(qū)域劃分成N頁,每頁中包含多個數(shù)據(jù)幀,以幀 結構寫入數(shù)據(jù),寫滿一頁轉入下一頁時,根據(jù)需要保存數(shù)據(jù)量的多少,選擇擦 除當前頁前一頁或是后一頁兩種方式中的一種,從第0頁至第N-1頁,再返回 第0頁,如此在整個存儲區(qū)域內(nèi)循環(huán),使得每個存儲單元得到完全均衡的擦寫,不需要保存已存儲數(shù)據(jù)的地址,也不會受關電和掉電的影響,可以實現(xiàn)整個數(shù) 據(jù)存儲區(qū)域完全均衡的擦寫,可以大大延長FLASH存儲器的使用壽命,完全 滿足電子設備使用壽命的需要。
圖1是本發(fā)明中擦除第1-1頁內(nèi)容方式存儲區(qū)域示意圖; 圖2是本發(fā)明中擦除第I+l頁內(nèi)容方式存儲區(qū)域示意圖。
具體實施方式
下面結合附圖及實施例對本發(fā)明作進一步描述
實施例一參見圖1、 2所示, 一種FLASH存儲器擦寫方法,包括以下步
驟
(1) 設置數(shù)據(jù)幀結構,依次包括起始字、數(shù)據(jù)區(qū)域、結束字及校驗字,結 束字與校驗字之間可以設置補償字FFH,使所述數(shù)據(jù)幀的字節(jié)數(shù)為8的倍數(shù), 復數(shù)個數(shù)據(jù)幀組成存儲區(qū)域內(nèi)的一頁,所述存儲區(qū)域劃分為N頁,編號0頁
(N-l)頁;
(2) 選定最后一個所述數(shù)據(jù)幀所在頁為當前頁,若該頁已寫滿則轉入下一 頁I,將I頁設為當前頁,當所述I頁為存儲區(qū)域中的N-l頁時,I+l頁為0 頁;
(3) 先確定當前頁中寫入數(shù)據(jù)的幀位置,根據(jù)數(shù)據(jù)幀結構査找出該當前頁 中的最后一幀完整幀,并以該幀的下一幀的地址作為寫入數(shù)據(jù)的起始地址,然 后寫入數(shù)據(jù);在每寫完一幀數(shù)據(jù)M后,讀取該幀的數(shù)據(jù)M,利用所述校驗字 檢測讀取數(shù)據(jù)M與寫入數(shù)據(jù)S的吻合性,若檢測出未吻合,則轉入下一數(shù)據(jù) 幀,重新寫入該幀數(shù)據(jù)S,若吻合則轉入下一數(shù)據(jù)幀,寫入下一幀數(shù)據(jù)S+1;
(4) 當前頁I被寫滿后,轉入下一頁,并重新設定該頁為當前頁I,選擇 擦除第I-l頁(如圖1所示)或第I+l頁(如圖2所示)內(nèi)容的兩種擦除方式 中的一種,執(zhí)行擦除;當選擇擦除第I+l頁內(nèi)容的擦除方式情況下,擦除前先 判斷第I+l頁是數(shù)據(jù)頁或是空白頁,為數(shù)據(jù)頁時執(zhí)行擦除,否則跳過擦除,進 入下一步驟;(5)在正常工作過程中,重復步驟(3),直至當前頁為第N-l頁,所述第1+1 頁為0頁;在重新上電后,重復步驟(2)。
本實施例在用于蓄電池電量計中時,結果如下
蓄電池電量計是用來測量顯示電動搬運車蓄電池剩余電量和累計工作時 間的儀表,它采用的嵌入式微控制器是Freescale公司的8位MCU芯片 MC68HC908LJ12,該MCU內(nèi)有12KB的FLASH存儲器,地址范圍C000H EFFFH, 一頁的大小為128個字節(jié)。我們將FLASH存儲器的前2KB(C000H C7FFH)用來存放測量數(shù)據(jù),后10KB(C800H EFFFH)用來存放程序,這樣數(shù) 據(jù)存儲區(qū)共有2048 + 128=16頁,頁號為0 15。 一幀數(shù)據(jù)為16個字節(jié),其中 起始字、結束字都采用1字節(jié)的55H,校驗字采用2字節(jié)的CRC16校驗碼, 一個頁中可以存儲128 + 16=8幀數(shù)據(jù)。由于只需要最后一幀作為有效數(shù)據(jù),因 此數(shù)據(jù)存儲只需保存一幀,采用擦除第1-1頁的方式。
設數(shù)據(jù)幀的寫入地址存放在一個名字叫FlashAddr的指針中,每次上電 時,從地址C000H開始,找到最后一幀數(shù)據(jù)作為系統(tǒng)運行的有效數(shù)據(jù),并使 FlashAddr指向下一幀地址的第一個字節(jié)處。如果C000H C7FFH的數(shù)據(jù)存 儲區(qū)都是空的,則使FlashAddFC000H,并將系統(tǒng)運行的有效數(shù)據(jù)置為默認 的初始數(shù)據(jù)。
在運行過程中, 一般情況下每6分鐘寫入一幀數(shù)據(jù)到FLASH存儲器,當 蓄電池電量發(fā)生變化時,還要馬上寫入到FLASH存儲器中。除最初需寫9幀 數(shù)據(jù)外,以后每寫入8幀數(shù)據(jù)就會寫滿當前頁并且會有一幀數(shù)據(jù)寫到下一頁 上,這時就擦除當前頁,而下一頁就成為新的當前頁。當?shù)?5頁寫滿后,第 0頁成為新的當前頁,這樣就使C000H C7FFH的2KB數(shù)據(jù)存儲區(qū)得到完全 均衡的擦寫,延長了 FLASH存儲器的使用壽命。
采用現(xiàn)有技術中的方法,使用固定單元存儲數(shù)據(jù),存儲單元每6分鐘就需 要擦寫一次,在每天工作10小時的情況下,1萬次擦寫可以使用的時間是6 分鐘X10000-60000分鐘=1000小時-100工作日;在極限情況下的使用時間不 到42個工作日。即使是可以進行10萬次擦寫的FLASH存儲器,每6分鐘擦 寫一次,在每天工作10小時的情況下也只能使用不到3年時間, 一般電子儀 表的使用壽命應該在IO年以上,因此FLASH會提前損壞,無法滿足電子設備的需要。而在本實施例中,由于每6分鐘寫入一幀數(shù)據(jù),每寫入8幀數(shù)據(jù)后 會擦除一頁,即每6X8=48分鐘擦寫一頁,電量計中16頁數(shù)據(jù)存儲區(qū)都擦寫 一遍的時間為48X 16=768分鐘=12.8小時。假設電動搬運車每天工作10小時, 一年工作365天,1萬次擦寫可以使用的時間是12.8小時X 1000(H128000小 時=12800工作日=35年。即使是每天24小時工作的極限情況,實施例中的 FLASH存儲器也可以使用將近15年,完全滿足電子設備的需要。
權利要求
1. 一種FLASH存儲器擦寫方法,包括以下步驟(1)設置數(shù)據(jù)幀結構,每一數(shù)據(jù)幀內(nèi)含有8倍數(shù)的字節(jié)數(shù),復數(shù)個數(shù)據(jù)幀組成存儲區(qū)域內(nèi)的一頁,所述存儲區(qū)域劃分為N頁,編號0頁~(N-1)頁;(2)選定最后一個所述數(shù)據(jù)幀所在頁為當前頁,若該頁已寫滿則轉入下一頁I,將I頁設為當前頁,當所述I頁為存儲區(qū)域中的N-1頁時,I+1頁為0頁;(3)寫入數(shù)據(jù);(4)當前頁I被寫滿后,轉入下一頁,并重新設定該頁為當前頁I,選擇擦除第I-1頁或第I+1頁內(nèi)容的兩種擦除方式中的一種,執(zhí)行擦除;(5)在正常工作過程中,重復步驟(3),直至當前頁為第N-1頁,所述第I+1頁為0頁;在重新上電后,重復步驟(2)。
2. 根據(jù)權利要求1所述的FLASH存儲器擦寫方法,其特征在于所述 數(shù)據(jù)幀結構依次包括起始字、數(shù)據(jù)區(qū)域、結束字及校驗字,所述結束字與校驗 字之間設置補償字,使所述數(shù)據(jù)幀的字節(jié)數(shù)為8的倍數(shù)。
3. 根據(jù)權利要求2所述的FLASH存儲器擦寫方法,其特征在于所述 步驟(3)之前先確定當前頁中寫入數(shù)據(jù)的幀位置,根據(jù)數(shù)據(jù)幀結構査找出該當前 頁中的最后一幀完整幀,并以該幀的下一幀的地址作為寫入數(shù)據(jù)的起始地址, 然后執(zhí)行步驟(3)寫入數(shù)據(jù)。
4. 根據(jù)權利要求2所述的FLASH存儲器擦寫方法,其特征在于所述 步驟(3)中,在每寫完一幀數(shù)據(jù)M后,讀取該幀的數(shù)據(jù)M,利用所述校驗字檢 測讀取數(shù)據(jù)M與寫入數(shù)據(jù)S的吻合性,若檢測出未吻合,則轉入下一數(shù)據(jù)幀, 重新寫入該幀數(shù)據(jù)S,若吻合則轉入下一數(shù)據(jù)幀,寫入下一幀數(shù)據(jù)S + 1。
5. 根據(jù)權利要求1所述的FLASH存儲器擦寫方法,其特征在于所述 步驟(4)中,選擇擦除第1+1頁內(nèi)容的擦除方式情況下,擦除前先判斷第1+1頁 是數(shù)據(jù)頁或是空白頁,為數(shù)據(jù)頁時執(zhí)行擦除,否則跳過擦除,進入下一步驟。
全文摘要
本發(fā)明公開了一種FLASH存儲器擦寫方法,包括以下步驟(1)設置數(shù)據(jù)幀結構,每一數(shù)據(jù)幀內(nèi)含有8倍數(shù)的字節(jié)數(shù),存儲區(qū)域分為N頁;(2)選定最后一個所述數(shù)據(jù)幀所在頁為當前頁,若該頁已寫滿則轉入下一頁I,將I頁設為當前頁,當所述I頁為存儲區(qū)域中的N-1頁時,I+1頁為0頁;(3)寫入數(shù)據(jù);(4)當前頁I被寫滿后,轉入下一頁,并重新設定該頁為當前頁I,選擇擦除第I-1頁或第I+1頁內(nèi)容的兩種擦除方式中的一種,執(zhí)行擦除;(5)在正常工作過程中,重復步驟(3),直至當前頁為第N-1頁,所述第I+1頁為0頁;在重新上電后,重復步驟(2)。本發(fā)明通過選用兩種擦除方式,實現(xiàn)每個存儲單元完全均衡的擦寫,延長FLASH的使用壽命。
文檔編號G11C16/06GK101419841SQ20081024314
公開日2009年4月29日 申請日期2008年12月9日 優(yōu)先權日2008年12月9日
發(fā)明者劉曉升, 王宜懷, 陸曉峰 申請人:蘇州大學