用MCU的Flash省下一顆EEPROM的錢!

artery-mcu

前言

大部分的電子產品設計都會考量:「如何在產品關機後記錄使用者的設定值?」

這衍生出另外一個問題就是: 如果只是要儲存幾個byte的資料有需要額外增加EEPROM的cost嗎?

這時候如果能夠有效利用MCU本身的FLASH或者是embedded system 外接的FLASH的一部分記憶體區域來模擬成EEPROM的使用,這樣就可以省下EEPROM的成本。

FLASH 與 EEPROM的簡介

FLASH 和 EEPROM 都為非揮發性記憶體(英語:Non-Volatile Memory,縮寫:NVM),在斷電後資料仍然可以長期保存,這為 FLASH 模擬EEPROM 提供了條件,FLASH 與 EEPROM 特點對比如下表所示:

artery-mcu

FLASH 模擬 EEPROM 原理

由於 FLASH 在寫入資料前,需要將 FLASH 資料先擦除為 0xFF,而 FLASH 擦除時通常為磁區擦

除,例如 Artery MCU AT32F403A 的磁區大小為 2K 位元組(注意:每個廠牌FLASH的磁區大小會有1K、2K、4K、8K等不同的規格),這個特性決定了不能簡單的將舊資料擦除然後寫新數據,因為這樣會導致存儲在這個磁區內的其他資料也被擦除,並且也會導致 FLASH 頻繁擦除而降低其使用壽命。

 

所以 FLASH 模擬 EEPROM 的思路是:

  1. 新資料存儲不影響舊資料。
  2. 儘量減少 FLASH 擦除次數,延長 FLASH 使用壽命。

基於以上的考慮,設計了以下FLASH 模擬 EEPROM的存儲結構:

artery-mcu EEPROM 資料存儲模擬結構

EERPOM 模擬結構

這裡的EEPROM 模擬結構範例是由兩個Page組成:Page 0 和Page 1,在使用的時候,1 個Page處於有效狀態,另外一個Page處於擦除狀態,讀取或者寫入資料都在有效狀態的Page進行。

資料格式

存儲的資料格式為(資料 + 資料位址),位址和資料都是 16 位元方式存儲,每一次存儲佔用 32 位元也就是4 個位元組。圖中 Data 列為資料,Data Address 列為資料位址,FLASH Address 列為資料存儲的實際FLASH 位址偏移量。例如上圖中Page 0 的 FLASH Address =12 處,資料為 0x3003,資料位址為 0x0002。

Page Status頁狀態標誌

在第一個資料存儲區,存儲頁狀態標誌 Status,頁狀態標誌有 3 種:

  • 有效狀態:EE_PAGE_VALID,Status = 0x0000,讀取和寫資料在此頁進行。
  • 資料轉移狀態:EE_PAGE_TRANSFER,Status = 0xCCCC,另外一頁滿了,正在傳輸有效數據到本頁。
  • 擦除狀態:EE_PAGE_ERASED,Status = 0xFFFF。

資料寫入

每一次寫入資料前,都會從頁起始位址開始尋找第一個未存儲資料的區域(值為 0xFFFF),然後將待寫入的資料和資料位址寫到未存儲資料的區域。例如上圖中Page 0 的 FLASH Address = 20 處,值為 0xFFFF,就是第一個未存儲資料的區域。

例如此時要再寫入一筆資料0x4321到0x0002的位址,則會將FLASH Address = 20 處的Data 寫入0x4321,在FLASH Address = 20 處的Data Address寫入0x0002。

所以下一次要讀取Data Address 0x0002的資料將會以FLASH Address = 20 處的Data 0x4321為有效資料。

artery-mcu

當知道了頁的大小後,就可以算出最大的變數存儲個數:頁容量/4-1。例如當頁大小為 1K 時,最大可存儲的變數數量為1024/4-1=255。需要注意的是,在實際使用中,應該儘量留出較多的空閒容量,這樣可以減小 FLASH 擦除次數,提高 FLASH 壽命。

 

另外資料位址不可以超過最大能存儲的變數數量,例如當頁大小為 1K 時,最大可存儲的變數數量為1024/4-1=255,那麼資料位址 data address 不可以大於 255。

數據讀取

每一次讀取資料都會從頁結束位址開始向前尋找最後一個存儲的有效資料,例如現在要讀取位址為0x0000 的數據。從上圖中看到 FLASH Address = 4 和 FLASH Address = 16 都是位址為 0x0000 的數據,因為最後一次存儲的資料為 flash address = 16 處的資料,所以此時讀取位址 0x0000 的資料為0x1234。

資料轉移

當一頁數據存滿了之後,會將資料傳輸到空閒頁,將會執行以下操作(以Page 0 滿,Page 1 空為例):

  1. 將Page 1 狀態標記為資料傳輸狀態(EE_PAGE_TRANSFER)
  2. 將所有有效資料複製到Page 1
  3. 擦除Page 0
  4. 將Page 1  狀態標記為有效狀態(EE_PAGE_VALID)
artery-mcu EEPROM 寫入流程圖

結論

MCU依照上述EEPROM 模擬結構及流程所實現的優點如下:

  • 降低成本:可節約一顆EEPROM 晶片。
  • 存儲、讀取速度快:通訊速度快於使用I2C 或者SPI 通訊的EEPROM 元件。
  • 抗干擾能力強:由於FLASH 在MCU內部,不會存在通訊匯流排被外部干擾的問題。
  • 容量可調:可根據實際使用,靈活調整存儲空間大小。

參考文獻

You may also want to know