1. 程式人生 > >STM32之flash

STM32之flash

STM32本身沒有內建eeprom,但是STM32具有IAP(在應用程式設計)功能,我們可以將flash當作eeprom使用。

不同容量的STM32,其flash容量也不同。STM32c8t6內部flash為64K。

STM32 的快閃記憶體模組由:主儲存器、資訊塊和快閃記憶體儲存器介面暫存器等 3 部分組成

  1. 主儲存器,該部分用來存放程式碼和資料常數(如 const 型別的資料)。對於大容量產品,其
    被劃分為 256 頁,每頁 2K 位元組。注意,小容量和中容量產品則每頁只有 1K 位元組。從上圖可以
    看出主儲存器的起始地址就是 0X08000000, B0、B1 都接 GND 的時候,就是從 0X08000000
    開始執行程式碼的
  2. 資訊塊,該部分分為 2 個小部分,其中啟動程式程式碼,是用來儲存 ST 自帶的啟動程式,
    用於串列埠下載程式碼,當 B0 接 V3.3,B1 接 GND 的時候,執行的就是這部分程式碼。使用者選擇字
    節,則一般用於配置防寫、讀保護等功能
  3. 快閃記憶體儲存器介面暫存器,該部分用於控制快閃記憶體讀寫等,是整個快閃記憶體模組的控制機構。對主儲存器和資訊塊的寫入由內嵌的快閃記憶體程式設計/擦除控制器(FPEC)管理;程式設計與擦除的高電壓由內部產生。
  4. 特別留意一個快閃記憶體等待時間,因為 CPU 執行速度比 FLASH 快得多,STM32F103
    的 FLASH 最快訪問速度≤24Mhz,如果 CPU 頻率超過這個速度,那麼必須加入等待時間,比
    如我們一般使用72Mhz的主頻,那麼FLASH等待週期就必須設定為2,該設定通過FLASH_ACR
    暫存器設定。

例如,我們要從地址 addr,讀取一個半字(半字為 16 為,字為 32 位),可以通過如下的
語句讀取:

    data=*(vu16*)addr;

快閃記憶體的程式設計和擦除:

      STM32 的快閃記憶體程式設計是由 FPEC(快閃記憶體程式設計和擦除控制器)模組處理的,這個模組包含 7 個
      32 位暫存器,他們分別是:
  FPEC 鍵暫存器(FLASH_KEYR)
  選擇位元組鍵暫存器(FLASH_OPTKEYR)
  快閃記憶體控制暫存器(FLASH_CR)
  快閃記憶體狀態暫存器(FLASH_SR)
  快閃記憶體地址暫存器(FLASH_AR)
  選擇位元組暫存器(FLASH_OBR)
  防寫暫存器(FLASH_WRPR)

     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 位將得到一個警告。