STM32內部Flash讀寫

前言:把數據存儲到到EEPROM或FLASH可以對一些數據進行掉電可存儲,STM32L系列纔有內部EEPROM,其他系列都只有Flash,操作FLASH也可以達到掉電保存數據的效果。關於存儲器件家族介紹用一張圖來描述最好不過了,如下:

硬件支持:STM32F051C8T6,64KB的FLASH,沒有EEPROM。

正文:

按照不同容量,Flash組成部分:主存儲器塊和一個信息塊以及一些閃存存儲器和接口寄存器

其中主存儲器有三類:321K字節/(小容量)、1281K字節/(中容量)2562K字節/(大容量)。

C8T6有64k的主存儲器容量屬於中等容量類型。

 

FLASH讀寫流程:

  • 對FLASH寫入數據:

    1. 解鎖FLASH
    2. 擦除FLASH
    3. 寫入數據到FLASH
    4. 鎖住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中的值。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章