版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、解析STM32的啟動(dòng)過(guò)程當(dāng)前的嵌入式應(yīng)用程序開(kāi)發(fā)過(guò)程里,并且C語(yǔ)言成為了絕大部分場(chǎng)合的最佳選擇。如此一來(lái)main函數(shù)似乎成為了理所當(dāng)然的起點(diǎn)因?yàn)镃程序往往從main函數(shù)開(kāi)始執(zhí)行。但一個(gè)經(jīng)常會(huì)被忽略的問(wèn)題是:微控制器(單片機(jī))上電后,是如何尋找到并執(zhí)行main函數(shù)的呢?很顯然微控制器無(wú)法從硬件上定位main函數(shù)的入口地址,因?yàn)槭褂肅語(yǔ)言作為開(kāi)發(fā)語(yǔ)言后,變量/函數(shù)的地址便由編譯器在編譯時(shí)自行分配,這樣一來(lái)main函數(shù)的入口地址在微控制器的內(nèi)部存儲(chǔ)空間中不再是絕對(duì)不變的。相信讀者都可以回答這個(gè)問(wèn)題,答案也許大同小異,但肯定都有個(gè)關(guān)鍵詞,叫“啟動(dòng)文件”,用英文單詞來(lái)描述是“Bootloader”。無(wú)論
2、性能高下,結(jié)構(gòu)簡(jiǎn)繁,價(jià)格貴賤,每一種微控制器(處理器)都必須有啟動(dòng)文件,啟動(dòng)文件的作用便是負(fù)責(zé)執(zhí)行微控制器從“復(fù)位”到“開(kāi)始執(zhí)行main函數(shù)”中間這段時(shí)間(稱為啟動(dòng)過(guò)程)所必須進(jìn)行的工作。最為常見(jiàn)的51,AVR或MSP430等微控制器當(dāng)然也有對(duì)應(yīng)啟動(dòng)文件,但開(kāi)發(fā)環(huán)境往往自動(dòng)完整地提供了這個(gè)啟動(dòng)文件,不需要開(kāi)發(fā)人員再行干預(yù)啟動(dòng)過(guò)程,只需要從main函數(shù)開(kāi)始進(jìn)行應(yīng)用程序的設(shè)計(jì)即可。話題轉(zhuǎn)到STM32微控制器,無(wú)論是keiluvision4還是IAR EWARM開(kāi)發(fā)環(huán)境,ST公司都提供了現(xiàn)成的直接可用的啟動(dòng)文件,程序開(kāi)發(fā)人員可以直接引用啟動(dòng)文件后直接進(jìn)行C應(yīng)用程序的開(kāi)發(fā)。這樣能大大減小開(kāi)發(fā)人員從其它
3、微控制器平臺(tái)跳轉(zhuǎn)至STM32平臺(tái),也降低了適應(yīng)STM32微控制器的難度(對(duì)于上一代ARM的當(dāng)家花旦ARM9,啟動(dòng)文件往往是第一道難啃卻又無(wú)法逾越的坎)。相對(duì)于ARM上一代的主流ARM7/ARM9內(nèi)核架構(gòu),新一代Cortex內(nèi)核架構(gòu)的啟動(dòng)方式有了比較大的變化。ARM7/ARM9內(nèi)核的控制器在復(fù)位后,CPU會(huì)從存儲(chǔ)空間的絕對(duì)地址0x000000取出第一條指令執(zhí)行復(fù)位中斷服務(wù)程序的方式啟動(dòng),即固定了復(fù)位后的起始地址為0x000000(PC = 0x000000)同時(shí)中斷向量表的位置并不是固定的。而Cortex-M3內(nèi)核則正好相反,有3種情況:1、通過(guò)boot引腳設(shè)置可以將中斷向量表定位于SRAM區(qū),
4、即起始地址為0x2000000,同時(shí)復(fù)位后PC指針位于0x2000000處;2、通過(guò)boot引腳設(shè)置可以將中斷向量表定位于FLASH區(qū),即起始地址為0x8000000,同時(shí)復(fù)位后PC指針位于0x8000000處;3、通過(guò)boot引腳設(shè)置可以將中斷向量表定位于內(nèi)置Bootloader區(qū),本文不對(duì)這種情況做論述;而Cortex-M3內(nèi)核規(guī)定,起始地址必須存放堆頂指針,而第二個(gè)地址則必須存放復(fù)位中斷入口向量地址,這樣在Cortex-M3內(nèi)核復(fù)位后,會(huì)自動(dòng)從起始地址的下一個(gè)32位空間取出復(fù)位中斷入口向量,跳轉(zhuǎn)執(zhí)行復(fù)位中斷服務(wù)程序。對(duì)比ARM7/ARM9內(nèi)核,Cortex-M3內(nèi)核則是固定了中斷向量表的
5、位置而起始地址是可變化的。有了上述準(zhǔn)備只是后,下面以STM32的2.02固件庫(kù)提供的啟動(dòng)文件“stm32f10x_vector.s”為模板,對(duì)STM32的啟動(dòng)過(guò)程做一個(gè)簡(jiǎn)要而全面的解析。程序清單一:;文件“stm32f10x_vector.s”,其中注釋為行號(hào)DATA_IN_ExtSRAM EQU 0 ;1Stack_Size EQU 0x00000400 ;2AREA STACK, NOINIT, READWRITE, ALIGN = 3 ;3Stack_Mem SPACE Stack_Size ;4_initial_sp ;5Heap_Si
6、ze EQU 0x00000400 ;6AREA HEAP, NOINIT, READWRITE, ALIGN = 3 ;7_heap_base ;8Heap_Mem SPACE Heap_Size ;9_heap_limit ;10THUMB ;11PRESERVE8 ;12IMPORT NMIException ;13IMPORT HardFaultException ;14IMPORT MemManageException ;15IMPORT BusFaultException
7、;16IMPORT UsageFaultException ;17IMPORT SVCHandler ;18IMPORT DebugMonitor ;19IMPORT PendSVC ;20IMPORT SysTickHandler ;21IMPORT WWDG_IRQHandler ;22IMPORT PVD_IRQHandler ;23IMPORT TAMPER_IRQHandler ;24IMPORT RTC_IRQHandler ;25IMPORT FLASH_IRQHandler ;2
8、6IMPORT RCC_IRQHandler ;27IMPORT EXTI0_IRQHandler ;28IMPORT EXTI1_IRQHandler ;29IMPORT EXTI2_IRQHandler ;30IMPORT EXTI3_IRQHandler ;31IMPORT EXTI4_IRQHandler ;32IMPORT DMA1_Channel1_IRQHandler ;33IMPORT DMA1_Channel2_IRQHandler ;34IMPORT DMA1_Channel3_IRQHandl
9、er ;35IMPORT DMA1_Channel4_IRQHandler ;36IMPORT DMA1_Channel5_IRQHandler ;37IMPORT DMA1_Channel6_IRQHandler ;38IMPORT DMA1_Channel7_IRQHandler ;39IMPORT ADC1_2_IRQHandler ;40IMPORT USB_HP_CAN_TX_IRQHandler ;41IMPORT USB_LP_CAN_RX0_IRQHandler ;42IMPORT CAN_RX1_
10、IRQHandler ;43IMPORT CAN_SCE_IRQHandler ;44IMPORT EXTI9_5_IRQHandler ;45IMPORT TIM1_BRK_IRQHandler ;46IMPORT TIM1_UP_IRQHandler ;47IMPORT TIM1_TRG_COM_IRQHandler ;48IMPORT TIM1_CC_IRQHandler ;49IMPORT TIM2_IRQHandler ;50IMPORT TIM3_IRQHandler ;51IMPORT TI
11、M4_IRQHandler ;52IMPORT I2C1_EV_IRQHandler;53IMPORT I2C1_ER_IRQHandler;54IMPORT I2C2_EV_IRQHandler;55IMPORT I2C2_ER_IRQHandler;56IMPORT SPI1_IRQHandler ;57IMPORT SPI2_IRQHandler ;58IMPORT USART1_IRQHandler ;59IMPORT USART2_IRQHandler ;60IMPORT USART3_IRQHandler ;61IMPOR
12、T EXTI15_10_IRQHandler ;62IMPORT RTCAlarm_IRQHandler ;63IMPORT USBWakeUp_IRQHandler ;64IMPORT TIM8_BRK_IRQHandler ;65IMPORT TIM8_UP_IRQHandler ;66IMPORT TIM8_TRG_COM_IRQHandler ;67IMPORT TIM8_CC_IRQHandler ;68IMPORT ADC3_IRQHandler ;69IMPORT FSMC_IRQHandler
13、60;;70IMPORT SDIO_IRQHandler ;71IMPORT TIM5_IRQHandler ;72IMPORT SPI3_IRQHandler ;73IMPORT UART4_IRQHandler ;74IMPORT UART5_IRQHandler ;75IMPORT TIM6_IRQHandler ;76IMPORT TIM7_IRQHandler ;77IMPORT DMA2_Channel1_IRQHandler ;78IMPORT DMA2_Channel2_IRQHandler
14、0;;79IMPORT DMA2_Channel3_IRQHandler ;80IMPORT DMA2_Channel4_5_IRQHandler ;81AREA RESET, DATA, READONLY ;82EXPORT _Vectors ;83_Vectors ;84DCD _initial_sp ;85DCD Reset_Handler ;86DCD NMIException ;87DCD HardFaultException ;88DCD MemManageException ;89
15、DCD BusFaultException ;90DCD UsageFaultException ;91DCD 0 ;92DCD 0 ;93DCD 0 ;94DCD 0 ;95DCD SVCHandler ;96DCD DebugMonitor ;97DCD 0 ;98DCD PendSVC ;99DCD SysTickHandler ;100DCD WWDG_IRQHandler ;101DCD PVD_IRQHandler ;102DCD TAMPER_IRQH
16、andler ;103DCD RTC_IRQHandler ;104DCD FLASH_IRQHandler ;105DCD RCC_IRQHandler ;106DCD EXTI0_IRQHandler ;107DCD EXTI1_IRQHandler ;108DCD EXTI2_IRQHandler ;109DCD EXTI3_IRQHandler ;110DCD EXTI4_IRQHandler ;111DCD DMA1_Channel1_IRQHandler ;112DCD DMA1_C
17、hannel2_IRQHandler ;113DCD DMA1_Channel3_IRQHandler ;114DCD DMA1_Channel4_IRQHandler ;115DCD DMA1_Channel5_IRQHandler ;116DCD DMA1_Channel6_IRQHandler ;117DCD DMA1_Channel7_IRQHandler ;118DCD ADC1_2_IRQHandler ;119DCD USB_HP_CAN_TX_IRQHandler ;120DCD USB_LP_CA
18、N_RX0_IRQHandler ;121DCD CAN_RX1_IRQHandler ;122DCD CAN_SCE_IRQHandler ;123DCD EXTI9_5_IRQHandler ;124DCD TIM1_BRK_IRQHandler ;125DCD TIM1_UP_IRQHandler ;126DCD TIM1_TRG_COM_IRQHandler ;127DCD TIM1_CC_IRQHandler ;128DCD TIM2_IRQHandler ;129DCD TIM3_IRQHan
19、dler ;130DCD TIM4_IRQHandler ;131DCD I2C1_EV_IRQHandler;132DCD I2C1_ER_IRQHandler;133DCD I2C2_EV_IRQHandler;134DCD I2C2_ER_IRQHandler;135DCD SPI1_IRQHandler ;136DCD SPI2_IRQHandler ;137DCD USART1_IRQHandler ;138DCD USART2_IRQHandler ;139DCD USART3_IRQHandler ;140DC
20、D EXTI15_10_IRQHandler ;141DCD RTCAlarm_IRQHandler ;142DCD USBWakeUp_IRQHandler ;143DCD TIM8_BRK_IRQHandler ;144DCD TIM8_UP_IRQHandler ;145DCD TIM8_TRG_COM_IRQHandler ;146DCD TIM8_CC_IRQHandler ;147DCD ADC3_IRQHandler ;148DCD FSMC_IRQHandler ;149DCD SDIO_
21、IRQHandler ;150DCD TIM5_IRQHandler ;151DCD SPI3_IRQHandler ;152DCD UART4_IRQHandler ;153DCD UART5_IRQHandler ;154DCD TIM6_IRQHandler ;155DCD TIM7_IRQHandler ;156DCD DMA2_Channel1_IRQHandler ;157DCD DMA2_Channel2_IRQHandler ;158DCD DMA2_Channel3_IRQHandler
22、 ;159DCD DMA2_Channel4_5_IRQHandler ;160AREA |.text|, CODE, READONLY ;161Reset_Handler PROC ;162EXPORT Reset_Handler ;163IF DATA_IN_ExtSRAM = 1 ;164LDR R0,= 0x00000114 ;165LDR R1,= 0x40021014 ;166STR R0,R1 ;167LDR R0,= 0x000001E0 ;168LDR R1,= 0x40021
23、018 ;169STR R0,R1 ;170LDR R0,= 0x44BB44BB ;171LDR R1,= 0x40011400 ;172STR R0,R1 ;173LDR R0,= 0xBBBBBBBB ;174LDR R1,= 0x40011404 ;175STR R0,R1 ;176LDR R0,= 0xB44444BB ;177LDR R1,= 0x40011800 ;178STR R0,R1 ;179LDR R0,= 0xBBBBBBBB ;180LDR R1,=
24、 0x40011804 ;181STR R0,R1 ;182LDR R0,= 0x44BBBBBB ;183LDR R1,= 0x40011C00 ;184STR R0,R1 ;185LDR R0,= 0xBBBB4444 ;186LDR R1,= 0x40011C04 ;187STR R0,R1 ;188LDR R0,= 0x44BBBBBB ;189LDR R1,= 0x40012000 ;190STR R0,R1 ;191LDR R0,= 0x44444B44 ;192
25、LDR R1,= 0x40012004 ;193STR R0,R1 ;194LDR R0,= 0x00001011 ;195LDR R1,= 0xA0000010 ;196STR R0,R1 ;197LDR R0,= 0x00000200 ;198LDR R1,= 0xA0000014 ;199STR R0,R1 ;200ENDIF ;201IMPORT _main ;202LDR R0, =_main ;203BX R0 ;204ENDP ;205ALIGN
26、60;;206IF :DEF:_MICROLIB ;207EXPORT _initial_sp ;208EXPORT _heap_base ;209EXPORT _heap_limit ;210ELSE ;211IMPORT _use_two_region_memory ;212EXPORT _user_initial_stackheap ;213_user_initial_stackheap ;214LDR R0, = Heap_Mem ;215LDR R1, = (Stack_Mem + Stack_
27、Size) ;216LDR R2, = (Heap_Mem + Heap_Size) ;217LDR R3, = Stack_Mem ;218BX LR ;219ALIGN ;220ENDIF ;221END ;222ENDIF ;223END ;224如程序清單一,STM32的啟動(dòng)代碼一共224行,使用了匯編語(yǔ)言編寫(xiě),這其中的主要原因下文將會(huì)給出交代?,F(xiàn)在從第一行開(kāi)始分析:? 第1行:定義是否使用外部SRAM,為1則使用,為0則表示不使用。此語(yǔ)行若用C語(yǔ)言表達(dá)則等價(jià)于:#define DATA
28、_IN_ExtSRAM 0? 第2行:定義??臻g大小為0x00000400個(gè)字節(jié),即1Kbyte。此語(yǔ)行亦等價(jià)于:#define Stack_Size 0x00000400? 第3行:偽指令A(yù)REA,表示? 第4行:開(kāi)辟一段大小為Stack_Size的內(nèi)存空間作為棧。? 第5行:標(biāo)號(hào)_initial_sp,表示??臻g頂?shù)刂贰? 第6行:定義堆空間大小為0x00000400個(gè)字節(jié),也為1Kbyte。? 第7行:偽指令A(yù)REA,表示? 第8行:標(biāo)號(hào)_heap_base,表示堆空間起始地址。? 第9行:開(kāi)辟一段大小為He
29、ap_Size的內(nèi)存空間作為堆。? 第10行:標(biāo)號(hào)_heap_limit,表示堆空間結(jié)束地址。? 第11行:告訴編譯器使用THUMB指令集。? 第12行:告訴編譯器以8字節(jié)對(duì)齊。? 第1381行:IMPORT指令,指示后續(xù)符號(hào)是在外部文件定義的(類似C語(yǔ)言中的全局變量聲明),而下文可能會(huì)使用到這些符號(hào)。? 第82行:定義只讀數(shù)據(jù)段,實(shí)際上是在CODE區(qū)(假設(shè)STM32從FLASH啟動(dòng),則此中斷向量表起始地址即為0x8000000)? 第83行:將標(biāo)號(hào)_Vectors聲明為全局標(biāo)號(hào),這樣外部文件就可以使用這個(gè)標(biāo)號(hào)。? 第84行
30、:標(biāo)號(hào)_Vectors,表示中斷向量表入口地址。? 第85160行:建立中斷向量表。? 第161行:? 第162行:復(fù)位中斷服務(wù)程序,PROCENDP結(jié)構(gòu)表示程序的開(kāi)始和結(jié)束。? 第163行:聲明復(fù)位中斷向量Reset_Handler為全局屬性,這樣外部文件就可以調(diào)用此復(fù)位中斷服務(wù)。? 第164行:IFENDIF為預(yù)編譯結(jié)構(gòu),判斷是否使用外部SRAM,在第1行中已定義為“不使用”。? 第165201行:此部分代碼的作用是設(shè)置FSMC總線以支持SRAM,因不使用外部SRAM因此此部分代碼不會(huì)被編譯。? 第202行:聲明_mai
31、n標(biāo)號(hào)。? 第203204行:跳轉(zhuǎn)_main地址執(zhí)行。? 第207行:IFELSEENDIF結(jié)構(gòu),判斷是否使用DEF:_MICROLIB(此處為不使用)。? 第208210行:若使用DEF:_MICROLIB,則將_initial_sp,_heap_base,_heap_limit亦即棧頂?shù)刂?,堆始末地址賦予全局屬性,使外部程序可以使用。? 第212行:定義全局標(biāo)號(hào)_use_two_region_memory。? 第213行:聲明全局標(biāo)號(hào)_user_initial_stackheap,這樣外程序也可調(diào)用此標(biāo)號(hào)。? 第214行:標(biāo)號(hào)_u
32、ser_initial_stackheap,表示用戶堆棧初始化程序入口。? 第215218行:分別保存棧頂指針和棧大小,堆始地址和堆大小至R0,R1,R2,R3寄存器。? 第224行:程序完畢。以上便是STM32的啟動(dòng)代碼的完整解析,接下來(lái)對(duì)幾個(gè)小地方做解釋:1、 AREA指令:偽指令,用于定義代碼段或數(shù)據(jù)段,后跟屬性標(biāo)號(hào)。其中比較重要的一個(gè)標(biāo)號(hào)為“READONLY”或者“READWRITE”,其中“READONLY”表示該段為只讀屬性,聯(lián)系到STM32的內(nèi)部存儲(chǔ)介質(zhì),可知具有只讀屬性的段保存于FLASH區(qū),即0x8000000地址后。而“READONLY”表示該段為“可讀寫(xiě)”屬性,可知“可讀寫(xiě)”段保存于SRAM區(qū),即0x2000000地址后。由此可以從第
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度綠色倉(cāng)儲(chǔ)倉(cāng)房買賣合同范本環(huán)保解讀3篇
- 2025年度旅游單項(xiàng)服務(wù)保障合同4篇
- 2024-2025學(xué)年高中英語(yǔ)Unit4Breakingboundaries突破語(yǔ)法大沖關(guān)教師用書(shū)外研版選擇性必修第二冊(cè)
- 2024-2025學(xué)年新教材高中歷史第八單元20世紀(jì)下半葉世界的新變化第18課冷戰(zhàn)與國(guó)際格局的演變課時(shí)作業(yè)含解析新人教版必修中外歷史綱要下
- 二零二五版工程招投標(biāo)與合同管理法律法規(guī)匯編及解讀3篇
- 2024版汽車維修工具套件租賃合同
- 2024版廣西事業(yè)單位聘用合同樣板
- 2025年屋頂雨水排水管及配套設(shè)施銷售與安裝服務(wù)合同2篇
- 二零二五年度教育合作辦班合同范本3篇
- 2024版汽車修理廠土地租賃合同
- 2023年上海英語(yǔ)高考卷及答案完整版
- 西北農(nóng)林科技大學(xué)高等數(shù)學(xué)期末考試試卷(含答案)
- 金紅葉紙業(yè)簡(jiǎn)介-2 -紙品及產(chǎn)品知識(shí)
- 《連鎖經(jīng)營(yíng)管理》課程教學(xué)大綱
- 《畢淑敏文集》電子書(shū)
- 頸椎JOA評(píng)分 表格
- 員工崗位能力評(píng)價(jià)標(biāo)準(zhǔn)
- 定量分析方法-課件
- 朱曦編著設(shè)計(jì)形態(tài)知識(shí)點(diǎn)
- 110kV變電站工程預(yù)算1
- 某系統(tǒng)安全安全保護(hù)設(shè)施設(shè)計(jì)實(shí)施方案
評(píng)論
0/150
提交評(píng)論