當(dāng)前位置:首頁 > 嵌入式 > 嵌入式分享
[導(dǎo)讀]STM32系列微控制器廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā),其啟動過程對于理解系統(tǒng)如何從上電復(fù)位到執(zhí)行用戶代碼至關(guān)重要。本文將詳細(xì)介紹如何使用C++編寫STM32的啟動腳本,并以STM32F103為例進行說明。


STM32系列微控制器廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā),其啟動過程對于理解系統(tǒng)如何從上電復(fù)位到執(zhí)行用戶代碼至關(guān)重要。本文將詳細(xì)介紹如何使用C++編寫STM32的啟動腳本,并以STM32F103為例進行說明。


一、啟動過程概述

STM32微控制器的啟動過程始于復(fù)位操作。當(dāng)處理器復(fù)位后,它會從存儲器的特定位置讀取啟動向量,這些向量決定了系統(tǒng)的初始堆棧指針和復(fù)位處理程序的地址。對于Cortex-M3和Cortex-M4內(nèi)核的STM32微控制器,這一機制尤其關(guān)鍵。


復(fù)位向量表:復(fù)位后,Cortex-M處理器從存儲器地址0x00000000開始讀取前兩個32位字。第一個字是主堆棧指針(MSP)的初始值,第二個字是復(fù)位向量,即復(fù)位處理程序的起始地址。

堆棧指針設(shè)置:堆棧指針通常指向SRAM的末尾,因為Cortex-M3和Cortex-M4的堆棧操作是基于完全降序堆棧(即堆棧指針在存儲之前遞減)。

二、啟動腳本的C++實現(xiàn)

以下是如何用C++編寫STM32F103的啟動腳本的詳細(xì)步驟和代碼示例。


定義SRAM和堆棧地址

cpp

#define SRAM_START 0x20000000U

#define SRAM_SIZE (20U * 1024U)  // 20KB

#define SRAM_END ((SRAM_START) + (SRAM_SIZE))

#define STACK_START SRAM_END

初始化中斷向量表

啟動代碼的第一個任務(wù)是在地址0x00000000處初始化中斷向量表。這個表包含了各種中斷處理程序的地址。


cpp

uint32_t vectors[] __attribute__((section(".isr_vector"))) = {

   STACK_START,

   (uint32_t)Reset_Handler,

   (uint32_t)NMI_Handler,

   (uint32_t)HardFault_Handler,

   (uint32_t)MemManage_Handler,

   (uint32_t)BusFault_Handler,

   (uint32_t)UsageFault_Handler,

   0,  // 保留

   // 其他中斷處理程序地址...

};

這段代碼指示編譯器將vectors數(shù)組放置在.isr_vector節(jié)中,并通過鏈接器腳本將其放置在Flash存儲器的開始處。


鏈接器腳本

鏈接器腳本用于定義各個內(nèi)存區(qū)域的布局。以下是一個簡單的鏈接器腳本示例,用于STM32F103。


ld

ENTRY(Reset_Handler)

MEMORY {

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

   SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 20K

}

SECTIONS {

   .isr_vector : {

       *(.isr_vector)

       . = ALIGN(4);

   } > FLASH

   .text : {

       *(.text)

       *(.text.*)

       *(.init)

       *(.fini)

       // 其他代碼段...

   } > FLASH

   // 其他內(nèi)存段...

}

復(fù)位處理程序

復(fù)位處理程序(Reset_Handler)是系統(tǒng)啟動后首先執(zhí)行的函數(shù)。它負(fù)責(zé)初始化堆棧、復(fù)制.data段數(shù)據(jù)到SRAM、清零.bss段,并最終調(diào)用main函數(shù)。


cpp

extern "C" void Reset_Handler(void) {

   // 將.data段從Flash復(fù)制到SRAM

   uint8_t *pSramData = (uint8_t *)&_sdata;

   uint8_t *pFlashData = (uint8_t *)&_la_data;

   uint32_t data_size = (uint32_t)&_edata - (uint32_t)&_sdata;

   for (uint32_t i = 0; i < data_size; i++) {

       *pSramData++ = *pFlashData++;

   }


   // 在SRAM中將.bss段初始化為零

   uint32_t bss_size = (uint32_t)&_ebss - (uint32_t)&_sbss;

   uint8_t *pBssData = (uint8_t *)&_sbss;

   for (uint32_t i = 0; i < bss_size; i++) {

       *pBssData++ = 0;

   }


   // 調(diào)用main函數(shù)

   main();

}

主函數(shù)

主函數(shù)是用戶程序的入口點。在這里,你可以初始化外設(shè)、配置GPIO、啟動任務(wù)等。


cpp

int main(void) {

   // 初始化GPIO

   GPIO::enable_PortC();

   GPIO::setMode(GPIOC, GPIO::PIN_13, GPIO::OUTPUT_2MHZ);

   GPIO::setConfig(GPIOC, GPIO::PIN_13, GPIO::OUTPUT_PUSH_PULL);


   // 在無限循環(huán)中閃爍LED

   while (1) {

       GPIO::toggle(GPIOC, GPIO::PIN_13);

       ms_delay(1000U);

   }

}

三、總結(jié)

通過本文的介紹,我們詳細(xì)了解了如何使用C++編寫STM32F103的啟動腳本。這個過程包括定義SRAM和堆棧地址、初始化中斷向量表、編寫鏈接器腳本、實現(xiàn)復(fù)位處理程序以及編寫主函數(shù)。希望這些內(nèi)容能幫助你更好地理解STM32的啟動過程,并為你的嵌入式系統(tǒng)開發(fā)提供有價值的參考。

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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