0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32啟動(dòng)文件簡(jiǎn)介、詳細(xì)步驟及代碼講解

CHANBAEK ? 來(lái)源:南山府嵌入式 ? 作者:南山府嵌入式 ? 2023-01-19 17:57 ? 次閱讀

01啟動(dòng)文件簡(jiǎn)介

startup_stm32f429_439xx.s是STM32的啟動(dòng)文件。

剛開始我一直認(rèn)為STM32程序開始執(zhí)行是從main函數(shù)開始。后來(lái)網(wǎng)上查查不是。原來(lái)在執(zhí)行main函數(shù)之前,需要先執(zhí)行一段匯編程序和完成C語(yǔ)言資源硬件的初始化工作。就是以下幾個(gè)功能:

1--初始化棧指針MSP=_initial_sp。

2--初始化復(fù)位程序計(jì)數(shù)寄存器值=Reset_Handler。

3--初始化異常/ 中斷向量表。

4--系統(tǒng)時(shí)鐘配置。

5--C庫(kù)函數(shù)_main初始化用戶堆棧的調(diào)用 。

02文件啟動(dòng)步驟

1-在啟動(dòng)的時(shí)候,先對(duì)堆棧的大小定義,并在代碼區(qū)的起始位置建立異常中斷向量表。然后在復(fù)位中斷中服務(wù)程序中跳轉(zhuǎn)執(zhí)行C標(biāo)準(zhǔn)庫(kù)main函數(shù),以上這些完成后,跳轉(zhuǎn)到主程序中的main函數(shù)執(zhí)行相關(guān)函數(shù)應(yīng)用。但是假如STM32F429單片機(jī)被設(shè)置成從內(nèi)部flash啟動(dòng)的,這時(shí)候,片內(nèi)Flash被映射到程序啟動(dòng)空間,異常/中斷向量表實(shí)際的開始地址為0x8000000(查看STM32F4參考手冊(cè)可得到),則棧頂?shù)刂反娣旁?x8000000處,復(fù)位中斷存放在0x8000004處,若STM32F4遇到復(fù)位信號(hào),則從0x8000004處取出復(fù)位中斷服務(wù)入口地址,繼而執(zhí)行中斷服務(wù)函數(shù),繞后跳轉(zhuǎn)到main函數(shù),最終進(jìn)入main函數(shù)。由此我們可以得下面這個(gè)圖:

在這里插入圖片描述

03啟動(dòng)代碼講解

01棧(Stack)

我們可以在.s這個(gè)文件中看到堆棧信息如圖:

Alt

根據(jù)上面的圖片我們可以知道。

在startup_stm32f429_439xx.s文件中,將棧的大小設(shè)為0x00000400(1KB)F429是0x30000(192KB),Stack_Mem為棧名,不初始化可讀可寫,8字節(jié)對(duì)齊。Stack_Size是棧的大小,__initial_sp表示結(jié)束地址(棧頂?shù)刂罚瑮J怯筛咦止?jié)向低字節(jié)生長(zhǎng)的)。

棧的主要作用是用于局部變量、函數(shù)調(diào)用、函數(shù)形參的開銷大小應(yīng)小于內(nèi)部RAM大小,考慮到局部變量的需求,防止棧溢出。

EQU:宏定義的偽指令,相當(dāng)于等于,類似與 C 中的 define;

AREA:告訴匯編器匯編一個(gè)新的代碼段或者數(shù)據(jù)段;

SPACE:用于分配一定大小的內(nèi)存空間,單位為字節(jié);這里的大小等于Stack_Size。

DCD:數(shù)據(jù)定義( Data Definition )偽指令,單位是字(4字節(jié));

偽指令(Pseudo instruction):用于告訴匯編器如何進(jìn)行匯編的指令,不生成可執(zhí)行代碼。

總結(jié)如下圖所示:

Dingtalk_20221206154648.jpg

02堆(Heap)

在.s54行中如下圖這些代碼:

在這里插入圖片描述

這些代碼中,堆的大小設(shè)為0x00000200(512B),其中Heap_ Mem是棧名,不初始化,可讀可寫,8(23)字節(jié)對(duì)齊。Heap_Size為堆的大小, heap_base為堆的起始地址,heap_limit為堆的結(jié)束地址,因?yàn)槎咽怯傻偷刂废蚋叩刂飞L(zhǎng)的。

堆的作用是用于malloc()函數(shù)申請(qǐng)的動(dòng)態(tài)內(nèi)存的分配。

04中斷向量表

在這里插入圖片描述

PRESERVE8:指定當(dāng)前文件的堆棧按照 8 字節(jié)對(duì)齊THUMB:表示后面指令為 THUMB 指令。THUBM 是 ARM 以前的指令集, 16bit,現(xiàn)在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超級(jí)!

Dingtalk_20221206154648.jpg

EXPORT:聲明一個(gè)標(biāo)號(hào)具有全局屬性,可被外部的文件使用。如果是 IAR 編譯器,則使用的是 GLOBAL 這個(gè)指令。

在這里插入圖片描述

——Vectors是異常/中斷向量表的起始位置,_Vectors_End是中斷向量表的結(jié)束位置,vectors__Size中斷向量表的大小。

TM32F42XX/STM32F43XX部分中斷向量表

在中斷向量表中的每一個(gè)位置存儲(chǔ)都是一個(gè)4字節(jié)服務(wù)程序入口地址,如果有中斷請(qǐng)求并且MCU進(jìn)行了請(qǐng)求的響應(yīng),那么MCU就會(huì)找到向量表中找到對(duì)應(yīng)的中斷位置,找到中斷復(fù)位程序入口地址到程序計(jì)數(shù)寄存器,進(jìn)而執(zhí)行中斷。

在這里插入圖片描述

在這里插入圖片描述

具體的詳細(xì)中斷向量表請(qǐng)參看數(shù)據(jù)手冊(cè)以及啟動(dòng)文件。

05復(fù)位中斷服務(wù)程序

在這里插入圖片描述

這句話的意思是定義一個(gè)名為.text代碼段,可讀

在這里插入圖片描述

復(fù)位中斷服務(wù)程序是系統(tǒng)上電后第一個(gè)執(zhí)行的程序,調(diào)用Systemlnit函數(shù)初始化系統(tǒng)時(shí)鐘,然后調(diào)用C庫(kù)函數(shù)mian,最終調(diào)用 main 函數(shù)進(jìn)入C程序的世界。

LDR:從存儲(chǔ)器加載字到一個(gè)寄存器。

BL:跳轉(zhuǎn)到由寄存器/標(biāo)號(hào)給出的地址,并把跳轉(zhuǎn)前的下條指令地址保存到鏈接寄存器。

BLX:跳轉(zhuǎn)到由寄存器給出的地址,并根據(jù)寄存器的LSE確定處理器的狀態(tài),還要把跳轉(zhuǎn)前的下條指令地址保存到鏈接寄存器。

BX:跳轉(zhuǎn)到由寄存器/標(biāo)號(hào)給出的地址,不用返回。

WEAK:表示弱定義,如果外部文件優(yōu)先定義了該標(biāo)號(hào),則首先引用該標(biāo)號(hào),可以在C語(yǔ)言中重新定義中斷服務(wù)程序;如果在啟動(dòng)文件之外沒(méi)有重新定義中斷服務(wù)程序,則在對(duì)應(yīng)的異常/中斷向量表位置處存儲(chǔ)的是匯編文件定義的中斷服務(wù)程序入口地址。如果在啟動(dòng)文件外,在另外一個(gè)C文件中重新定義了中斷服務(wù)程序,則在對(duì)應(yīng)的異常/中斷向量表位置處存儲(chǔ)的是C文件中的中斷服務(wù)程序入口地址。需要注意的是,啟動(dòng)文件中的中斷服務(wù)程序的名稱和C文件中重新定義的中斷服務(wù)程序名稱必須保持一致。

IMPORT:表示該標(biāo)號(hào)來(lái)自外部文件,跟C語(yǔ)言中的關(guān)鍵字EXTERN類似。這里表示Systemlnit 和main 這兩個(gè)函數(shù)均來(lái)自外部的文件。

Systemlnit是一個(gè)標(biāo)準(zhǔn)的庫(kù)函數(shù),在system_stm32f4xx.c這個(gè)庫(kù)文件中定義,主要作用是配置系統(tǒng)時(shí)鐘,在調(diào)用這個(gè)函數(shù)之后,STM32F429的系統(tǒng)時(shí)鐘被配置為180MHz。

main是一個(gè)標(biāo)準(zhǔn)的C庫(kù)函數(shù),主要作用是初始化用戶堆棧,最終調(diào)用main函數(shù)進(jìn)入C程序的世界。在C應(yīng)用程序中,必須有一個(gè)main函數(shù)。需要注意的是,_main不是用戶C程序的main 函數(shù)。

異常和中斷服務(wù)程序

Dingtalk_20221206154648.jpg

Dingtalk_20221206154648.jpg

07用戶堆棧初始化

Dingtalk_20221206154648.jpg

判斷是否定義了__MICROLIB,如果定義了則賦予標(biāo)號(hào)__initial_sp(棧頂?shù)刂罚?、__heap_base(堆起始地址)、__heap_limit(堆結(jié)束地址)全局屬性,可供外部文件調(diào)用。如果沒(méi)有定義(實(shí)際的情況就是我們沒(méi)定義__MICROLIB),則使用默認(rèn)的C庫(kù)函數(shù),然后初始化用戶堆棧大小,這部分由C庫(kù)函數(shù)__main來(lái)完成,當(dāng)初始化完堆棧之后,就調(diào)用main函數(shù)去到C程序的世界。

IF、ELSE、ENDIF:匯編的條件分支語(yǔ)句,跟C語(yǔ)言的if、else類似。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354299
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135864
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4284

    瀏覽量

    62325
  • 啟動(dòng)文件
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    2199
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳解STM32啟動(dòng)文件

    本文對(duì)STM32啟動(dòng)文件startup_stm32f10x_hd.s的代碼進(jìn)行講解,此
    發(fā)表于 06-10 17:19 ?965次閱讀
    詳解<b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>

    STM32Cube用法以及自動(dòng)生成的代碼講解

    文章目錄前言操作步驟打開軟件新建工程配置時(shí)鐘配置GPIO生成源代碼編寫代碼實(shí)驗(yàn)驗(yàn)證源碼講解delay相關(guān)while循環(huán)自動(dòng)生成前言本文主要介紹STM
    發(fā)表于 08-10 06:21

    學(xué)習(xí)STM32啟動(dòng)代碼的方法步驟

    學(xué)習(xí)STM32啟動(dòng)代碼的方法步驟
    發(fā)表于 11-29 06:34

    STM32單片機(jī)的啟動(dòng)文件簡(jiǎn)介

    啟動(dòng)文件簡(jiǎn)介啟動(dòng)文件由匯編編寫,是系統(tǒng)上電復(fù)位后第一個(gè)執(zhí)行的程序。主要做了以下工作:1、初始化堆棧指針SP=_initial_sp2、初始化
    發(fā)表于 12-06 08:09

    STM32啟動(dòng)文件步驟啟動(dòng)代碼講解

    。5--C庫(kù)函數(shù)_main初始化用戶堆棧的調(diào)用。2、文件啟動(dòng)步驟啟動(dòng)代碼講解1--棧(Stack
    發(fā)表于 02-21 07:27

    STM32啟動(dòng)文件資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32啟動(dòng)文件資料免費(fèi)下載。
    發(fā)表于 06-22 08:00 ?38次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>資料免費(fèi)下載

    STM32啟動(dòng)文件內(nèi)容詳解

    的參考資料和分析參考《STM32F10X-中文參考手冊(cè)》中的第九章-中斷和事件:表 55 其他 STM32F10xxx 產(chǎn)品(小容量、中容量和大容量)的向量表; MDK 中的幫助手冊(cè)—ARM Development Tools:用來(lái)查詢ARM 的匯編指令和編譯器相關(guān)的指令
    發(fā)表于 11-30 13:21 ?8次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>內(nèi)容詳解

    STM32啟動(dòng)過(guò)程--啟動(dòng)文件--分析

    、中斷向量安排等內(nèi)容,是非常值得玩味的?! ?b class='flag-5'>STM32作為一款高端Cortex-M3系列單片機(jī),有必要了解它的啟動(dòng)文件。打好基礎(chǔ),為以后優(yōu)化程序,寫出高質(zhì)量的代碼最準(zhǔn)備。  本文以一個(gè)
    發(fā)表于 11-30 13:21 ?4次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)</b>過(guò)程--<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>--分析

    stm32啟動(dòng)文件分析

    stm32啟動(dòng)文件分析
    發(fā)表于 12-09 13:06 ?17次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>分析

    STM32啟動(dòng)文件分析

    STM32啟動(dòng)文件分析前言啟動(dòng)文件解析首先進(jìn)行堆和棧的初始化接下來(lái)初始化中斷向量表復(fù)位中斷函數(shù)其余中斷函數(shù)
    發(fā)表于 12-22 19:05 ?9次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>分析

    3-STM32啟動(dòng)文件詳解

    。5--C庫(kù)函數(shù)_main初始化用戶堆棧的調(diào)用。2、文件啟動(dòng)步驟啟動(dòng)代碼講解1--棧(Stack
    發(fā)表于 12-27 18:41 ?14次下載
    3-<b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>詳解

    關(guān)于STM32啟動(dòng)文件startup_stm32f10x_hd.s的代碼

    本文對(duì)STM32啟動(dòng)文件startup_stm32f10x_hd.s的代碼進(jìn)行講解,此
    的頭像 發(fā)表于 07-06 17:26 ?4099次閱讀

    STM32啟動(dòng)文件分享

    STM32啟動(dòng)文件分享
    發(fā)表于 09-28 11:20 ?9次下載

    STM32啟動(dòng)文件startup_stm32f10x_hd.s的代碼講解

    本文對(duì)STM32啟動(dòng)文件startup_stm32f10x_hd.s的代碼進(jìn)行講解,此
    的頭像 發(fā)表于 06-22 10:31 ?4449次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>文件</b>startup_<b class='flag-5'>stm32</b>f10x_hd.s的<b class='flag-5'>代碼</b><b class='flag-5'>講解</b>

    STM32啟動(dòng)文件

    STM32啟動(dòng)文件
    發(fā)表于 08-21 10:27 ?2次下載