MCU類比eeprom準系統
如果你的MCU的flash足夠大。並且你的MCU提供自編程flash指令。則可以通過flash類比出一片eeprom地區。用於儲存資料。
本文參考ST公司的AN2594文檔。使用ST提供的範例。旨在瞭解如何使用Flash類比出一片eeprom。
由表我們得到擦除時間的比較。內部類比的顯然速度快了。然而我要提醒的是如果你存放於類比EEPROM的資料需要頻繁更改。這裡的頻繁指的是時間小於頁擦除時間。由於類比的eeprom是使用flash,所以只能整頁進行擦除。所以建議頻繁修改的資料不要使用類比的eeprom。但是如果只是單純存放掉電前的資料或者1s鐘記錄一段資料則是可以考慮的。這樣可以節省外部eeprom的成本。
上圖我們得到ST公司提供的常式是使用兩頁的flash進行類比。為什麼用兩頁呢。如果只用一頁,我考慮了一下。由於只有一頁。資料只能一直往下寫。會有滿的時候。而且更改資料後。前面的資料不會被擦除。當其中一頁寫滿了。就會將該頁不重複的資料由下到上得搬到第二頁,同時擦除第一頁。
這張圖就是最關鍵的一張圖。有利於瞭解如何存放資料和讀取資料。類比出的eeprom有兩部分組成。分別是虛地址和資料。都為16bit。虛地址存在在高位。資料存在低位。
比如一開始在虛地址0x7777H寫入資料0x1232H。資料存放如圖所示。如果再在同一地址寫入另外一個數,則資料存在下一個位置。但是前面的資料並不會馬上被擦除掉。如果此時要使用ST的函數讀取0x7777H虛地址的資料。那麼讀出來的是0X1245H而不是0x1232H。因為讀取的時候是從下往上讀取。讀取到第一個符合該地址的資料。這樣就很好理解了。
當資料寫滿的時候。這時寫入的新資料將被存在第二頁。此時會自動調用函數將第一頁不重複的資料拷貝到第二頁。比如我們的虛地址0X7777H和0X5555H的資料。如圖所示。然後將第一頁擦除。兩頁交替使用。說到這裡,你也許明白為什麼頻繁修改的資料不適合存在類比的eeprom裡面了。如果頻繁修改。那麼很快一頁就寫滿了。然後需要擦除這一頁。需要20ms。後面的事你都明白啦。
由於我的知識有限,只能瞭解那麼多。如果要將程式移植到別的單片機。可以參照這樣的思路。呵呵。
下面是一點學習心得。
// Note By ChenFen
/*
1.使用STM32內部Flash 類比EEPROM進行讀寫,定義兩頁Flash分別為page0 page1
Flash類比的起始地址修改位置為eeprom.h中的EEPROM_START_ADDRESS
2.修改eeprom.h 檔案中的 NumbOfVar 實現所需儲存變數數量
3.修改 VirtAddVarTab[NumbOfVar] 實現虛擬位址的修改
4.寫入時寫入資料緊跟後面寫入虛地址VirtAddVarTab(0<=i<NumbOfVar)
5.每個Page第一個地址寫入該頁狀態(Earse,Reveice,Vild)
6.相同地址再次寫入時不會把上次寫的擦掉,而是在類比EEPROM區尾部未寫過的地方再次寫入資料、 虛地址,
讀的時候是從尾部開始匹配地址,也就是讀取最後一次寫的內容。
7.類比EEPROM區分為2頁,如果一頁滿了把這一頁內地址不重複的資料複製到另一頁後擦除,2頁交替使用。
8.添加字串儲存函數,改變為1個16bit地址儲存兩位字串的8bit ASCII碼
STM32的應用手冊AN2594提供內部Flash類比EEPROM的方法,此方法可以很好的應用於外部Flash其他帶內部Flash的MCU上。
1.Flash與EEPROM的區別
EEPROM:Electrically erasable programmable read-only memory,電可擦可程式化唯讀記憶體--一種掉電後資料不丟失的儲存晶片。
Flash:快閃記憶體,它結合了ROM和RAM的長處,不僅具備EEPROM的效能,還可以快速讀取資料(NVRAM的優勢),使資料不會因為斷電而丟失。
EEPROM需要更多的元件及矽,為了降低系統成本,較多的MCU均使用Flash代替EEPROM儲存代碼及資料。
| |
EEPROM |
FLASH |
| 寫入時間 |
幾毫秒
隨機位元組:5-10ms
頁:字/100us(5-10ms/頁) |
字編程時間:20us |
| 擦除時間 |
無 |
頁/片擦除時間:20ms |
| 寫入方式 |
一旦啟動,無需CPU幹涉
只需要供電 |
一旦啟動,需要CPU幹涉 |
| 讀訪問 |
串列:100us
隨機字:92us
頁:位元組/2.25us |
並行:100ns
字/幾個CPU周期
訪問時間:35ns |
|
寫/擦除
周期 |
10K-1000K周期 |
10K-100K周期 |
Flash寫訪問速度快; 外部串列EEPROM寫入不會受CPU複位影響,適當的去耦電容可以保持寫入的完成; EEPROM不需要擦除,Flash擦除需要時間,Flash的軟體設計需要充分考慮複位及中斷情況;
2.實現EEPROM類比
至少需要兩個大小一樣的頁:一個提供逐字編程,另一個提供接收前頁資料。當其中一頁寫滿了。就會將該頁不重複的資料由下到上得搬到第二頁,同時擦除第一頁。每頁的前16位半字標記頁狀態。
頁有三種狀態: 擦除:空白頁; 接收資料:從其他整頁接收資料; 有效用頁:包含有效資料,知道所有有效資料轉移到其他頁才改變狀態;
每個變數元素包含虛地址和資料,以便搜尋和更新。當資料修改後,修改後的虛地址和資料儲存在一個新的位置,取資料時返回最後的數值。
從上面這幅圖瞭解如何存放資料和讀取資料。類比出的EEPROM有兩部分組成,分別是虛地址和資料,都為16bit。虛地址存在在高位,資料存在低位。
比如一開始在虛地址0x7777H寫入資料0x1232H。資料存放如圖所示。如果再在同一地址寫入另外一個數,則資料存在下一個位置。但是前面的資料並不會馬上被擦除掉。如果此時要讀取0x7777H虛地址的資料。那麼讀出來的是0X1245H而不是0x1232H。因為讀取的時候是從下往上讀取。讀取到第一個符合該地址的資料。
當資料寫滿的時候。這時寫入的新資料將被存在第二頁。此時會自動將第一頁不重複的資料拷貝到第二頁。比如我們的虛地址0X7777H和0X5555H對應的資料,緊接0X6666H。如圖所示。然後將第一頁擦除。兩頁交替使用。寫入資料的過程判斷該頁是否已滿,從上往下搜尋,找到FFFF,就可以直接寫入。若搜尋完整頁,均無FFFF,說明該頁已滿,需要寫入下一頁,並執行搬移與擦除操作。
資料需要頻繁更改,不建議使用次方式。