<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32啟動(dòng)代碼概述

STM32啟動(dòng)代碼概述

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
一般嵌入式開(kāi)發(fā)流程就是先建立一個(gè)工程,再編寫(xiě)源文件,然后進(jìn)行編譯,把所有的*.s文件和*.c文件編譯成一個(gè)*.o文件,再對目標文件進(jìn)行鏈接和定位,編譯成功后會(huì )生成一個(gè)*.hex文件和調試文件,接下來(lái)要進(jìn)行調試,如果成功的話(huà),就可以將它固化到flash里面去。

本文引用地址:http://dyxdggzs.com/article/201611/322964.htm

啟動(dòng)代碼是用來(lái)初始化電路以及用來(lái)為高級語(yǔ)言寫(xiě)的軟件作好運行前準備的一小段匯編語(yǔ)言,是任何處理器上電復位時(shí)的程序運行入口點(diǎn)。

比如,剛上電的過(guò)程中,PC機會(huì )對系統的一個(gè)運行頻率進(jìn)行鎖定在一個(gè)固定的值,這個(gè)設計頻率的過(guò)程就是在匯編源代碼中進(jìn)行的,也就是在啟動(dòng)代碼中進(jìn)行的。與此同時(shí),設置完后,程序開(kāi)始運行,注意,程序是在內存中運行的。這個(gè)時(shí)候,就需要把一些源文件從flash里面copy到內存中,又要對它們進(jìn)行初始化讀寫(xiě),這又有頻率的設置。這些都是初始化。

初始化完成后,我們又要設置一些堆棧,要跳到C語(yǔ)言的main函數里面運行。這就需要堆棧。對普通的ARM CPU有這樣一個(gè)要求:在絕對地址為零的地方要放置一個(gè)異常向量表,但并不是所有的ARM CPU都留有這個(gè)一個(gè)空間,這就需要用到映射的功能。我們可以將其它地方的一些空間映射到絕對地址里面。當發(fā)生異常時(shí),ARM核來(lái)讀取異常中斷表的時(shí)候,它會(huì )使用映射之后的那個(gè)表,這個(gè)就可以接著(zhù)往下執行,否則在絕對地址零的地方找不到任何信息,程序就會(huì )死掉。這些運行的環(huán)境全部建立好后,程序就會(huì )跳轉到我們的main函數里面。

總之,啟動(dòng)代碼,就是對最小系統的初始化。包括晶振,CPU頻率等。

啟動(dòng)代碼的最小系統是:異常向量表的初始化–存儲區分配–初始化堆棧–高級語(yǔ)言入口函數調用– main()函數。

程序的啟動(dòng)過(guò)程:

以下面這個(gè)例子為例,編譯完后,DEBUG后,我們可以看到,光標指向絕對地址為零的地方,這里存放的就是一個(gè)異常向量表。

它對應在startup.s里的源文件如下:

運行后,馬上跳轉到初始化CPU的頻率。即初始化鎖相環(huán),將其鎖在一個(gè)固定的頻率。具體代碼如下:

; Setup PLL

IFPLL_SETUP <> 0

LDRR0, =PLL_BASE

MOVR1, #0xAA

MOVR2, #0x55

;Configure and Enable PLL

MOVR3, #PLLCFG_Val

STRR3, [R0, #PLLCFG_OFS]

MOVR3, #PLLCON_PLLE

STRR3, [R0, #PLLCON_OFS]

STRR1, [R0, #PLLFEED_OFS]

STRR2, [R0, #PLLFEED_OFS]

;Wait until PLL Locked

PLL_LoopLDRR3, [R0, #PLLSTAT_OFS]

ANDSR3, R3, #PLLSTAT_PLOCK

BEQPLL_Loop

;Switch to PLL Clock

MOVR3, #(PLLCON_PLLE:OR:PLLCON_PLLC)

STRR3, [R0, #PLLCON_OFS]

STRR1, [R0, #PLLFEED_OFS]

STRR2, [R0, #PLLFEED_OFS]

ENDIF; PLL_SETUP

然后再初始化每一種模式的堆棧,再進(jìn)行單步運行的時(shí)候,下面我們可以看到,它自動(dòng)跳轉到main()函數:

; Enter the C code

IMPORT__main

LDRR0, =__main

BXR0

IF:DEF:__MICROLIB

EXPORT__heap_base

EXPORT__heap_limit

ELSE

這個(gè)時(shí)候,程序會(huì )運行各種scatterload函數,將我們的堆棧、全局變量等內容拷貝到內存中去??截愅旰?,就正式跳轉到我們的main()函數中來(lái)執行了。

這就是啟動(dòng)代碼執行的全過(guò)程,呵呵,平時(shí)我們看到以為只是執行main()函數就行了,是不是沒(méi)有想到在執行 main() 函數后還有這么多學(xué)問(wèn)呢?



關(guān)鍵詞: stm32啟動(dòng)代

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>