新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32啟動代碼概述

        STM32啟動代碼概述

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

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

        啟動代碼是用來初始化電路以及用來為高級語言寫的軟件作好運行前準備的一小段匯編語言,是任何處理器上電復位時的程序運行入口點。

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

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

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

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

        程序的啟動過程:

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

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

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

        ; 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

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

        ; Enter the C code

        IMPORT__main

        LDRR0, =__main

        BXR0

        IF:DEF:__MICROLIB

        EXPORT__heap_base

        EXPORT__heap_limit

        ELSE

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

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



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

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 静海县| 确山县| 民和| 乐亭县| 靖边县| 通海县| 柘荣县| 永兴县| 金华市| 泰兴市| 巴中市| 丹阳市| 宜良县| 高雄县| 金华市| 汤原县| 榆社县| 常熟市| 洮南市| 灵石县| 门头沟区| 开原市| 聂拉木县| 敖汉旗| 拜城县| 长岛县| 海晏县| 临清市| 卓尼县| 盐津县| 宣恩县| 阜康市| 乌海市| 包头市| 龙川县| 台东市| 玉树县| 宁城县| 玉林市| 宜川县| 化德县|