RM新时代网站-首页

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

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

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

分析STM32的三種上電啟動(dòng)過(guò)程

汽車(chē)玩家 ? 來(lái)源: HACK實(shí)驗(yàn)室 ? 作者: HACK實(shí)驗(yàn)室 ? 2020-05-03 18:03 ? 次閱讀

上一篇文章我寫(xiě)了STM32RAM和Flash,文章最后我建議大家來(lái)深入研究一下STM32上電啟動(dòng)過(guò)程。同時(shí)有小伙伴留言說(shuō)想讓我講一下IAP(在線升級(jí)程序)。其實(shí)如果搞懂STM32的上電啟動(dòng)過(guò)程,那么IAP就可以信手拈來(lái)了。下面我們一起來(lái)研究研究。

先說(shuō)啟動(dòng)文件

我們正常在操作一款單片機(jī)的時(shí)候,都是從main函數(shù)開(kāi)始進(jìn)行編程的,但是單片機(jī)上電是從main函數(shù)開(kāi)始執(zhí)行的嗎?答案當(dāng)然是否定的,在main函數(shù)之前單片機(jī)最先執(zhí)行的是硬件設(shè)置SP、PC然后是“啟動(dòng)文件”,一般主要是項(xiàng)目文件里面的startup_xxxxx.s文件。其實(shí)這個(gè)就是我們常說(shuō)的Bootloader。

其實(shí)不光STM32系列單片機(jī)是這樣,我們接觸的NXP微控制器、TIMSP430以及51單片機(jī)等等其實(shí)都是有上述的啟動(dòng)文件的。啟動(dòng)文件負(fù)責(zé)的就是從單片機(jī)復(fù)位開(kāi)始到main函數(shù)之前這段時(shí)間所需要進(jìn)行的工作。我們一般很少接觸啟動(dòng)文件的主要原因是開(kāi)發(fā)環(huán)境往往給開(kāi)發(fā)者自動(dòng)的提供了這個(gè)啟動(dòng)文件,不需要我們?cè)偃ゲ傩?,直接從main函數(shù)開(kāi)始進(jìn)行設(shè)計(jì)就可以了。

STM32三種啟動(dòng)方式

接觸過(guò)STM32系列單片機(jī)的朋友應(yīng)該知道STM32有三種啟動(dòng)模式,用戶(hù)可以通過(guò)設(shè)置BOOT0和BOOT1的引腳電平狀態(tài),來(lái)選擇復(fù)位后的啟動(dòng)模式。

需要注意的是STM32上電復(fù)位以后,代碼區(qū)都是從0x00000000開(kāi)始的,三種啟動(dòng)模式只是將各自存儲(chǔ)空間的地址映射到0x00000000中。

1)從Flash啟動(dòng),將Flash地址0x08000000映射到0x00000000,這樣啟動(dòng)以后就相當(dāng)于從0x08000000開(kāi)始的,這是我們最常用的模式;

2)從SRAM啟動(dòng),將SRAM地址0x20000000映射到0x00000000,這樣啟動(dòng)以后就相當(dāng)于從0x20000000開(kāi)始的,用于調(diào)試,筆者基本沒(méi)用過(guò);

3)從系統(tǒng)存儲(chǔ)器啟動(dòng)(可以看上篇文章里的內(nèi)存映射圖,System memory),將系統(tǒng)存儲(chǔ)器地址0x1FFFF000映射到0x00000000,這樣啟動(dòng)以后就相當(dāng)于從0x1FFFF000開(kāi)始執(zhí)行的,值得注意的是這個(gè)系統(tǒng)存儲(chǔ)器里面存儲(chǔ)的其實(shí)是STM32自帶的Bootloader代碼,這其實(shí)是一個(gè)官方的IAP,它提供了可以通過(guò)UART1接口將用戶(hù)的代碼下載到Flash中的功能,下載完以后再切換到從Flash中啟動(dòng)就可以正常運(yùn)行了。打個(gè)比方這個(gè)官方的Bootloader就相當(dāng)于我們玩路由器時(shí)的“不死breed”。筆者之前在調(diào)STM32低功耗的時(shí)候?qū)⑾螺d口給復(fù)用了其他功能導(dǎo)致“變磚”,就是通過(guò)這種方式恢復(fù)的

分析STM32的三種上電啟動(dòng)過(guò)程

切回正題

下面我們來(lái)具體看一下從用戶(hù)的Flash啟動(dòng)STM32,從上電到main函數(shù)之間的這段時(shí)間都做了什么。

1)第一步是硬件設(shè)置SP、PC

我們參考《Cortex-M3權(quán)威指南》向量表章節(jié)表7.6,如下圖所示:

分析STM32的三種上電啟動(dòng)過(guò)程

前兩段地址主要是用來(lái)指定SP和PC的初值,上一節(jié)我們已經(jīng)知道了映射關(guān)系,所以這時(shí)已自動(dòng)從0x08000000位置處讀取數(shù)據(jù)賦值給了棧指針SP,從0x08000004位置處讀取數(shù)據(jù)賦值給了PC。需要注意的是這個(gè)復(fù)位向量初始值并不是固定的,可以通過(guò)一個(gè)叫“向量表偏移量寄存器”來(lái)修改定位。

分析STM32的三種上電啟動(dòng)過(guò)程

下圖是我們那個(gè)開(kāi)源OLED時(shí)鐘項(xiàng)目的HEX文件,用J-Flash打開(kāi)就可以看到設(shè)置完的SP=0x20005B88,PC=0x0800282D。

分析STM32的三種上電啟動(dòng)過(guò)程

2)第二步是設(shè)置系統(tǒng)時(shí)鐘

我們接著來(lái)追蹤系統(tǒng)的運(yùn)行軌跡,上面我們已經(jīng)知道了PC的地址為0x0800282D,但是這沒(méi)有遵循4字節(jié)對(duì)齊,我們將其對(duì)齊為0x0800282C,這時(shí)我們打開(kāi)項(xiàng)目文件里面的.map文件,找到這個(gè)地址,如下圖示:

分析STM32的三種上電啟動(dòng)過(guò)程

我們發(fā)現(xiàn)來(lái)到了第一節(jié)說(shuō)的startup_xxxxx.s文件,我們打開(kāi)startup文件找到:

分析STM32的三種上電啟動(dòng)過(guò)程

我們發(fā)現(xiàn)運(yùn)行到了SystemInit,C的世界我們就不陌生了,在項(xiàng)目文件的system_stm32f10x.c里面可以找到SystemInit函數(shù),也就是初始化系統(tǒng)時(shí)鐘了。

3)第三步是___main

到這里大家可能會(huì)以為已經(jīng)到了main函數(shù)了,其實(shí)不是這樣的。___main和main是不一樣的,我們尋找這個(gè)___main會(huì)發(fā)現(xiàn)找不到,startup文件里面沒(méi)有,map文件里面也沒(méi)有。其實(shí)它是在MDK自帶的庫(kù)里面了,主要的功能是軟件設(shè)置SP、加載.data.bss并初始化棧區(qū)。由于需要在線跟蹤才能看到,我在這里就不給大家列出來(lái)了,感興趣的朋友可以深入研究一下。

4)最后來(lái)到C的世界

在執(zhí)行到___main的最后就跳轉(zhuǎn)到了C文件的main函數(shù)了。

最后用一張圖來(lái)整體看一下流程:

分析STM32的三種上電啟動(dòng)過(guò)程

總 結(jié)

到這里STM32的存儲(chǔ)器以及上電啟動(dòng)過(guò)程就完整的總結(jié)完了,希望對(duì)大家有所幫助,大家如果感興趣可以在調(diào)試STM32的時(shí)候一步一步的來(lái)跟蹤一下看看,每一款單片機(jī)的啟動(dòng)文件其實(shí)都是很值得玩味的,對(duì)我們系統(tǒng)的來(lái)體會(huì)控制器的架構(gòu)、指令集、中斷向量等內(nèi)容是很有幫助的。大家如果將啟動(dòng)過(guò)程了解清楚了對(duì)我們后面來(lái)進(jìn)行IAP等有意思的操作是很有幫助的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)注

    2270

    文章

    10895

    瀏覽量

    355727
  • IAP
    IAP
    +關(guān)注

    關(guān)注

    2

    文章

    163

    瀏覽量

    24279
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    干貨?。?!開(kāi)關(guān)電源的軟啟動(dòng)過(guò)程分析

    ,并使得動(dòng)態(tài)測(cè)量更為容易。 開(kāi)關(guān)管作為開(kāi)關(guān)電源里面最重要的器件之一,在電源調(diào)試中也是受關(guān)注的重中之重。開(kāi)關(guān)管的關(guān)斷和導(dǎo)通動(dòng)作,實(shí)際是一個(gè)比較復(fù)雜的過(guò)程,但我們先可以把它進(jìn)行簡(jiǎn)單化分析。例如,當(dāng)
    發(fā)表于 11-26 17:40

    BQ79600-Q1啟動(dòng)過(guò)程

    電子發(fā)燒友網(wǎng)站提供《BQ79600-Q1啟動(dòng)過(guò)程.pdf》資料免費(fèi)下載
    發(fā)表于 11-09 14:57 ?0次下載
    BQ79600-Q1<b class='flag-5'>啟動(dòng)過(guò)程</b>

    AIC3254啟動(dòng)過(guò)程是怎樣的?需要功能調(diào)節(jié)延時(shí),請(qǐng)問(wèn)怎么實(shí)現(xiàn)?

    AIC3254 啟動(dòng)問(wèn)題 :沒(méi)有IIS,時(shí)鐘是用MSP430產(chǎn)生的8M給AIC3254工作時(shí)鐘的,但是每次啟動(dòng)要用手摸一下MCLK才能啟動(dòng),什么原因呢!大俠們能否說(shuō)明一下AIC3254啟動(dòng)
    發(fā)表于 11-07 07:28

    負(fù)載電容對(duì)電源轉(zhuǎn)換器啟動(dòng)過(guò)程的影響

    理想的電源轉(zhuǎn)換器需要無(wú)論負(fù)載如何變化都保持輸出電壓穩(wěn)定。在實(shí)際應(yīng)用中,負(fù)載瞬態(tài)期間選擇不合適的輸出電容會(huì)導(dǎo)致過(guò)高的紋波電壓和浪涌電流,從而影響電源轉(zhuǎn)換器的性能。本文將介紹選擇輸出電容的指南,詳細(xì)介紹負(fù)載電容對(duì)啟動(dòng)過(guò)程的影響,并提供改進(jìn)建議。
    的頭像 發(fā)表于 10-28 11:08 ?255次閱讀
    負(fù)載電容對(duì)電源轉(zhuǎn)換器<b class='flag-5'>啟動(dòng)過(guò)程</b>的影響

    PA3113D2在系統(tǒng)啟動(dòng)過(guò)程中會(huì)出現(xiàn)一個(gè)POP聲,請(qǐng)問(wèn)是什么原因造成的?

    請(qǐng)教各位高手,我現(xiàn)在CODEC芯片用的是WOLFSON WM8960,OPA用的是TI PA3113D2,瞬間的POP聲已經(jīng)解決,但是在系統(tǒng)啟動(dòng)過(guò)程中(快啟動(dòng)完成時(shí))還會(huì)出現(xiàn)一個(gè)P
    發(fā)表于 10-18 06:39

    使用pahomqtt啟動(dòng)過(guò)程中pipe_fops_open時(shí)出現(xiàn)rt_condvar_timedwait ,如何解決?

    在使用pahomqtt 啟動(dòng)過(guò)程中pipe_fops_open 時(shí)出現(xiàn)rt_condvar_timedwait 死等,而RTT 5.0則可以。請(qǐng)問(wèn)該如何解決?
    發(fā)表于 09-26 07:11

    自耦降壓啟動(dòng)和星啟動(dòng)區(qū)別在哪

    自耦降壓啟動(dòng)和星啟動(dòng)是兩常用的電動(dòng)機(jī)啟動(dòng)方式,它們?cè)?b class='flag-5'>啟動(dòng)過(guò)程中對(duì)電動(dòng)機(jī)的電流和轉(zhuǎn)矩的影響有
    的頭像 發(fā)表于 06-19 09:10 ?2764次閱讀

    啟動(dòng)與星啟動(dòng)的區(qū)別在哪里

    啟動(dòng)與星啟動(dòng)是兩不同的電機(jī)啟動(dòng)方式,它們?cè)?b class='flag-5'>啟動(dòng)過(guò)程中對(duì)電機(jī)的電流和轉(zhuǎn)矩有不同的影響。
    的頭像 發(fā)表于 06-18 11:37 ?2304次閱讀

    信號(hào)調(diào)制的三種基本方法

    號(hào)調(diào)制的三種基本方法:調(diào)幅(AM)、調(diào)頻(FM)和調(diào)相(PM),并分析它們的優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景。 調(diào)幅(AM) 2.1 調(diào)幅原理 調(diào)幅(Amplitude Modulation,AM)是一將低頻信號(hào)的幅度變化映射到高頻載波信號(hào)的
    的頭像 發(fā)表于 06-03 09:38 ?3731次閱讀

    STM32__UCOSII系統(tǒng)啟動(dòng)過(guò)程中空閑任務(wù)和統(tǒng)計(jì)任務(wù)扮演怎樣的角色?

    如題STM32__UCOSII系統(tǒng)啟動(dòng)過(guò)程中空閑任務(wù)和統(tǒng)計(jì)任務(wù)扮演怎樣的角色
    發(fā)表于 05-08 07:37

    STM32G030C8T6啟動(dòng)時(shí)間是如何影響HSE工作的?

    使用STM32G030C8T6過(guò)程中,發(fā)現(xiàn)給單片機(jī)供電的啟動(dòng)時(shí)間會(huì)影響單片機(jī)HSE的工作,
    發(fā)表于 03-28 09:04

    STM32WBA Nucleo-64設(shè)置主頻為100M,發(fā)現(xiàn)啟動(dòng)過(guò)程中卡死在PWR_VOSR_VOSRDY,為什么?

    使用ST官方的STM32WBA Nucleo-64板子, 當(dāng)設(shè)置主頻為100M,發(fā)現(xiàn)啟動(dòng)過(guò)程中卡死在PWR_VOSR_VOSRDY; 設(shè)置主頻為16MHz的時(shí)候,可以正常完成初始化。 使用的是CodeMx生成的工程 這是啥原因呢?看手冊(cè)也沒(méi)找到原因
    發(fā)表于 03-14 08:28

    放大電路有哪三種基本分析方法?舉例說(shuō)明

    放大電路是電子電路的重要組成部分,它起到放大信號(hào)的作用。在設(shè)計(jì)和分析放大電路時(shí),有三種基本的分析方法:傳輸特性分析、小信號(hào)分析和大信號(hào)
    的頭像 發(fā)表于 02-25 15:56 ?3130次閱讀

    運(yùn)放的三種應(yīng)用

    運(yùn)放在電路中主要存在三種應(yīng)用,放大器,濾波器,振蕩器。再這三種應(yīng)用電路中,運(yùn)放的兩大特點(diǎn)虛短虛斷仍然成立嗎? 在阻尼振蕩器中,工作過(guò)程是否按照我描述的這樣,在反相輸入端加一個(gè)近似鋸齒波的電流源,正半
    發(fā)表于 01-26 16:18

    電源芯片啟動(dòng)過(guò)沖有哪些影響?怎么測(cè)試電源芯片的啟動(dòng)過(guò)沖?

    電源芯片的啟動(dòng)過(guò)沖過(guò)大會(huì)對(duì)芯片中的元件造成損害,例如電容、電感等。這些元件在受到過(guò)沖電壓的作用時(shí)可能會(huì)出現(xiàn)短路或開(kāi)路等現(xiàn)象,從而造成芯片損害,影響芯片的整體穩(wěn)定性和可靠性,因此啟動(dòng)過(guò)沖是電源芯片測(cè)試中必不可少的項(xiàng)目。電源芯片的啟動(dòng)過(guò)
    的頭像 發(fā)表于 12-27 15:48 ?1148次閱讀
    電源芯片<b class='flag-5'>啟動(dòng)過(guò)</b>沖有哪些影響?怎么測(cè)試電源芯片的<b class='flag-5'>啟動(dòng)過(guò)</b>沖?
    RM新时代网站-首页