根據啟動模式分析的結論:
1、 通過boot引腳設定可以將中斷向量表定位於sram區,即起始位址為0x02000000,同時復位後pc指標位於0x02000000處;
2、 通過boot引腳設定可以將中斷向量表定位於flash區,即起始位址為0x08000000,同時復位後pc指標位於0x08000000處;
3、 通過boot引腳設定可以將中斷向量表定位於內建bootloader區,本文不對這種情況做論述;
stm32 將0x8000000 對映到 0x00000000,即如果從內部flash啟動,會從 0x08000004 處進行取指令 (cm3定義的 0x08000000 用於存放sp指標),故,0x00000000 與 0x8000000 內容完全相同,如下所示:
整體過程為:
①上電後硬體設定sp、跳轉到 reset_hander
②設定系統時鐘(systeminit)
③軟體設定sp
④載入.data、.bss,並初始化棧區(__main)
⑤跳轉到c檔案的main函式
在.s檔案中,已經將中斷向量表定義完整,系統會跳轉到固定位址進行執行。第一條執行 reset_handler。接著執行systeminit設定執行時鐘資訊(72mhz)。
__main函式是內部的乙個庫函式,在此函式中呼叫了_scatter_load, _scatterload_null, _scatterload_copy 等函式,負責初始化堆疊,rw-data搬運,zi段初始化等等操作。並最終跳轉到 main 函式。
值得注意的是:keil編譯完成後:
code:代表程式**段
ro_data:代表唯讀資料段
rw_data:代表已經初始化全域性資料
zi_data:代表未初始化全域性資料
由於程式在 flash 中直接通過匯流排進行訪問,程式執行在 flash 上,而可更改的資料存於 sram 中,故:
ro_size = code + ro_data(占用 flash )
rw_data = rw_data + zi_data(占用 sram)
rom_size = code +
ro_data + rw_data ( 燒寫到 flash 大小空間 )
針對 zi 資料,是不存 flash 中,直接在 sram 中初始化為 0
stm32啟動過程
三 總結 這三種模式請看下列圖示 三個不同作用的空間在微控制器裡面佔了三個空間,微控制器引導哪個空間資源啟動,由boot1和boot0決定!正常來說一般是從flash啟動!啟動的程式是在sram上執行!有乙個很關鍵資料結構的知識點,執行時sram會分成以下四個部分 常量區,堆,棧,靜態儲存區!例如 ...
STM32的啟動過程
當執行main函式的時候,晶元不是直接執行main函式的,還有乙個啟動的過程 m3的啟動方式由boot0和boot1選擇,可以有三種啟動方式 最常用的應該是第一種,就是將程式儲存在片內的flash上,掉電後程式不會消失。boot引腳的設定不同,晶元復位後起始位址就不同,選擇從flash啟動的時候,其...
STM32啟動過程分析
硬體 stm32f1系列 軟體環境 keil 4.54 注 本文中提到的rtos以rt thread為例,不涵蓋所有rtos的情況 在keil mdk中新建工程時會根據所選的device自動生成啟動 檔案startup.s,該檔案的作用可根據其頭部的注釋看出 this module performs...