不同型號的 stm32,其 flash 容量也有所不同,最小的只有 16k 位元組,最大的則達到了 1024k 位元組。市面上 stm32f1 開發板使用的晶元是 stm32f103系列,其 flash 容量一般為 512k 位元組,屬於大容量晶元。大容量產品的 flash 模組組織結構如圖 40.1.1 所示:
stm32f1 的快閃儲存器(flash)模組由:主儲存器、資訊塊和快閃儲存器儲存器介面暫存器等 3 部分組成。下面我們就來介紹下這些組成部分:
①主儲存器。該部分用來存放**和資料常數(如 const 型別的資料)。對於大容量產品,其被劃分為 256 頁,每頁 2k 位元組。注意,小容量和中容量產品則每頁只有 1k 位元組。從上圖可以看出主儲存器的起始位址就是0x08000000, boot0、boot1 都接 gnd 的時候,就是從 0x08000000 開始執行**的。
③快閃儲存器儲存器介面暫存器。該部分用於控制快閃儲存器讀寫等,是整個快閃儲存器模組的控制機構。對主儲存器和資訊塊的寫入由內嵌的快閃儲存器程式設計/擦除控制器(fpec)管理;程式設計與擦除的高電壓由內部產生。
在執行快閃儲存器寫操作時,任何對快閃儲存器的讀操作都會鎖住匯流排,在寫操作完成後讀操作才能正確地進行;既在進行寫或擦除操作時,不能進行**或資料的讀取操作。
下面我們就來看下如何對快閃儲存器進行讀取、程式設計和擦除。
(1)快閃儲存器的讀取
stm32f1 可通過內部的 i-code 指令匯流排或 d-code 資料匯流排訪問內建快閃儲存器模組,本章我們主要講解資料讀寫,即通過 d-code 資料匯流排來訪問內部快閃儲存器模組。為了準確讀取 flash 資料,必須根據 cpu 時鐘 (hclk) 頻率和器件電源電壓在 flash 訪問控制暫存器 (flash_acr)中正確地設定等待週期數(latency)。當電源電壓低於 2.1v 時,必須關閉預取緩衝器。 flash 等待週期與 cpu 時鐘頻率之間的對應關係,如圖 40.1.2 所示:
等待週期通過 flash_acr 暫存器的 latency[2:0]三個位設定。系統復位後, cpu 時鐘頻率為內部 16m rc 振盪器, latency 預設是 0,即 1 個等待週期。供電電壓,我們一般是 3.3v,所以,在我們設定 72mhz 頻率作為 cpu 時鐘之前,必須先設定 latency 為 3,否則 flash 讀寫可能出錯,導致宕機。stm23f1 的 flash 讀取是很簡單的。例如,我們要從位址 addr,讀取乙個字(位元組為 8 位,半字為 16 位,字為 32 位),可以使用如下方法來讀取:data=*(vu32*)addr;
將 addr 強制轉換為 vu32 指標,然後取該指標所指向的位址的值,即得到了 addr 位址內的值。類似的,將上面的 vu32 改為 vu16,即可讀取指定位址的乙個半字。相對 flash 讀取來說,stm32f1 flash 的寫就複雜一點了,下面我們介紹 stm32f1 快閃儲存器的程式設計和擦除。
(2)快閃儲存器的程式設計和擦除
stm32 的快閃儲存器程式設計是由 fpec(快閃儲存器程式設計和擦除控制器)模組處理的,這個模組包含 7 個 32 位暫存器,他們分別是:
① fpec 鍵暫存器(flash_keyr)
② 選擇位元組鍵暫存器(flash_optkeyr)
③ 快閃儲存器控制暫存器(flash_cr)
④ 快閃儲存器狀態暫存器(flash_sr)
⑤ 快閃儲存器位址暫存器(flash_ar)
⑥ 選擇位元組暫存器(flash_obr)
⑦ 寫保護暫存器(flash_wrpr)
其中 fpec 鍵暫存器總共有 3 個鍵值:
rdprt 鍵=0x000000a5
key1=0x45670123
key2=0xcdef89ab
stm32 復位後, fpec 模組是被保護的,不能寫入 flash_cr 暫存器;通過寫入特定的序列到 flash_keyr 暫存器可以開啟 fpec 模組(即寫入 key1 和key2),只有在寫保護被解除後,我們才能操作相關暫存器。
stm32 快閃儲存器的程式設計每次必須寫入 16 位(不能單純的寫入 8 位資料),當flash_cr 暫存器的 pg 位為』1』時,在乙個快閃儲存器位址寫入乙個半字將啟動一次程式設計;寫入任何非半字的資料, fpec 都會產生匯流排錯誤。在程式設計過程中(bsy 位為』1』 ),任何讀寫快閃儲存器的操作都會使 cpu 暫停,直到此次快閃儲存器程式設計結束。
同樣,stm32 的 flash 在程式設計的時候,也必須要求其寫入位址的 flash 是被擦除了的(也就是其值必須是 0xffff),否則無法寫入,在 flash_sr 暫存器的 pgerr 位將得到乙個警告。stm32 的 flash 程式設計過程如下:
從上圖可以得到快閃儲存器的程式設計順序如下:
① 檢查 flash_cr 的 lock 是否解鎖,如果沒有則先解鎖
② 檢查 flash_sr 暫存器的 bsy 位,以確認沒有其他正在進行的程式設計操作
③ 設定 flash_cr 暫存器的 pg 位為』1』
④ 在指定的位址寫入要程式設計的半字
⑤ 等待 bsy 位變為』0』
⑥ 讀出寫入的位址並驗證資料
前面提到,我們在 stm32 的 flash 程式設計的時候,要先判斷縮寫位址是否被擦除了,所以我們有必要再介紹一下 stm32 的快閃儲存器擦除, stm32 的快閃儲存器擦除分為兩種:頁擦除和整片擦除。頁擦除過程如下所示:
從上圖可以看出,stm32 的頁擦除順序為:①檢查 flash_cr 的 lock 是否解鎖,如果沒有則先解鎖;
②檢查 flash_sr 暫存器中的 bsy 位,確保當前未執行任何 flash 操作;③設定 flash_cr 暫存器的 per 位為』1』;④用 flash_ar 暫存器選擇要擦除的頁;⑤設定 flash_cr 暫存器的 strt 位為』1』;⑥等待 bsy 位變為』0』;⑦讀出被擦除的頁並做驗證;
我們只用到了 stm32 的頁擦除功能,整片擦除功能我們在這裡就不介紹了。通過以上了解,我們基本上知道了 stm32 快閃儲存器的讀寫所要執行的步驟了,由於篇幅限制,本文並沒有 stm32f1 內部 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分為主儲存塊 資訊塊和快閃儲存器儲存器介面暫存器等 3 部分組成。主儲存塊用於儲存具體的程式 和使用者資料。起始位址0x08000000,b0和b1接gnd從這裡開始執行程式。資訊塊用於負責由stm32出廠時放置2kb的啟動程式 bootloader 和512b的使用者配置資訊...