前言:把數據存儲到到EEPROM或FLASH可以對一些數據進行掉電可存儲,STM32L系列纔有內部EEPROM,其他系列都只有Flash,操作FLASH也可以達到掉電保存數據的效果。關於存儲器件家族介紹用一張圖來描述最好不過了,如下:
硬件支持:STM32F051C8T6,64KB的FLASH,沒有EEPROM。
正文:
按照不同容量,Flash組成部分:主存儲器塊和一個信息塊以及一些閃存存儲器和接口寄存器
其中主存儲器有三類:32個1K字節/頁(小容量)、128個1K字節/頁(中容量)、256個2K字節/頁(大容量)。
C8T6有64k的主存儲器容量屬於中等容量類型。
FLASH讀寫流程:
-
對FLASH寫入數據:
- 解鎖FLASH
- 擦除FLASH
- 寫入數據到FLASH
- 鎖住FLASH
-
FLASH讀取數據:直接讀取相應的FLASH地址即可。
先在數據手冊上面查看Flash的大小以及起始和終止地址,這裏是0x0800 0000 ~ 0x0801 FFFF
實現函數:
1、解鎖。
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
2、在HAL庫裏面給我們提供了兩個函數來寫Flash,一個非中斷方式一箇中斷方式
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
TypeProgram指定了寫半字,全字還是雙字,所以Data是一個64位的變量。實質是都是每次寫16bit,由於一次只能寫入16bit的數據,當要寫入超過半字的數據時,非中斷用的方法是在函數裏等待上一次寫操作完成,然後再繼續寫入半字,只是這裏HAL庫幫我們封裝好了而已。
3、Flash擦除,這個函數會對整頁進行擦除操作。
void FLASH_PageErase(uint32_t PageAddress);
4、Flash上鎖
HAL_StatusTypeDef HAL_FLASH_Lock(void)
具體代碼:
1、我們先定義一些扇區地址
2、 我們這裏使用一個聯合體來存儲參數
3、 編寫一些Flash操作函數、
4、封裝我們的實現函數對參數進行一次性Flash操作
6、我們來操作一下驗證一下我們的函數
現象:
我們可以看到Flash讀寫應該是成功了,因爲我們使用的是聯合體,我們先給一個參數賦值了,然後寫入到Flash中,然後再次改變參數的值,然後從Flash中讀取剛剛寫入的值,我們可以看到,最後參數的值爲我們一開始寫入到Flash中的值。