STM32再學(xué)習――啟動(dòng)流程分析
我們寫(xiě)嵌入式程序,基本上采用C語(yǔ)言來(lái)編寫(xiě),以main( )作為程序的入口。但實(shí)際上,mian()并不是最先要執行的,在這之前需要做一些基本的工作,如堆、棧的定義;main函數的復位連接等,這些工作就需要一個(gè)專(zhuān)門(mén)的啟動(dòng)程序來(lái)完成,由于需要做的工作內容不多,并且需要更直接的管理內存,一般采用匯編編寫(xiě)。
本文引用地址:http://dyxdggzs.com/article/201610/307478.htm無(wú)論是STM32、ARM系列的單片機,還是簡(jiǎn)單的如51,PIC等,都以為上述原因,需要啟動(dòng)程序,只不過(guò)51,PIC等單片機的啟動(dòng)程序已經(jīng)在相應的IDE編譯、鏈接的時(shí)候隱含的編譯了,故在寫(xiě)單片機程序的時(shí)候無(wú)需考慮。而STM32的啟動(dòng)有相應的啟動(dòng)文件,本文將采用KEIL MDK自帶的啟動(dòng)文件STM32F10x.s進(jìn)行分析。
1 啟動(dòng)模式的選擇
STM32芯片自帶的啟動(dòng)方式有3種如下表
STM32的啟動(dòng)選擇,通過(guò)設置BOOT1、BOOT0的引腳的高低電平即可選擇。其中主閃存啟動(dòng)是將程序下載到內置的Flash進(jìn)行啟動(dòng)(該flash可運行程序),該程序可以掉電保存,下次開(kāi)機可自動(dòng)啟動(dòng);系統存儲器啟動(dòng)是將程序寫(xiě)入到一快特定的區域,一般由廠(chǎng)家直接寫(xiě)入,不能被隨意更改或擦除。內置SRAM啟動(dòng),由于SRAM掉電丟失,不能保存程序,一般只用于程序的調試。
就程序的啟動(dòng)而言,采用以上3種方式啟動(dòng),但對于一個(gè)嵌入式系統的程序來(lái)說(shuō),如果程序執行文件很大,而STM32內置的存儲空間有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存儲在flash中,程序執行在SDRAM中,既節約了成本有提高了運行效率。如果采用外置的Flash+SDRAM的方式,就需要一個(gè)更加復雜的啟動(dòng)文件(bootloader),需要考慮flash的COPY,Flash的驅動(dòng),內存的管理,通信機制等,本文暫不涉及此內容,以后有機會(huì )專(zhuān)門(mén)講述。
2 啟動(dòng)文件STM32F10x.s分析
關(guān)于STM32F10x.s的啟動(dòng)文件,主要做了3個(gè)工作:分配和初始化堆、棧;定義復位向量并初始化;中斷向量表及其相應的異常處理程序。
2.1 定義堆、棧及其初始化
堆和棧是能夠運行C語(yǔ)言的前提,如以下程序:
定義棧:
Stack_Size EQU 0x00000200
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
定義堆:
Heap_Size EQU 0x00000000
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
初始化堆、棧:
_user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
2.2 定義復位向量
Boot引腳的設置不同,復位時(shí),起始地址的位置不同,SRAM的起始地址為0x2000000, flash的起始地址為0x8000000。Cortex-M3內核規定,起始地址必須存放堆定指針,而第二個(gè)地址必須存放復位中斷入口向量。在系統復位時(shí),內核會(huì )自動(dòng)從其實(shí)地址的下一個(gè)地址(即32位)空間取出復位中斷入口向量,然后跳轉到復位中斷服務(wù)程序,該服務(wù)程序就會(huì )跳轉到main()執行程序。
中斷向量表(部分向量):
__Vectors
DCD __initial_sp ; Top of Stack // 初始化堆跳轉
DCD Reset_Handler ; Reset Handler // 復位中斷向量跳轉
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
復位中斷服務(wù)程序
; Reset Handler // 該程序會(huì )跳轉到main()
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP
3 其他中斷向量及服務(wù)子程序
在啟動(dòng)文件中,只定義了中斷向量,其相應的服務(wù)子程序跳轉到空操作。為以后擴展中斷服務(wù)程序做了準備。
在以上這些都勝利跑完之后,我們的微處理器(MCU)就開(kāi)始main函數之旅……
- STM32單片機中文官網(wǎng)
- STM32單片機官方開(kāi)發(fā)工具
- STM32單片機參考設計
評論