在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

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

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

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

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

            啟動(dòng)代碼的最小系統(tǒng)是:異常向量表的初始化–存儲(chǔ)區(qū)分配–初始化堆棧–高級(jí)語(yǔ)言入口函數(shù)調(diào)用– main()函數(shù)。

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

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

            它對(duì)應(yīng)在startup.s里的源文件如下:

            運(yùn)行后,馬上跳轉(zhuǎn)到初始化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)行單步運(yùn)行的時(shí)候,下面我們可以看到,它自動(dòng)跳轉(zhuǎn)到main()函數(shù):

            ; Enter the C code

            IMPORT__main

            LDRR0, =__main

            BXR0

            IF:DEF:__MICROLIB

            EXPORT__heap_base

            EXPORT__heap_limit

            ELSE

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

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



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

            評(píng)論


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

            關(guān)閉