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)過(guò)程如何分析

汽車電子技術(shù) ? 來(lái)源:嵌入式之入坑筆記 ? 作者: 嵌入式入坑筆記 ? 2023-02-10 10:48 ? 次閱讀

本文分析STM32單片機(jī)從上電到運(yùn)行的過(guò)程,目的在于了解STM32單片機(jī)從啟動(dòng)到運(yùn)行的整個(gè)過(guò)程。

一般我們?cè)谑褂肧TM32單片機(jī)的時(shí)候,都是使用官方提供的驅(qū)動(dòng)文件,移植到自己即將要使用的工程中,移植完成之后再編寫自己的邏輯代碼,放到main( )函數(shù)中,就可以完美的運(yùn)行起來(lái)了。相信很多的人都沒有去關(guān)注過(guò)STM32從啟動(dòng)到運(yùn)行這個(gè)過(guò)程都發(fā)生了什么,現(xiàn)在就簡(jiǎn)單分析一些這個(gè)過(guò)程。

本文以STM32F103為例進(jìn)行分析。在官方給我們提供的啟動(dòng)文件中,將整個(gè)單片機(jī)的啟動(dòng)過(guò)程要做的事情都已經(jīng)幫我們做好了,以至于我們?cè)谑褂眠@款單片機(jī)的時(shí)候,幾乎可以不會(huì)吹灰之力就可以運(yùn)行起來(lái)。STM32F103的啟動(dòng)文件形如:

pYYBAGPlr7WAHISAAAAWykW-AdI267.png

根據(jù)不同的芯片容量,都有相對(duì)應(yīng)的啟動(dòng)文件可供選擇,實(shí)際使用根據(jù)芯片容量選擇合適的啟動(dòng)文件即可。

啟動(dòng)文件的主要作用有:

1)設(shè)置棧

2)初始化 SP 指針

3)設(shè)置堆

4)復(fù)位中斷服務(wù)函數(shù)

5)調(diào)用 SystemInit()函數(shù)來(lái)完成初始化工作

6)調(diào)用__main,該函數(shù)內(nèi)部會(huì)調(diào)用 main()函數(shù)

1、設(shè)置棧

從啟動(dòng)文件中可以看到:

poYBAGPlr8OAFVOrAAFaSyci8hI412.png

上述代碼中: 1)35行,將棧的大小設(shè)為0x00000400(即1024 = 1KB)。 2)37行,棧名稱為STACK,不初始化,可讀可寫,8(2^3)字節(jié)對(duì)齊。 3)38行,分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為 0,大小為0x400個(gè)字節(jié)。 4)39行,__initial_sp表示棧的結(jié)束地址,即棧頂?shù)刂?,STM32中棧是由高地址向低地址生長(zhǎng)。

2、設(shè)置堆

pYYBAGPlr86AcYjlAAEQ8AAMUJA021.png

上述代碼中: 1)45行,將堆的大小設(shè)為0x00000200(即512B = 0.5KB)。 2)47行,棧名為HEAP,不初始化,可讀可寫,8(2^3)字節(jié)對(duì)齊。 3)48行,堆空間起始地址。 4)49行,堆空間:0x200個(gè)字節(jié)。 5)50行,堆空間結(jié)束地址。

3、對(duì)堆棧屬性進(jìn)行設(shè)置

poYBAGPlr_GAa5-TAAAaf4C3VUE644.png

1)PRESERVE8 指令指定當(dāng)前文件保持堆棧八字節(jié)對(duì)齊。 2)告訴匯編器下面是32位的Thumb指令,如果需要匯編器將插入位以保證對(duì)齊。

4、設(shè)置中斷向量表

poYBAGPlr_2ADLFEAAF8fMwZhoM566.png

1)57行,定義一塊數(shù)據(jù)段,只可讀,段名字是RESET。

2)58行,EXPORT:在程序中聲明一個(gè)全局的標(biāo)號(hào)__Vectors,該標(biāo)號(hào)可在其他的文件中引用。

3)59行,在程序中聲明一個(gè)全局的標(biāo)號(hào)__Vectors_End。

4)60行,在程序中聲明一個(gè)全局的標(biāo)號(hào)__Vectors_Size。


之后的是中斷的定義,可以分為兩部分:

一部分是系統(tǒng)內(nèi)部中斷:

poYBAGPlsAuAal7TAADpCXTdOyM026.png

另一部分是外部中斷:

poYBAGPlsBeAJr6EAAEsVhKGedY311.png

在之后是中斷向量表的其他設(shè)置:

poYBAGPlsCKAND64AABEjYVDwlU902.png

1)142行,得到向量表的大小。

2)144行,定義一個(gè)代碼段,可讀,段名字是.text。

5、中斷功能的定義

復(fù)位中斷:

pYYBAGPlsC-AWQOMAADoK5Dz6uI969.png

1)149行,IMPORT:偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義。 2)150行,系統(tǒng)初始化。 3)151行,R0的值為SystemInit的地址。

4)152行,切換指令集,跳到SystemInit。 5)153行,R0的值為__main的地址。__main是庫(kù)提供的函數(shù)。用于完成堆棧,堆的初始化等工作,還會(huì)調(diào)用__user_initial_stackheap。 6)154行,切換指令集,跳到__main,并且最終會(huì)跳轉(zhuǎn)到main(),進(jìn)入C語(yǔ)言運(yùn)行環(huán)境。

6、用戶棧和堆初始化

pYYBAGPlsDqAJbHUAACq2qiA0m0429.png

1)333行,如果勾選了micro lib,使用微庫(kù)。 2)339行,沒有勾選微庫(kù)。

pYYBAGPlsEWAPJUDAAEI8EiGtpg685.png

1)344,用戶堆棧初始化程序入口。 2)346,保存堆起始地址。 3)347行,保存棧結(jié)束地址。 4)348行,保存堆結(jié)束地址。 5)349行,保存棧起始地址。

7、中斷跳轉(zhuǎn)

中斷發(fā)生之后,是怎么實(shí)現(xiàn)跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)函數(shù)里面的呢? 1)首先,前面

定義好了中斷的響應(yīng)函數(shù),即中斷向量表,標(biāo)號(hào)__Vectors,表示中斷向量表的入口地址。2)我們假設(shè)STM32從FLASH啟動(dòng),則中斷向量表起始地址為0x8000000,STM32上電后根據(jù)boot引腳來(lái)決定PC位置,即啟動(dòng)后PC跳到0x08000000。3)然后CPU會(huì)先取2個(gè)地址,第一個(gè)是棧頂?shù)刂罚诙€(gè)是復(fù)位異常地址(Reset_Handler),Reset_Handler最終會(huì)進(jìn)入到C語(yǔ)言的運(yùn)行環(huán)境,這個(gè)時(shí)候會(huì)先配置NVIC,使用NVIC_SetVectorTable()可以配置中斷向量表的起始地址和偏移,告訴CPU該向量表是位于Flash還是Ram,偏移是多少。 4)在發(fā)生中斷后,CPU找到中斷向量表地址,然后根據(jù)偏移(對(duì)號(hào)入座)再找到中斷地址,這樣就完成了跳轉(zhuǎn)了。

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

    關(guān)注

    6022

    文章

    44375

    瀏覽量

    628280
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10826

    瀏覽量

    352428
  • 啟動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    13857
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32H7的啟動(dòng)過(guò)程分析

    本章教程主要跟大家講STM32H7的啟動(dòng)過(guò)程,這里的啟動(dòng)過(guò)程是指從CPU上電復(fù)位執(zhí)行第1條指令開始(匯編文件)到進(jìn)入C程序main()函數(shù)入口之間的部分。
    的頭像 發(fā)表于 10-17 14:42 ?2107次閱讀

    詳解STM32啟動(dòng)過(guò)程

    本章教程主要跟大家講STM32H7的啟動(dòng)過(guò)程,這里的啟動(dòng)過(guò)程是指從CPU上電復(fù)位執(zhí)行第1條指令開始(匯編文件)到進(jìn)入C程序main()函數(shù)入口之間的部分。
    發(fā)表于 11-14 11:24 ?1755次閱讀

    專家揭秘:STM32啟動(dòng)過(guò)程全解

    電子發(fā)燒友網(wǎng)核心提示: 本文主要闡述了STM32啟動(dòng)過(guò)程全面解析,包括啟動(dòng)過(guò)程的介紹、啟動(dòng)代碼的陳列以及深入解析。 相對(duì)于ARM上一代的主流ARM7/ARM9內(nèi)核架構(gòu),新一代Corte
    發(fā)表于 09-10 08:50 ?5.3w次閱讀
    專家揭秘:<b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)過(guò)程</b>全解

    STM32F429啟動(dòng)過(guò)程詳解

    第13章 STM32F429啟動(dòng)過(guò)程詳解本章教程主要跟大家講STM32F429的啟動(dòng)過(guò)程,這里的啟動(dòng)過(guò)程是指從CPU上電復(fù)位執(zhí)行第1條指令開
    發(fā)表于 08-03 06:15

    解析STM32啟動(dòng)過(guò)程

    stm32系列芯片的種類和型號(hào)都有哪些?STM32啟動(dòng)過(guò)程是怎樣的?
    發(fā)表于 10-29 06:39

    STM32整個(gè)啟動(dòng)過(guò)程是怎樣的

    STM32整個(gè)啟動(dòng)過(guò)程是怎樣的?整個(gè)啟動(dòng)過(guò)程涉及的代碼有哪些呢?
    發(fā)表于 11-29 06:59

    STM32啟動(dòng)過(guò)程是怎樣的?

    STM32啟動(dòng)過(guò)程是怎樣的?
    發(fā)表于 11-30 06:08

    嵌入式uCLinux內(nèi)核啟動(dòng)過(guò)程分析

    分析uCLinux的啟動(dòng)過(guò)程,可以加快系統(tǒng)啟動(dòng)速度、正確建立應(yīng)用環(huán)境。本文要研究的就是uCLinux操作系統(tǒng)內(nèi)核的啟動(dòng)過(guò)程。
    發(fā)表于 08-15 16:51 ?760次閱讀

    詳解bootloader的執(zhí)行流程與ARM Linux啟動(dòng)過(guò)程分析

    RM Linux啟動(dòng)過(guò)程分析是本文要介紹的內(nèi)容,嵌入式 Linux 的可移植性使得我們可以在各種電子產(chǎn)品上看到它的身影。對(duì)于不同體系結(jié)構(gòu)的處理器來(lái)說(shuō)Linux的啟動(dòng)過(guò)程也有所不同。 本文以
    的頭像 發(fā)表于 12-21 09:24 ?1w次閱讀
    詳解bootloader的執(zhí)行流程與ARM Linux<b class='flag-5'>啟動(dòng)過(guò)程</b><b class='flag-5'>分析</b>

    STM32啟動(dòng)過(guò)程是怎么樣的?

    下好程序后,重啟芯片時(shí),SYSCLK的第4個(gè)上升沿,BOOT引腳的值將被鎖存,這就是所謂的啟動(dòng)過(guò)程。 STM32上電或者復(fù)位后,代碼區(qū)始終從0x00000000開始,其實(shí)就是將存儲(chǔ)空間的地址映射到0x00000000中。三種啟動(dòng)
    的頭像 發(fā)表于 11-27 16:36 ?3490次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>啟動(dòng)過(guò)程</b>是怎么樣的?

    STM32上電后啟動(dòng)過(guò)程

    STM32上電后啟動(dòng)過(guò)程
    發(fā)表于 11-15 18:21 ?16次下載
    <b class='flag-5'>STM32</b>上電后<b class='flag-5'>啟動(dòng)過(guò)程</b>

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

    STM32啟動(dòng)過(guò)程--啟動(dòng)文件--分析一、概述1、說(shuō)明  每一款芯片的啟動(dòng)文件都值得去研究,因?yàn)樗墒悄愕某绦蚺艿淖畛跻欢温?,不可以不知道?/div>
    發(fā)表于 11-30 13:21 ?4次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)過(guò)程</b>--<b class='flag-5'>啟動(dòng)</b>文件--<b class='flag-5'>分析</b>

    stm32啟動(dòng)過(guò)程

    一次性搞定stm32啟動(dòng)模式與啟動(dòng)過(guò)程一、stm32啟動(dòng)模式二、從flash啟動(dòng)過(guò)程2.1 數(shù)據(jù)
    發(fā)表于 12-16 16:57 ?8次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>啟動(dòng)過(guò)程</b>

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

    1. 程序和數(shù)據(jù)在Flash和SRAM上的存儲(chǔ)結(jié)構(gòu)在講解 STM32 啟動(dòng)過(guò)程之前,我們先來(lái)了解一下 STM32 的程序和數(shù)據(jù)在 Flash 和 SRAM 上到底是如何存儲(chǔ)的,因?yàn)橛辛诉@方面的知識(shí)
    發(fā)表于 12-23 19:55 ?12次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>啟動(dòng)過(guò)程</b><b class='flag-5'>分析</b>

    stm32啟動(dòng)過(guò)程詳解

    STM32啟動(dòng)過(guò)程詳解 近年來(lái),STM32微控制器在嵌入式系統(tǒng)中的應(yīng)用越來(lái)越廣泛。STM32微控制器具有高性能、低功耗、易擴(kuò)展和豐富的外設(shè)接口等優(yōu)勢(shì)。而要讓
    的頭像 發(fā)表于 12-08 15:47 ?1207次閱讀