衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分析STM32的三種上電啟動過程

汽車玩家 ? 來源: HACK實驗室 ? 作者: HACK實驗室 ? 2020-05-03 18:03 ? 次閱讀

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

先說啟動文件

我們正常在操作一款單片機的時候,都是從main函數開始進行編程的,但是單片機上電是從main函數開始執行的嗎?答案當然是否定的,在main函數之前單片機最先執行的是硬件設置SP、PC然后是“啟動文件”,一般主要是項目文件里面的startup_xxxxx.s文件。其實這個就是我們常說的Bootloader。

其實不光STM32系列單片機是這樣,我們接觸的NXP微控制器TIMSP430以及51單片機等等其實都是有上述的啟動文件的。啟動文件負責的就是從單片機復位開始到main函數之前這段時間所需要進行的工作。我們一般很少接觸啟動文件的主要原因是開發環境往往給開發者自動的提供了這個啟動文件,不需要我們再去操心,直接從main函數開始進行設計就可以了。

STM32三種啟動方式

接觸過STM32系列單片機的朋友應該知道STM32有三種啟動模式,用戶可以通過設置BOOT0和BOOT1的引腳電平狀態,來選擇復位后的啟動模式。

需要注意的是STM32上電復位以后,代碼區都是從0x00000000開始的,三種啟動模式只是將各自存儲空間的地址映射到0x00000000中。

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

2)從SRAM啟動,將SRAM地址0x20000000映射到0x00000000,這樣啟動以后就相當于從0x20000000開始的,用于調試,筆者基本沒用過;

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

分析STM32的三種上電啟動過程

切回正題

下面我們來具體看一下從用戶的Flash啟動STM32,從上電到main函數之間的這段時間都做了什么。

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

我們參考《Cortex-M3權威指南》向量表章節表7.6,如下圖所示:

分析STM32的三種上電啟動過程

前兩段地址主要是用來指定SP和PC的初值,上一節我們已經知道了映射關系,所以這時已自動從0x08000000位置處讀取數據賦值給了棧指針SP,從0x08000004位置處讀取數據賦值給了PC。需要注意的是這個復位向量初始值并不是固定的,可以通過一個叫“向量表偏移量寄存器”來修改定位。

分析STM32的三種上電啟動過程

下圖是我們那個開源OLED時鐘項目的HEX文件,用J-Flash打開就可以看到設置完的SP=0x20005B88,PC=0x0800282D。

分析STM32的三種上電啟動過程

2)第二步是設置系統時鐘

我們接著來追蹤系統的運行軌跡,上面我們已經知道了PC的地址為0x0800282D,但是這沒有遵循4字節對齊,我們將其對齊為0x0800282C,這時我們打開項目文件里面的.map文件,找到這個地址,如下圖示:

分析STM32的三種上電啟動過程

我們發現來到了第一節說的startup_xxxxx.s文件,我們打開startup文件找到:

分析STM32的三種上電啟動過程

我們發現運行到了SystemInit,C的世界我們就不陌生了,在項目文件的system_stm32f10x.c里面可以找到SystemInit函數,也就是初始化系統時鐘了。

3)第三步是___main

到這里大家可能會以為已經到了main函數了,其實不是這樣的。___main和main是不一樣的,我們尋找這個___main會發現找不到,startup文件里面沒有,map文件里面也沒有。其實它是在MDK自帶的庫里面了,主要的功能是軟件設置SP、加載.data.bss并初始化棧區。由于需要在線跟蹤才能看到,我在這里就不給大家列出來了,感興趣的朋友可以深入研究一下。

4)最后來到C的世界

在執行到___main的最后就跳轉到了C文件的main函數了。

最后用一張圖來整體看一下流程:

分析STM32的三種上電啟動過程

總 結

到這里STM32的存儲器以及上電啟動過程就完整的總結完了,希望對大家有所幫助,大家如果感興趣可以在調試STM32的時候一步一步的來跟蹤一下看看,每一款單片機的啟動文件其實都是很值得玩味的,對我們系統的來體會控制器的架構、指令集、中斷向量等內容是很有幫助的。大家如果將啟動過程了解清楚了對我們后面來進行IAP等有意思的操作是很有幫助的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2272

    文章

    10923

    瀏覽量

    357556
  • IAP
    IAP
    +關注

    關注

    2

    文章

    164

    瀏覽量

    24389
收藏 人收藏

    評論

    相關推薦

    干貨!!!開關電源的軟啟動過程分析

    ,并使得動態測量更為容易。 開關管作為開關電源里面最重要的器件之一,在電源調試中也是受關注的重中之重。開關管的關斷和導通動作,實際是一個比較復雜的過程,但我們先可以把它進行簡單化分析。例如,當
    發表于 11-26 17:40

    BQ79600-Q1啟動過程

    電子發燒友網站提供《BQ79600-Q1啟動過程.pdf》資料免費下載
    發表于 11-09 14:57 ?0次下載
    BQ79600-Q1<b class='flag-5'>啟動過程</b>

    AIC3254啟動過程是怎樣的?需要功能調節延時,請問怎么實現?

    AIC3254 啟動問題 :沒有IIS,時鐘是用MSP430產生的8M給AIC3254工作時鐘的,但是每次啟動要用手摸一下MCLK才能啟動,什么原因呢!大俠們能否說明一下AIC3254啟動
    發表于 11-07 07:28

    負載電容對電源轉換器啟動過程的影響

    理想的電源轉換器需要無論負載如何變化都保持輸出電壓穩定。在實際應用中,負載瞬態期間選擇不合適的輸出電容會導致過高的紋波電壓和浪涌電流,從而影響電源轉換器的性能。本文將介紹選擇輸出電容的指南,詳細介紹負載電容對啟動過程的影響,并提供改進建議。
    的頭像 發表于 10-28 11:08 ?340次閱讀
    負載電容對電源轉換器<b class='flag-5'>啟動過程</b>的影響

    PA3113D2在系統啟動過程中會出現一個POP聲,請問是什么原因造成的?

    請教各位高手,我現在CODEC芯片用的是WOLFSON WM8960,OPA用的是TI PA3113D2,瞬間的POP聲已經解決,但是在系統啟動過程中(快啟動完成時)還會出現一個P
    發表于 10-18 06:39

    使用pahomqtt啟動過程中pipe_fops_open時出現rt_condvar_timedwait ,如何解決?

    在使用pahomqtt 啟動過程中pipe_fops_open 時出現rt_condvar_timedwait 死等,而RTT 5.0則可以。請問該如何解決?
    發表于 09-26 07:11

    自耦降壓啟動和星啟動區別在哪

    自耦降壓啟動和星啟動是兩常用的電動機啟動方式,它們在啟動過程中對電動機的電流和轉矩的影響有
    的頭像 發表于 06-19 09:10 ?3183次閱讀

    啟動與星啟動的區別在哪里

    啟動與星啟動是兩不同的電機啟動方式,它們在啟動過程中對電機的電流和轉矩有不同的影響。
    的頭像 發表于 06-18 11:37 ?2631次閱讀

    輪軟啟動和硬啟動有什么區別

    分為軟啟動和硬啟動,下面我們將詳細介紹這兩啟動方式的區別。 一、軟啟動
    的頭像 發表于 06-18 10:38 ?5784次閱讀

    信號調制的三種基本方法

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

    STM32__UCOSII系統啟動過程中空閑任務和統計任務扮演怎樣的角色?

    如題STM32__UCOSII系統啟動過程中空閑任務和統計任務扮演怎樣的角色
    發表于 05-08 07:37

    STM32G030C8T6啟動時間是如何影響HSE工作的?

    使用STM32G030C8T6過程中,發現給單片機供電的啟動時間會影響單片機HSE的工作,
    發表于 03-28 09:04

    使用STM32G030過程中發現DC-DC芯片啟動時間長會使HSE不能正常工作怎么解決?

    在使用STM32G030過程中發現DC-DC芯片啟動時間長會使HSE不能正常工作。示波器查看晶振波形無問題。 電路圖是由DC-DC給LD
    發表于 03-28 08:47

    STM32WBA Nucleo-64設置主頻為100M,發現啟動過程中卡死在PWR_VOSR_VOSRDY,為什么?

    使用ST官方的STM32WBA Nucleo-64板子, 當設置主頻為100M,發現啟動過程中卡死在PWR_VOSR_VOSRDY; 設置主頻為16MHz的時候,可以正常完成初始化。 使用的是CodeMx生成的工程 這是啥原因呢?看手冊也沒找到原因
    發表于 03-14 08:28

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

    放大電路是電子電路的重要組成部分,它起到放大信號的作用。在設計和分析放大電路時,有三種基本的分析方法:傳輸特性分析、小信號分析和大信號
    的頭像 發表于 02-25 15:56 ?3428次閱讀
    澳门顶级赌场百家乐| 百家乐猪仔路| 百家乐官网游戏唯一官网网站| 六合彩下注| 百家乐推荐| 百家乐攻略投注法| 玩百家乐官网凤凰娱乐城| 大发888下载娱乐场| 百家乐椅子| 路单百家乐官网的玩法技巧和规则| 遂平县| 大发888官网游戏平台| 百家乐六亿财富| CEO百家乐官网的玩法技巧和规则 喜达百家乐官网的玩法技巧和规则 | 大发888游戏网页版| 百家乐赌场策略大全| 属虎和属猴牛人做生意| 百家乐官网平注赢钱法| 网上百家乐官网玩法| 德州扑克冠军| 百家乐五湖四海娱乐平台 | 网上百家乐官网骗人的吗| 长乐坊娱乐城| 1368棋牌游戏平台| 凤凰百家乐的玩法技巧和规则| 24山向吉凶| 伯爵百家乐官网娱乐网| 百家乐官网摇色子网站| 网络赌博| 德州扑克怎么玩| 全讯网a3322| 百家乐连锁| 百家乐视频麻将下载| 豪门百家乐官网的玩法技巧和规则| 真人百家乐官网现金游戏| 色中色最新网址| 德州扑克游戏平台| 微信百家乐群资源| 百家乐大小牌路的含义| 太阳城百家乐看牌| 利高百家乐现金网|