啟動流程
1.上電復位
2.系統初始化
3.跳轉到 main 函數
啟動入口:
- cpu被清空,程序從0x00000000開始運行
- 0x00000000存放的是reset_handler的入口地址
- 0x00000000的實際位置會變,根據不同的啟動模式決定
- 啟動模式分為:
- flash啟動:常用的啟動方式,0x00000000被映射到0x0800000
- sram啟動:用于調試
- 系統閃存啟動:用于燒錄程序,跑的是系統自帶的bootloader
初始化中斷向量表
-
0x00000000存放的是中斷向量表的起始位置
-
中斷向量表的前4個字節是 _initial_sp, 表示 主棧指針(MSP) 的初始地址,用來設置堆棧指針(SP)
Stack_Size EQU 0x00000400AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp
其中_initial_sp是一個標號,代表棧+堆,即棧頂
-
然后從下一個地址(0x08000004)讀取復位處理程序的地址(Reset_Handler),并跳轉到那里執行
; Reset handler Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT __mainIMPORT SystemInitLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP
Reset_Handler中主要:
- 調用了systemInit,配置系統時鐘等硬件。
- 進入了_main函數,復制數據,跳轉用戶main函數
SystemInit 是 ST 庫提供的函數,負責初始化時鐘、外設等,比如設置系統時鐘為 72MHz。
__main 是 C 運行時庫的入口,它會初始化全局變量(復制 .data 段到 SRAM,清零 .bss 段),然后跳轉到用戶寫的 main 函數,至此頭文件初始化完成。
stm32 ram和flash分布