【STM32+cubemx】0015 HAL庫開發:內部flash讀寫


本節我們來學習stm32內部flash的讀寫。在某些應用中,我們需要保存少量掉電仍然不丟失的數據,而在電路板上額外增加一塊eeprom或者flash又太浪費硬件資源,這時我們就可以把這些數據保存在stm32內部的flash里。

1)stm32內部flash簡介

我們先來了解一下stm32內部的存儲結構,如下圖所示:

stm32的復位地址是從0x0000 0000開始。

flash地址起始於0x0800 0000,結束地址是0x0800 0000加上芯片實際的flash大小,不同的芯片flash大小不同;程序存儲在這個區域,stm32芯片會自動將0x0800 0000與0x0000 0000映射,所以,軟件編譯生成的目標文件燒寫到這個區域,復位之后就可以執行。

RAM起始地址是0x2000 0000,結束地址是0x2000 0000加上芯片的RAM大小,不同的芯片RAM也不同。

如keil中生成的配置,stm32芯片的flash(ROM)是從0x08000000開始的,RAM是從0x20000000開始的,選擇不用芯片時,大小是不同的:

Stm32芯片燒寫時,就是將軟件編譯生成的目標代碼,燒寫到0x08000000地址起始的flash中,如果目標代碼小於芯片flash的容量,則最后一段flash就是空閑的。這一段空閑區域就可以用來存儲用戶的數據,實現掉電不丟失。

2)stm32內部flash的使用

我們仍然以串口的工程為基礎,低功耗模式本身不需要特殊設置,生成HAL庫工程文件時都會自帶,直接使用串口工程即可。

先定義幾個宏,用於指定分配給用戶讀寫flash的區域:

主要是定義用戶flash的起始地址、結束地址、可用頁數(這里使用的芯片是stm32f103c8t6,內部flash總共64k,每頁為1k,把最末尾的2頁分配給用戶使用)。

編寫代碼,先看讀取flash的代碼:

這個函數實現從用戶flash起始地址讀取num個32bit的數,放在DATA_32區域中;讀取flash的過程,本質上是把要讀取的flash地址轉換為指針,然后獲取該指針指向的數據。

再來看寫入flash的函數,實現把DATA_32區域中的num個32bit的數據寫入到用戶存儲區。

這個函數主要分兩部分,擦除和寫入;在擦除和寫入前,為了保護flash不被誤操作,還需要解鎖flash;在擦除和寫入后,需要重新給flash上鎖:

函數內部的調用解鎖、擦除、寫入、上鎖各個函數都是HAL庫提供的,使用很方便。

主函數中,我們添加測試代碼,循環擦除、寫入、再讀取打印,每次寫入的數據都是上次讀出的數據加1:

運行結果如下圖:

可以看到,讀出的數據是正確的。

3)stm32內部flash讀寫的注意事項

使用內部flash需要注意幾點:

a)0x08000000起始的一段已被程序占用,用戶區域最好從flash區的末尾使用,不能與已使用的部分沖突;由於程序也燒寫在flash區,用戶在擦寫flash時,如果操作不當會損壞固化的程序;所以用戶程序要謹慎處理;

b)Flash需要先擦除,再寫入;可以一次擦除,分若干次向不同的地址寫入;

c)Flash擦除的最小單位是頁,也就是每次一擦除,都會把擦除地址所在頁的整頁數據擦掉;

注意不同系列的stm32芯片,內部的flash分頁大小也不同:

小容量產品:主存儲塊1-32KB,每頁1KB

中容量產品:主存儲塊64-128KB,每頁1KB

大容量產品:主存儲塊256KB以上,每頁2KB

互聯型產品:主存儲塊256KB以上,每頁2KB

d)Flash擦除和寫入的速度慢,有的需要幾十ms,一般要留足時間,並且盡量不要被打斷;

e)Flash有擦寫次數限制,手冊中給的數據是1W次;讀取次數不限。

歡迎關注我的公眾號,可留言“資料”獲取相關資料和軟件:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM