STM32 啟動過程簡述

2021-08-20 16:13:03 字數 1286 閱讀 9332

根據啟動模式分析的結論:

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...