當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]當(dāng)前的嵌入式應(yīng)用程序開發(fā)過(guò)程里,C語(yǔ)言已成為了絕大部分場(chǎng)合的最佳選擇。如此一來(lái)main函數(shù)似乎成為了理所當(dāng)然的起點(diǎn)——因?yàn)镃程序往往從main函數(shù)開始執(zhí)行。但一個(gè)經(jīng)常會(huì)被

當(dāng)前的嵌入式應(yīng)用程序開發(fā)過(guò)程里,C語(yǔ)言已成為了絕大部分場(chǎng)合的最佳選擇。如此一來(lái)main函數(shù)似乎成為了理所當(dāng)然的起點(diǎn)——因?yàn)镃程序往往從main函數(shù)開始執(zhí)行。但一個(gè)經(jīng)常會(huì)被忽略的問(wèn)題是:微控制器(單片機(jī))上電后,是如何尋找到并執(zhí)行main函數(shù)的呢?很顯然微控制器無(wú)法從硬件上定位main函數(shù)的入口地址,因?yàn)槭褂肅語(yǔ)言作為開發(fā)語(yǔ)言后,變量/函數(shù)的地址便由編譯器在編譯時(shí)自行分配,這樣一來(lái)main函數(shù)的入口地址在微控制器的內(nèi)部存儲(chǔ)空間中不再是絕對(duì)不變的。相信讀者都可以回答這個(gè)問(wèn)題,答案也許大同小異,但肯定都有個(gè)關(guān)鍵詞,叫“啟動(dòng)文件”,用英文單詞來(lái)描述是“Bootloader”。

無(wú)論性能高下,結(jié)構(gòu)簡(jiǎn)繁,價(jià)格貴賤,每一種微控制器(處理器)都必須有啟動(dòng)文件,啟動(dòng)文件的作用便是負(fù)責(zé)執(zhí)行微控制器從“復(fù)位”到“開始執(zhí)行main函數(shù)”中間這段時(shí)間(稱為啟動(dòng)過(guò)程)所必須進(jìn)行的工作。最為常見(jiàn)的51,AVR或MSP430等微控制器當(dāng)然也有對(duì)應(yīng)啟動(dòng)文件,但開發(fā)環(huán)境往往自動(dòng)完整地提供了這個(gè)啟動(dòng)文件,不需要開發(fā)人員再行干預(yù)啟動(dòng)過(guò)程,只需要從main函數(shù)開始進(jìn)行應(yīng)用程序的設(shè)計(jì)即可。

關(guān)于“啟動(dòng)模式”

話題轉(zhuǎn)到STM32微控制器,無(wú)論是keil uvision4還是IAR EWARM開發(fā)環(huán)境,ST公司都提供了現(xiàn)成的直接可用的啟動(dòng)文件,程序開發(fā)人員可以直接引用啟動(dòng)文件后直接進(jìn)行C應(yīng)用程序的開發(fā)。這樣能大大減小開發(fā)人員從其它微控制器平臺(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ū),即起始地址為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)核則是固定了中斷向量表的位置而起始地址是可變化的。

細(xì)說(shuō)STM32的啟動(dòng)過(guò)程

下面就從ST的啟動(dòng)文件說(shuō)起,由于庫(kù)中的startup_stm32f10x_md.s與編譯環(huán)境有關(guān),所以針對(duì)的是庫(kù)中的

STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartupTrueSTUDIO路徑下的文件進(jìn)行分析。

system_stm32f10x.c

SystemInit():在“startup_stm32f10x_xx.s”文件中被調(diào)用,功能是設(shè)置系統(tǒng)時(shí)鐘(包括時(shí)鐘源,PLL系數(shù),AHB/APBx的預(yù)分頻系數(shù)還有 flash的設(shè)定),這個(gè)函數(shù)會(huì)在系統(tǒng)復(fù)位之后首先被執(zhí)行。文件中默認(rèn)的一些設(shè)置:允許HSE(外部時(shí)鐘),F(xiàn)LASH(允許預(yù)取緩沖區(qū),設(shè)置2個(gè)等待周 期),PLL系數(shù)為9,開啟PLL并選擇PLL輸出作為時(shí)鐘源(SYSCLK),后續(xù)設(shè)置SYSCLK = HCLK = APB2 = 72MHz,APB1 = HCLK/2 = 36MHz,HCLK即AHB的時(shí)鐘。

SystemCoreClockUpdate():在系統(tǒng)時(shí)鐘HCLK變化的時(shí)候調(diào)用,以更新一個(gè)全局變量SystemCoreClock,這個(gè)變量可以為應(yīng)用程序使用,必須保證正確。默認(rèn)不調(diào)用這個(gè)函數(shù),因?yàn)镾ystemCoreClock默認(rèn)被設(shè)置為設(shè)定的頻率了(72MHz)

另外,下面這種設(shè)置寄存器的方法值得借鑒,先用位名清除相應(yīng)的位,再進(jìn)行設(shè)置,例如:

#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!《 PLL entry clock source */

#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!《 HSE divider for PLL entry */

#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!《 PLLMUL[3:0] bits (PLL mulTIplicaTIon factor) */

#define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!《 HSE clock selected as PLL entry clock source */

#define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!《 PLL input clock*9 */

/* PLL configuraTIon: PLLCLK = HSE * 9 = 72 MHz */

RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));

RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

startup_stm32f10x_md.s:(針對(duì)F103RBT6為中容量的產(chǎn)品)

這個(gè)文件里面首先定義了復(fù)位中斷(復(fù)位入口矢量被硬件固定在地址0x0000_0004)的處理函數(shù):Reset_Handler,它的作用就是將保存于flash中的初始化數(shù)據(jù)復(fù)制到sram中,調(diào)用上面說(shuō)到的SystemInit來(lái)初始化時(shí)鐘,接著跳轉(zhuǎn)到main執(zhí)行。

接著定義了Default_Handler, 這個(gè)是作為其他所有中斷的默認(rèn)處理函數(shù),作用就是死循環(huán),所以你假如開啟了某個(gè)中斷,請(qǐng)按照這里面的中斷函數(shù)名給它寫中斷處理函數(shù),例如串口中斷處理函數(shù)名是 USART1_IRQHandler,你開了串口中斷,如果不重寫USART1_IRQHandler,就默認(rèn)執(zhí)行Default_Handler,死循環(huán)了。而如果你有重寫,那么中斷向量表中的處理函數(shù)的地址就會(huì)更新為你自己寫的那個(gè)函數(shù)的地址了。為什么會(huì)這樣呢?因?yàn)榇宋募哪┪灿昧祟愃七@樣的語(yǔ)句:

.weak USART1_IRQHandler

.thumb_set USART1_IRQHandler,Default_Handler

它給中斷處理函數(shù)提供了弱(weak)別名(Default_Handler),如果不重寫,中斷了默認(rèn)執(zhí)行Default_Handler,如果重寫了,因?yàn)槭侨鮿e名,所以會(huì)被你寫的同名函數(shù)覆蓋。

最后定義了一個(gè)中斷向量表的段(.secTIon .isr_vector,“a”,%progbits),這個(gè)表將會(huì)放置在0x0000 0000那里,第二個(gè)字(0x0000 0004)是復(fù)位向量,復(fù)位之后從這地址所指的函數(shù)執(zhí)行。

那么,如何保證.isr_vector這個(gè)段將放在flash的最開始(0x08000000)呢?這就需要鏈接腳本了,即我們用的那個(gè)stm32_flash.ld文件了,查看一下就知道了,里面先定義了堆棧的地址:

_estack

/* Highest address of the user mode stack */

_estack = 0x20005000; /* end of 20K RAM */

接著定義了堆和棧的大小:

/* Generate a link error if heap and stack don‘t fit into RAM */

_Min_Heap_Size = 0; /* required amount of heap */

_Min_Stack_Size = 0x100; /* required amount of stack */

接著聲明了各個(gè)內(nèi)存的區(qū)域(定義了幾個(gè)代表某個(gè)線性空間的名字,如下面的FLASH):

/* Specify the memory areas */

MEMORY

{

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K

MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K }

接著下面再介紹上面這三個(gè)名字里面都放了什么東西,首先是FLASH的:

/* Define output sections */

SECTIONS

{

/* The startup code goes first into FLASH */

.isr_vector :

{

。 = ALIGN(4); KEEP(*(.isr_vector)) /* Startup code */

。 = ALIGN(4); } 》FLASH

/* The program code and other data goes into FLASH */

.text :

{

。 = ALIGN(4); *(.text) /* .text sections (code) */

*(.text*) /* .text* sections (code) */

*(.rodata) /* .rodata sections (constants, strings, etc.) */

*(.rodata*) /* .rodata* sections (constants, strings, etc.) */

*(.glue_7) /* glue arm to thumb code */

*(.glue_7t) /* glue thumb to arm code */

KEEP (*(.init))

KEEP (*(.fini))

。 = ALIGN(4); _etext = 。; /* define a global symbols at end of code */

} 》FLASH

可以看到startup_stm32f10x_md.s中定義的這個(gè)段.isr_vector確實(shí)放在了最開頭的位置。

但是我們前面說(shuō)復(fù)位向量在0x0000 0004,現(xiàn)在其地址是在flash中,所以地址是0x0800 0004,這個(gè)怎么回事呢?原來(lái),stm32可以通過(guò)boot0、boot1引腳的配置將flash映射到0x0000 0000處。具體可參考stm32的用戶手冊(cè)2.4節(jié)。

從主閃存存儲(chǔ)器啟動(dòng)(BOOT0 = 0,BOOT1 = X):主閃存存儲(chǔ)器被映射到啟動(dòng)空間(0x0000 0000),但仍然能夠在它原有的地址(0x0800 0000)訪問(wèn)它,即閃存存儲(chǔ)器的內(nèi)容可以在兩個(gè)地址區(qū)域訪問(wèn),0x0000 0000或0x0800 0000。

至此,整個(gè)STM32的啟動(dòng)過(guò)程以及程序結(jié)構(gòu)都可以比較清晰了。

0次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉