1. 程式人生 > 其它 >【不是問題的問題】為什麼STM32的Flash地址要設定到0x08000000

【不是問題的問題】為什麼STM32的Flash地址要設定到0x08000000

本文原貼地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=109321


我們言簡意賅的普及下這個知識點,爭取讓大家不傷腦細胞

一、背景知識:

M3,M4核心晶片上電覆位後,要固定從0x0000 0000地址讀取中斷向量表,獲取復位中斷服務程式的入口地址後,進入復位中斷服務程式,其中0x0000 0000是棧頂地址,0x0000 0004存的是復位中斷服務程式地址。

ARM官方回覆:
https://developer.arm.com/documentation/ka001328/latest



二、引出問題:

既然ARM規定了M3,M4核心要從地址0x0000 0000讀取中斷向量表,而STM32設定Flash地址到0x0800 0000怎麼辦?

STM32支援了個記憶體重對映功能,將地址0x0800 0000開始的內容重對映到首地址0x0000 0000中,這樣就解決了從0x0000 0000讀取中斷向量表的問題。

圖示,以STM32F407IGT6為例,0x0000 0000和0x0800 0000開始的程式對比:

那麼新的問題來:

(1) 你怎麼保證0x08000 0000首地址存的就是中斷向量表,我們不可以隨意設定嗎?

保證中斷向量表存到0x0800 0000,這個涉及到分散載入的一個小知識,以MDK為例,如果大家看xxx.S啟動檔案,裡面通過AREA定義了一個名叫RESET的段,這段存的就是中斷向量表。

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

這個名字很重要,MDK對應的xxx.sct分散載入裡面通過下面這句將這個RESET段放在了0x0800 0000優先儲存。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 
0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM2 0x24000000 0x00080000 { ; RW data .ANY (+RW +ZI) } }

這樣我們就解決了0x0800 0000首地址儲存中斷向量表,一旦程式開始執行後,我們就可以隨意設定中斷向量表的位置了。比如想將中斷向量表存到內部SRAM,我們就可以操作暫存器SCB->VTOR 重新安排,然後將0x0800 0000的內容複製到設定的地址內即可。

(2) 既然設定到0x0800 0000這麼麻煩,為什麼不直接使用0x0000 0000?

這是因為STM32不僅可以從內部Flash啟動,還可以從系統儲存器(可以實現串列埠ISP,USB DFU等程式下載方式,這個程式是ST固化好的程式程式碼)和從內部SRAM啟動,

我們將內部Flash安排到0x0000 0000顯然是不行的。這樣會導致系統儲存器或者內部SRAM無法重對映到0x0000 0000了。




三、瞭解了M3和M4,M7是怎麼個執行情況呢?

M7核心晶片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問題,以STM32H7為例,可以從 0x0000 0000 到 0x3FFF 0000 所有地址進行啟動。

專門安排了個選項位元組來配置。

H7裡面沒有重映射了,它的首地址0x0000 0000安排給ITCM RAM空間使用了。

微信公眾號:armfly_com 安富萊論壇:www.armbbs.cn 安富萊淘寶:https://armfly.taobao.com