一、
stm32的FLASH擦除是按整頁或者整扇區擦除的,不同芯片的頁或者扇區(下邊統稱為頁)的大小是不一樣的,有1K,16K,64K,128K等大小。
現在我們想要 存3個不同16bit變量的數據,1秒存一次 ,如果不做任何算法,將這3個變量存到3個不同的頁的16bit地址,每次更改變量內容都要擦除一次整頁(但是我們只使用了16bit的空間),根據芯片數據手冊可知,保證性能的情況下flash最少擦除次數為10K,1萬次。
我們就按1萬次計算,理論上不到3小時我們使用的16bit地址就有損壞的風險。而且要存儲的變量個數也有限,我們芯片不可能有那么多頁,H7系列也就16頁。所以需要一些算法處理,充分利用頁的空間。
二、EEPROM組件原理分析
還是上邊說的存儲情況,存3個不同16bit變量的數據,1秒存一次。
先說一下其大致思路,開辟兩塊連續大小相同的頁,分別為page0,page1,假如我們選用F4的芯片,選用第2頁和第3頁,均為16K。每個變量分配一個16bit的虛擬地址,同16bit數據一起存儲,虛擬地址為了讀取數據方便。
三個變量首先在page0存儲,存滿page0之后,將這3個變量最新的數據復制到page1,然后擦除page0,接下來在page1中存儲,page1存滿之后,將3個變量最新的數據復制到page0,然后擦除page1,就這樣循環存儲。
我們粗略的計算一下保證flash的可靠性的前提下,可以使用的時間,2個頁共32K,也就是每存32K的數據,page0,page1各擦除一次,我們存的是16bit數據+16bit的虛擬地址,那就是每存8K的16bit數據,page0,page1各擦除一次,這是3個變量,那么每個變量平均存2730次時,擦除一次頁,flash擦除壽命按1萬次計算,16bit變量1秒存一次,可以存2730100001秒=>7583小時=>315天,這是每天不間斷的使用,如果每天只使用8小時,大概可以使用2.5年。如果每天使用8小時,變量每10秒存一次,大概可以使用25年。這樣就充分利用了頁空間。
這里需要注意變量個數,和存儲周期,如果周期太快或者變量個數太多,可以增加頁,如果增加頁還是不滿足,那就只能加專用存儲芯片了。
下面看一下具體是怎么實現的:
每個頁都有3個狀態:
- ERASED:當期頁已擦除。
- RECEIVE_DATA:頁正在從另一個滿頁接收(復制)數據。
- VALID_PAGE:頁中包含有效數據,并且在將所有有效數據完全傳輸到已擦除頁之前,此狀態不會改變。
根據官方提供的這個表,結合程序看,邏輯就很清晰了。
推薦看此表的順序:自上而下,從左到右。先看同一列,自上而下,再看不同列,從左到右。一定要結合程序實際過一遍,那樣更深刻。
注:page0格式化是指,將page0設置為VALID_PAGE狀態。
-
STM32
+關注
關注
2270文章
10895瀏覽量
355744 -
EEPROM
+關注
關注
9文章
1019瀏覽量
81561 -
存儲芯片
+關注
關注
11文章
896瀏覽量
43133 -
Flash存儲
+關注
關注
0文章
38瀏覽量
8288
發布評論請先 登錄
相關推薦
評論