利用基于閃存的MCU實(shí)現用戶(hù)數據存儲
采用微控制器的大多數設備還需要某種機制來(lái)存儲在斷電時(shí)仍要被記住的那些設置數據。例如,在更換電池后記不住預設電臺的收音機肯定不會(huì )在市場(chǎng)上取得很大的成功。用戶(hù)希望喜愛(ài)的電臺、預設溫度、參數選擇和其他永久性信息能長(cháng)久保存下來(lái)供每次開(kāi)機時(shí)直接取用。
本文引用地址:http://dyxdggzs.com/article/84016.htm為了滿(mǎn)足這種用戶(hù)需求,設計師一般使用串行EEPROM。這些器件又小又便宜,具有很長(cháng)的歷史,設計工程師用起來(lái)得心應手。但在今天對成本極其敏感的市場(chǎng)下,即使這樣一個(gè)廉價(jià)的器件也可能突破成本預算。因此許多設計師試圖尋求并利用已經(jīng)包含在微控制器芯片中的資源:程序閃存中剩余的空間。
過(guò)去,許多微控制器使用ROM或可紫外線(xiàn)擦除的EPROM來(lái)存儲程序指令。但現在越來(lái)越多的微控制器轉用閃存技術(shù)存儲代碼。選擇閃存的主要理由是,如果在程序代碼中發(fā)現錯誤,閃存數據很容易被擦除和更新。
大多數微控制器具有讀取程序空間中存儲數據的機制?;隈T·諾伊曼架構的處理器,如TI MSP430,可以使用任何尋址模式讀取程序閃存。哈佛架構處理器一般利用特殊的機制將數據從程序空間傳送到數據空間。具有閃存管理功能的其他MCU包括:
1. 包含MOVEC(移動(dòng)常數)指令的非常流行的8051處理器系列;
2. 包含TBLRD和TBLWR(表讀和表寫(xiě))指令的Microchip PIC18系列;
3. 具有偽馮·諾伊曼架構的美信MAXQ微控制器系列,它們允許通過(guò)簡(jiǎn)單的MOVE指令訪(fǎng)問(wèn)閃存程序存儲空間(見(jiàn)圖1)。
圖1:在像美信MAXQ2000這樣的偽馮·諾伊曼MCU中采用的數據交換允許任何存儲器塊被用作代碼或數據存儲器。
但即使能夠從隨機閃存位置讀取數據,完整的非易失性存儲器子系統也必須能夠隨機修改閃存中的數據。這意味著(zhù)需要解決兩個(gè)問(wèn)題:首先,一旦某個(gè)閃存位置被寫(xiě)入,那個(gè)位置的數據只能通過(guò)擦除整個(gè)閃存塊(通常128字節或以上)進(jìn)行修改;其次,閃存的讀寫(xiě)次數非常有限。
本文將介紹如何構建一個(gè)能夠解決這些問(wèn)題、并使用閃存塊模擬隨機寫(xiě)入的機制。雖然本文的用例是MAX2000,但原理適用于支持讀寫(xiě)和擦除閃存的用戶(hù)代碼的任何處理器。本文討論的方案已經(jīng)被用于采用MAXQ3180三相模擬前端和MAXQ2000的三相電表參考設計。
閃存管理的基本知識
閃存是一種電可擦除的存儲器,通常主要用于讀操作,也就是說(shuō),雖然是可寫(xiě)的,但它不希望很頻繁地更新數據,因此對這種存儲器的操作大部分是讀操作。大多數閃存器件是以字(word)為單位寫(xiě)入數據的,但一次只能擦除整個(gè)塊。這使得它們不適用于頻繁變化的存儲應用,只適合存儲那些永遠不變的常數表。
一共有兩種閃存:NAND閃存和NOR閃存。NAND閃存經(jīng)常用于存儲卡和閃盤(pán)。一般來(lái)說(shuō),從NAND器件讀取數據需要幾個(gè)周期,并且大部分是用串行方式完成的。
因此NAND閃存不適于存儲程序代碼,因為存取時(shí)間太長(cháng)。而NOR閃存更像是傳統的字節或字寬的存儲器??梢韵褡xROM器件那樣讀NOR閃存中的數據:使片選和地址線(xiàn)有效,然后等待一段訪(fǎng)問(wèn)時(shí)間后從總線(xiàn)上讀取數據。
閃存塊通常被擦除到“1”狀態(tài),因此經(jīng)過(guò)擦除后,塊中的每個(gè)位置都是0xFFFF。“編程”一個(gè)閃存位置是把某些位從“1”狀態(tài)改變?yōu)?ldquo;0”狀態(tài)。為了使編程過(guò)的位返回到“1”狀態(tài),整個(gè)塊必須被擦除。
任何電可擦除的存儲器件都面臨壽命的問(wèn)題。根據所用技術(shù)的不同,一個(gè)閃存單元在永久失效以前可以承受的擦除-編程次數少則1000次,多則100萬(wàn)次。使用閃存存儲數據的任何方案都必須確保寫(xiě)入次數在整個(gè)單元陣列上獲得均勻分布,沒(méi)有一個(gè)位置會(huì )出現太多的擦除和編程次數。
大多數閃存器件都允許將前次編程中那些未被編程的位從“1”改為“0”狀態(tài)。例如,大多數器件允許用0xFFFE編程過(guò)的那個(gè)位置再用0x7FFE進(jìn)行編程,因為這種操作不會(huì )將任何位從“0”改變到“1”。然而如圖1所示的處理器架構中使用的閃存不允許這樣做。這種寫(xiě)入操作的結果是失敗,內存中的數據仍然是0xFFFE。
理由很簡(jiǎn)單:因為要被編程的存儲塊主要用作代碼空間,通常禁止對前面寫(xiě)過(guò)的位置作任何寫(xiě)操作。因為指令0xFFFF代表的是無(wú)效的源子譯碼(source sub-decode),不可能出現在有效的代碼塊中。這樣,阻止向以前編過(guò)程的位置寫(xiě)入數據有助于保持代碼塊的完整性。
提供非易失性存儲器服務(wù)
以下是提供非易失性存儲器服務(wù)的兩種方案。第一種方案側重于簡(jiǎn)單性,第二種方案比較靈活,但代價(jià)是較復雜。
評論