在STM32微控制器中,存在一個重要的內存映射特性:Flash存儲器可以同時出現在兩個不同的地址區域,而且可以通過重映射功能改變CPU啟動時從哪個地址獲取初始指令。
STM32的Flash映射雙重機制
當描述"通常起始于地址0x00000000,用于存放Flash內容"以及"部分STM32允許將Flash映射到0x08000000"時,這指的是:
-
物理Flash位置:在STM32中,內部Flash的物理地址實際上是從0x08000000開始的。這個地址是Flash在內存中的"真實"位置。
-
啟動地址映射:當處理器復位后,它會從地址0x00000000開始獲取中斷向量表和第一條執行指令。為了滿足這個要求,STM32通過內部硬件機制將物理地址0x08000000開始的Flash內容"映射"(別名)到地址0x00000000。
-
靈活的啟動配置:STM32允許將不同的內存區域映射到0x00000000地址,這使得處理器可以從不同的地方啟動:
- Flash啟動模式:將Flash(0x08000000)映射到0x00000000
- 系統存儲器啟動:將內部系統存儲器(通常在0x1FFF0000附近)映射到0x00000000
- SRAM啟動:將SRAM(0x20000000)映射到0x00000000
這種設計的實際意義
這種內存映射設計具有幾個重要的優勢:
-
引導加載程序支持:
- STM32的內部系統存儲器包含一個出廠預編程的引導加載程序(Bootloader)
- 通過將系統存儲器映射到0x00000000,可以執行這個引導程序,用于通過UART、USB等接口更新Flash
-
靈活的代碼執行位置:
- 可以選擇從SRAM執行代碼,這在某些需要高執行速度的場景中非常有用
- 這也方便進行在線更新程序代碼,新代碼可以先下載到SRAM,然后重新映射執行
-
兼容性和安全性:
- 保證了ARM架構的兼容性(ARM架構要求從地址0開始執行)
- 物理Flash起始于0x08000000而非0x00000000,這增加了一定的保護性(防止某些意外的內存訪問)
實際示例說明
假設我們有一個STM32F103微控制器,它有以下啟動配置選項:
-
默認Flash啟動模式:
- BOOT0引腳=0,BOOT1引腳=X(任意)
- 處理器從地址0x00000000開始執行
- 實際執行的是被映射到此處的物理地址0x08000000的Flash內容
- 中斷向量表位于Flash的開始位置
-
系統存儲器啟動模式:
- BOOT0引腳=1,BOOT1引腳=0
- 處理器從地址0x00000000開始執行
- 實際執行的是被映射到此處的系統存儲器內容(出廠預編程的引導加載程序)
- 這可以激活STM32的串行bootloader,用于通過UART燒寫程序
-
SRAM啟動模式:
- BOOT0引腳=1,BOOT1引腳=1
- 處理器從地址0x00000000開始執行
- 實際執行的是被映射到此處的SRAM內容
- 這要求預先通過調試接口將程序加載到SRAM中
實際應用場景
-
固件更新:
將系統內存重映射到0x00000000,執行內置的引導程序,接收新固件并寫入Flash。 -
執行速度優化:
將時間關鍵的代碼復制到SRAM執行,消除Flash訪問等待狀態的影響,同時可能重映射SRAM到0x00000000。 -
安全啟動:
在Flash中實現多級引導程序,可以在啟動時驗證應用程序的完整性和真實性,必要時通過重映射機制加載備份程序。
總而言之,這種地址映射機制增加了STM32的靈活性和功能性,是它作為一個強大微控制器平臺的重要特性之一。