
STM32上電后是怎么啟動的?
main函數之前單片機都做了些什么?
帶著這些疑問我們開始進入游戲。。。。。
首先,開局一張圖,過程全靠編,如有說錯的地方望能指正

啟動大致流程
1- 上電啟動或者硬件復位
2- 單片機從0x00地址開始執行程序,在執行程序前,單片機會根據BOOT引腳設置,將對應的存儲器重映射到0x00處,如設置為BOOT0 = 0 ,BOOT1 = X 時,單片機將內部FLASH映射到0x00處,即將0X8000 0000地址映射到0X00處,單片機從FLASH中的程序啟動,其他啟動方式原理類似,相應的BOOT引腳設置如圖

3- 跳轉到存儲有代碼的存儲介質(如FLASH)以后,單片機首先找到的是一個中斷向量表(向量表如下圖所示),向量表第一個值是復位函數指針,它是用來初始化PC指針寄存器的,當PC指針寄存器初始化完成后,單片機會去執行復位函數

4- 復位函數如下圖,在復位函數中,首先執行系統時鐘初始化函數初始化系統時鐘,然后跳轉到__main(當然,在__main之前也可以再初始化其他外設,如初始化FSMC配置外部SRAM等)

5- 在__main函數中,會初始化內核的寄存器,如R0-R15,劃分堆空間(如果使用到的話)和棧空間(棧空間是C語言程序能運行的必要條件,沒有棧,C程序就無法運行),同時初始化程序數據,即將用戶代碼中的數據從FLASH中搬運到SRAM中,簡單理解就是初始化全局變量(這也就是全局變量在C語言中不初始化也不會出現隨機值的原因了)
相應加載過程如下圖


6-以上步驟執行完畢后,系統將會進入main函數,進入C語言的世界。