啟動流程
知識點
- MCU 上電復位。
- MSP從向量表第0個地址讀取一個32位(2字節)的值并保存,該值為棧頂地址。
- PC計數器從第1個地址讀取一個兩字節的值并保存,該值為程序入口,一般是Reset_Handler。
- 想了解FLASH地址映射可以看STM32八股【4】-----AHB地址映射
__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault Handler
- 執行Reset_Handler,初始化中斷向量表。
Reset_Handler為[WEAK],可以自定義修改。
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT __mainIMPORT SystemInitLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP
在Reset_Handler中執行:
- SystemInit():
初始化系統時鐘、PLL、外設時鐘、Flash 延時等。 - C 運行時環境初始化:
- 調用
__main
- 初始化 .data 段、具體來講就是把FLASH已初始化的數據拷貝到RAM對應的.data段區域。
- RAM .bss段未初始化的全部清零
- 不熟悉FLASH和RAM構成的可以看STM32八股【3】------RAM和片上FLASH
- 調用
- 進入 main():
完成上述初始化后,調用 main() 進入用戶程序。 - 程序運行,
如果發生中斷,CPU 根據矢量表跳轉到對應中斷服務函數 (xxx_IRQHandler) 處理。
問題
-
請解釋STM32微控制器的啟動過程,從上電到用戶主程序的執行,包括主堆棧指針(MSP)和程序計數器(PC)的初始化。
-
在STM32的啟動文件中,向量表的作用是什么?它通常位于存儲器的哪個區域,為什么?
-
啟動文件中定義了堆棧和堆的大小。請解釋它們在嵌入式系統中的作用,以及如何根據應用需求確定它們的大小。
-
在啟動文件中,Reset_Handler的作用是什么?它通常執行哪些關鍵任務來準備系統運行?