STM32 實現內部Flash的讀寫(HAL庫版)

2022-06-27 04:51:09 字數 2470 閱讀 9677

flash 中文名字叫快閃儲存器,是一種長壽命的非易失性(斷電資料不丟失)的儲存器。可以對稱為塊的儲存器單元塊進行擦寫和再程式設計,在進行寫入操作之前必須先執行擦除。乙個nand flash由多個塊(block)組成,每個塊裡面又包含很多頁(page)。每個頁對應乙個空閒區域/冗餘區域(spare area),這個區域不是用來儲存資料的,用於放置資料的校驗值檢測和糾錯的。塊,是nand flash的擦除操作的基本/最小單位。頁,是nand flash的寫入操作的基本/最小的單位。

首先簡要寫一下flash的讀寫流程:

對flash寫入資料

解鎖flash

擦除flash

寫入資料到flash

鎖住flash  

flash讀取資料 (直接讀取相應的flash位址即可)

操作mcu裡的flash,還有幾個注意事項:

1、往flash寫入資料的時候,要先對要寫入的頁進行擦除,如果要寫的頁裡有資料,要先讀出來在快取區,再把頁擦除,再寫入資料;在擦除頁之後,只要這次你寫的資料大小不夠一頁,可以連續寫入。

2、要計算好程式的記憶體,因為你的程式也是儲存在mcu的flash裡的,如果你操作到儲存著程式的記憶體,程式就會死掉,至於程式記憶體怎麼看,你可以生成bin檔案,bin檔案的大小就是你程式所佔記憶體的大小了,生成bin檔案可以參考部落格:程式記憶體基本都是從flash記憶體一開始存起的,這裡以stm32fo72c8t6舉例,如下圖。

看圖可以看出,這個晶元的flash記憶體範圍是 0x0800 0000 ~ 0x0802 0000  ,假設我要燒錄進去的bin檔案為10k,那我們操作flash的時候,位址就要從 0x0800 0000 +  (0x400*11) 開始,避開程式的儲存位置,flash位址偏移1位就是1個位元組。

3、要注意mcu一頁的大小,一些mcu一頁是1kb,一些mcu一頁是2kb

下面舉個例子寫入資料 0x0001 到flash中uint16_t my_add = 0x0001

;

uint32_t

robot_num_flash_add = 0x08005000; 

flash_eraseinittypedef my_flash;

//宣告 flash_eraseinittypedef 結構體為 my_flash

hal_flash_unlock();//

解鎖flash

my_flash.typeerase

= flash_typeerase_pages; //

標明flash執行頁面只做擦除操作

my_flash.pageaddress= robot_num_flash_add; //

宣告要擦除的位址

my_flash.nbpages= 1; //

說明要擦除的頁數,此引數必須是min_data = 1和max_data =(最大頁數-初始頁的值)之間的值

uint32_t pageerror = 0; //

設定pageerror,如果出現錯誤這個變數會被設定為出錯的flash位址

hal_flashex_erase(&my_flash, &pageerror); //

呼叫擦除函式擦除

uint16_t write_flash_data =my_add;

//對flash進行燒寫,flash_typeprogram_halfword 宣告操作的flash位址的16位的,此外還有32位跟64位的操作,自行翻查hal庫的定義即可
hal_flash_program(flash_typeprogram_halfword, robot_num_flash_add, write_flash_data); 

hal_flash_lock();

//鎖住flash

寫完之後,接著就到讀了,flash寫有次數限制,寫的次數在1w次還是10w次(忘了)就不可寫入了,而讀是沒有次數限制的,讀多少次都可以,下面就把寫入到flash裡的資料 0x0001 讀出來

uint32_t robot_num_flash_add = 0x08005000;
id_num = *(__io uint16_t*)( robot_num_flash_add ); //*(__io uint16_t *)是讀取該位址的引數值,其值為16位資料,一次讀取兩個位元組,*(__io uint32_t *)就一次讀4個位元組

printf("

id_num:0x%x\r\n

", id_num);

經過上面的程式就可以實現 stm32 中 flash 資料的讀寫了,具體怎麼讀寫,每個案子不同,各位就可以根據需求去修改,只要注意好注意事項即可,**已經實測可用。

stm32 讀寫內部Flash

stm32的flash分為主儲存塊和資訊塊。主儲存塊用於儲存具體的程式 和使用者資料,資訊塊用於負責由stm32出廠是放置2kb的啟動程式 bootloader 和512b的使用者配置資訊區。主儲存塊是以頁為單位劃分的,一頁大小為1kb。範圍為從位址0x08000000開始的128kb內。對flas...

STM32 讀寫內部Flash

flash模組組織 儲存器被組織為程式儲存器模組,資料eeprom模組和資訊塊。程式儲存器塊分為4 kb的扇區,每個扇區都是進一步分成16頁,每頁256位元組。該操作用於擦除程式儲存器中的頁面 64個字 要做到這一點 解鎖flash pecr暫存器 1.將pekey1 0x89abcdef寫入程式設...

STM32之內部FLASH原理

不同型號的 stm32,其 flash 容量也有所不同,最小的只有 16k 位元組,最大的則達到了 1024k 位元組。市面上 stm32f1 開發板使用的晶元是 stm32f103系列,其 flash 容量一般為 512k 位元組,屬於大容量晶元。大容量產品的 flash 模組組織結構如圖 40....