本文分析STM32單片機從上電到運行的過程,目的在于了解STM32單片機從啟動到運行的整個過程。
一般我們在使用STM32單片機的時候,都是使用官方提供的驅(qū)動文件,移植到自己即將要使用的工程中,移植完成之后再編寫自己的邏輯代碼,放到main( )函數(shù)中,就可以完美的運行起來了。相信很多的人都沒有去關注過STM32從啟動到運行這個過程都發(fā)生了什么,現(xiàn)在就簡單分析一些這個過程。
本文以STM32F103為例進行分析。在官方給我們提供的啟動文件中,將整個單片機的啟動過程要做的事情都已經(jīng)幫我們做好了,以至于我們在使用這款單片機的時候,幾乎可以不會吹灰之力就可以運行起來。STM32F103的啟動文件形如:

根據(jù)不同的芯片容量,都有相對應的啟動文件可供選擇,實際使用根據(jù)芯片容量選擇合適的啟動文件即可。
啟動文件的主要作用有:
1)設置棧
2)初始化 SP 指針
3)設置堆
4)復位中斷服務函數(shù)
5)調(diào)用 SystemInit()函數(shù)來完成初始化工作
6)調(diào)用__main,該函數(shù)內(nèi)部會調(diào)用 main()函數(shù)
1、設置棧
從啟動文件中可以看到:

上述代碼中: 1)35行,將棧的大小設為0x00000400(即1024 = 1KB)。 2)37行,棧名稱為STACK,不初始化,可讀可寫,8(2^3)字節(jié)對齊。 3)38行,分配一片連續(xù)的存儲區(qū)域并初始化為 0,大小為0x400個字節(jié)。 4)39行,__initial_sp表示棧的結束地址,即棧頂?shù)刂罚琒TM32中棧是由高地址向低地址生長。
2、設置堆

上述代碼中: 1)45行,將堆的大小設為0x00000200(即512B = 0.5KB)。 2)47行,棧名為HEAP,不初始化,可讀可寫,8(2^3)字節(jié)對齊。 3)48行,堆空間起始地址。 4)49行,堆空間:0x200個字節(jié)。 5)50行,堆空間結束地址。
3、對堆棧屬性進行設置

1)PRESERVE8 指令指定當前文件保持堆棧八字節(jié)對齊。 2)告訴匯編器下面是32位的Thumb指令,如果需要匯編器將插入位以保證對齊。
4、設置中斷向量表

1)57行,定義一塊數(shù)據(jù)段,只可讀,段名字是RESET。
2)58行,EXPORT:在程序中聲明一個全局的標號__Vectors,該標號可在其他的文件中引用。
3)59行,在程序中聲明一個全局的標號__Vectors_End。
4)60行,在程序中聲明一個全局的標號__Vectors_Size。
之后的是中斷的定義,可以分為兩部分:
一部分是系統(tǒng)內(nèi)部中斷:

另一部分是外部中斷:

在之后是中斷向量表的其他設置:

1)142行,得到向量表的大小。
2)144行,定義一個代碼段,可讀,段名字是.text。
5、中斷功能的定義
復位中斷:

1)149行,IMPORT:偽指令用于通知編譯器要使用的標號在其他的源文件中定義。 2)150行,系統(tǒng)初始化。 3)151行,R0的值為SystemInit的地址。
4)152行,切換指令集,跳到SystemInit。 5)153行,R0的值為__main的地址。__main是庫提供的函數(shù)。用于完成堆棧,堆的初始化等工作,還會調(diào)用__user_initial_stackheap。 6)154行,切換指令集,跳到__main,并且最終會跳轉(zhuǎn)到main(),進入C語言運行環(huán)境。
6、用戶棧和堆初始化

1)333行,如果勾選了micro lib,使用微庫。 2)339行,沒有勾選微庫。

1)344,用戶堆棧初始化程序入口。 2)346,保存堆起始地址。 3)347行,保存棧結束地址。 4)348行,保存堆結束地址。 5)349行,保存棧起始地址。
7、中斷跳轉(zhuǎn)
中斷發(fā)生之后,是怎么實現(xiàn)跳轉(zhuǎn)到相應的中斷服務函數(shù)里面的呢? 1)首先,前面
定義好了中斷的響應函數(shù),即中斷向量表,標號__Vectors,表示中斷向量表的入口地址。2)我們假設STM32從FLASH啟動,則中斷向量表起始地址為0x8000000,STM32上電后根據(jù)boot引腳來決定PC位置,即啟動后PC跳到0x08000000。3)然后CPU會先取2個地址,第一個是棧頂?shù)刂罚诙€是復位異常地址(Reset_Handler),Reset_Handler最終會進入到C語言的運行環(huán)境,這個時候會先配置NVIC,使用NVIC_SetVectorTable()可以配置中斷向量表的起始地址和偏移,告訴CPU該向量表是位于Flash還是Ram,偏移是多少。 4)在發(fā)生中斷后,CPU找到中斷向量表地址,然后根據(jù)偏移(對號入座)再找到中斷地址,這樣就完成了跳轉(zhuǎn)了。
-
單片機
+關注
關注
6061文章
44858瀏覽量
645903 -
STM32
+關注
關注
2288文章
10996瀏覽量
361908 -
啟動
+關注
關注
0文章
27瀏覽量
14071
發(fā)布評論請先 登錄
STM32H7的啟動過程分析
詳解STM32啟動過程
專家揭秘:STM32啟動過程全解

STM32F429啟動過程詳解
嵌入式uCLinux內(nèi)核啟動過程分析
詳解bootloader的執(zhí)行流程與ARM Linux啟動過程分析

STM32的啟動過程是怎么樣的?

STM32啟動過程--啟動文件--分析

STM32啟動過程分析

評論