STM32的Flash地址是0x08000000,從0x00000000不可以?

爲什麼STM32從Flash地址0x08000000的啓動而不是0x00000000?

這是STM32F103ZE芯片存儲空間的地址映射關係圖。
圖1
在MDK編譯程序設置ROM和RAM地址時候發現:
圖2
圖3
IROM1爲片上程序存儲器,即片上集成的Flash存儲器,對該處理器Flash大小爲512KB,即0x80000 地址區間爲0x8000000~0x0807FFFF

IRAM1爲片上數據存儲器,即片上集成的SRAM存儲器,對該處理器RAM大小爲64KB,即0x10000 地址區間爲0x20000000~0x20010000

這裏問題爲什麼程序啓動地址在MDK設置裏爲0x08000000?
分析根據圖1(Cortex-M3 預定義的存儲器映射)這個是Cortex-M3核地址的映射分佈圖,我們看到代碼區是0x00000000-0x1FFFFFFF總共對應地址大小爲512MB。而對於STM32F103ZE芯片使用到的ROM空間只有512KB。Cortex-M3定下的規矩是從0地址啓動,SMT32當然不能破壞ARM定下的“規矩”,所以它做了一個地址重映射的過程。
什麼是重映射?
ARM芯片的地址重映射 映射就是一一對應的意思。重映射就是重新分配這種一一對應的關係
普通的單片機把可執行代碼和數據存放到存儲器中。單片機中的CPU從儲器中取指令代碼和數據。其中存儲器中每個物理存儲單元與其地址是一一對應而且是不可變的。如下圖,CPU讀取0x00000000地址上存儲單元的過程
在這裏插入圖片描述
ARM芯片中有些物理存儲單元的地址可以根據設置變換。就是說一個物理存儲單元現在對應一個地址,經過設置以後,這個存儲單元就對應了另外一個地址了(重映射就是重新分配這種一一對應的關係)
如下圖
在這裏插入圖片描述
上圖表示把0x00000000地址上的存儲單元映射到新的地址0x08000000上。CPU存取0x08000000就是存取0x00000000上的物理存儲單元。網上說這種重映射設計主要是爲了提高應用程序異常響應得速度。因爲RAM的存取速度遠高於對FLASH的存取速度,當程序發生異常後,這時代碼區存在兩個異常向量區,提高異常響應速度(待考證)
那麼我們看芯片上的BOOT0和BOOT1配置啓動方式如下圖:
在這裏插入圖片描述
當BOOT1=X,BOOT0=0時(這種情況是嵌入式開發過程中產品最常用的啓動方式),則CPU可以訪問0x0000000或0x08000000(這兩個地址是共同的物理空間)。
驗證設置ROM起始地址爲0x00000000是否和0x08000000這樣:
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
通過配置編譯環境,仿真時看到memory,0x00000000和0x08000000的數據完全一致。

如果設置ROM地址爲0x0000000進行編譯
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
通過配置編譯環境,仿真時看到memory,0x00000500和0x08000500的數據完全一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章