MCMCU上電后,首先會根據(jù)BOOT0和BOOT1的狀態(tài)判斷從主Flash/SRAM/ISP中啟動,如果BOOT0為低電平,MCU將會從主Flash中啟動,即主Flash中的數(shù)據(jù)會被映射到0x0000 0000地址,ARM處理器將會從0x0000 0000地址獲取棧頂指針,再從0x0000 0004獲取復位中斷入口地址(引導代碼基地址),如下圖所示,我們隨便打開一個bin文件,前4個字節(jié)為MSP堆棧指針,之后四個字節(jié)為復位中斷入口地址,之后為中斷向量表。

MCU找到堆棧指針和復位中斷入口地址之后,將會加載執(zhí)行復位中斷,復位中斷函數(shù)定義在.s啟動文件中,具體定義如下所示,進入到復位中斷函數(shù)中之后,首先執(zhí)行SystemInit系統(tǒng)初始化函數(shù),該函數(shù)主要為系統(tǒng)時鐘配置函數(shù),之后跳轉到main函數(shù)進行執(zhí)行,也就是說在執(zhí)行到main函數(shù)之前,已經(jīng)進行了系統(tǒng)時鐘配置。執(zhí)行完復位中斷函數(shù)之后,MCU將會進入到main函數(shù)進行執(zhí)行。
;/* reset Handler */ Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
--BY JUWOTEK.