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

2020-12-09 電子發燒友

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

HACK實驗室 發表於 2020-05-03 18:03:00

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

先說啟動文件

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

其實不光STM32系列單片機是這樣,我們接觸的NXP的微控制器、TI的MSP430以及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低功耗的時候將下載口給復用了其他功能導致「變磚」,就是通過這種方式恢復的

切回正題

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

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

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

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

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

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

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

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

我們發現運行到了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的時候一步一步的來跟蹤一下看看,每一款單片機的啟動文件其實都是很值得玩味的,對我們系統的來體會控制器的架構、指令集、中斷向量等內容是很有幫助的。大家如果將啟動過程了解清楚了對我們後面來進行IAP等有意思的操作是很有幫助的。

打開APP閱讀更多精彩內容

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

相關焦點

  • STM32的啟動過程是怎麼樣的?
    STM32的啟動過程是怎麼樣的? STM32嵌入式開發 發表於 2020-11-27 16:36:44 分享這篇文章,談一下STM32啟動流程。
  • avr單片機和stm32區別與優缺點分析
    ,具備10mA-20mA灌電流的能力;   ● 片內集成多種頻率的RC振蕩器、上電自動復位、看門狗、啟動延時等功能,外圍電路更加簡單,系統更加穩定可靠;   ● 大部分avr片上資源豐富:帶E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comparator,WDT等;   ● 大部分avr除了有ISP功能外,還有IAP功能
  • RT-Thread學習筆記+2.RTT的啟動分析
    摘要本文主要介紹RT-Thread剛剛入手,以及RTT的上電啟動過程分析。RTT的系統初始化,以及空閒任務等啟動系統啟動,都不見蹤影,這不得不讓我想一探究竟。代碼框架分析首先,看了下啟動文件startup_stm32f103xe.s,這個文件還是使用的是hal庫提供的標準文件,RTT並沒在這個上面做文章。
  • STM32單片機的三種啟動模式解析
    打開APP STM32單片機的三種啟動模式解析 21ic 發表於 2019-09-20 16:17:18 STM32三種啟動模式對應的存儲介質均是晶片內置的
  • 帶你一步步了解STM32啟動代碼
    我們知道堆和棧是內存中劃分出的一塊區域,那為什麼我們沒有親自劃分呢,因為啟動代碼幫了你的忙!!!再想想單片機工作的時候,有哪些配置被我們忽略了,而它卻可以用?時鐘,就是這貨,我們可以不配置時鐘,而你發現它竟然有默認值!還是啟動代碼幫了你 接下來仔細研究一下stm32的啟動代碼,首先要知道啟動代碼藏在哪裡:一個叫做startup的彙編文件。
  • 如何設計在stm32中的復位電路?
    復位的種類有很多:上電復位、掉電復位、復位引腳復位、看門狗復位、軟體復位等。本文探討的就是在stm32中復位電路如何設計。 新系列採用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結合STM32平臺的設計理念,開發人員通過選擇產品可重新優化功能、存儲器、性能和引腳數量,以最小的硬體變化來滿足個性化的應用需求。
  • stm32 啟動代碼 C語言實現 2
    這篇在上個基礎上,實實在在的去初始化一些硬體 首先就是系統的時鐘,然後我們點亮一個LED燈。之前還有一篇STM32 關於鍾源的介紹,。如圖在這種low_level 初始化的這個階段,我先用MSI作為系統的時鐘,並且配置為8Mhz。
  • STM32定時器所支持的三種計數模式及計數過程
    STM32定時器所支持的三種計數模式及計數過程 李倩 發表於 2018-11-19 19:18:42 STM32常規定時器主要包括基本定時器、通用定時器和高級定時器。
  • STM32再學習——啟動流程分析
    而STM32的啟動有相應的啟動文件,本文將採用KEIL MDK自帶的啟動文件STM32F10x.s進行分析。  1 啟動模式的選擇  STM32晶片自帶的啟動方式有3種如下表 啟動模式選擇引腳
  • 新能源電瓶車沒電三種方法教你應急啟動
    現在新能源電瓶車越來越流行,但是如果遇到特殊情況,開車的車主很多都會遇到蓄電池沒電,在這個時候汽車啟動就成為比較困難,那麼遇到這種情況的時候我們應該怎麼去做那?今天小編就給大家講述一下新能源電瓶車沒電三種方法教你應急啟動。
  • stm32mp157開發板入門使用教程
    >數據,支持三種發行系統定製,分別為使用 eglfs 的 qt5.14 使用 xwindows 顯示的 weston 以及最小 core 系統,系統內包含各種常見工具包,助你快速驗證功能。Buildroot基於 Buildroot 2020.02 LTS,針對 100ask_stm32mp157 開發板進行適配,增加 busybox systemV systemD 系統服務支持,讓系統啟動速度更快,系統鏡像更小,並在裡面加入各種常用軟體包等工具
  • STM32學習之路(二)——MDK-ARM開發過程簡介
    news/Soft/embsof/arm/200908/505.html 下載RealView MDK-ARM 3.80a(MDK-ARM V3.80a,MDK3.80a)版本 mdk380a_mcu123.rarhttp://esoft.mcu123.com/MCU123_temp_0080309@/arm/mdk380a_mcu123.rar (註冊機自行查找,安裝過程略
  • ucosii在stm32上的移植詳解1
    雖然目前網上已經有不少關於ucosii在stm32上的移植版本,包括micrium也有官方移植版本。但這些版本具體是怎麼移植出來的,又該怎麼基於移植好的ucosii開發應用軟體,網上介紹的並不多。這裡介紹一下我的移植經歷,希望對大家有所幫助。 我的移植基本上是從零開始的。
  • stm32與pic單片機比較_哪個好
    單片機特性   1、內核:ARM32位Cortex-M3CPU,最高工作頻率72MHz,1.25DMIPS/MHz,單周期乘法和硬體除法   2、存儲器:片上集成32-512KB的Flash存儲器。從低功耗模式快速啟動也同樣節省電能;啟動電路使用STM32內部生成的8MHz信號,將微控制器從停止模式喚醒用時小於6微秒。   STM32由於有各種外設 操作起來簡單,可以處理模擬以及數位訊號,適用於設計的控制電路   stm32單片機缺點   STM32是跑指令的,適合跑算法,但是針對多路的信號處理就需要很多片DSP來並行處理。
  • STM32MP157開發板入門使用教程
    Yocto使用 yocto 最新為長期支持分支,在此基礎上新增我們自己的元層數據,支持三種發行系統定製,分別為使用 eglfs 的 qt5.14 使用 xwindows 顯示的 weston 以及最小 core 系統,系統內包含各種常見工具包,助你快速驗證功能。
  • Keil MDK下學習STM32注意事項
    其中也有一些是學習過程中我覺得需要記下的注意事項。1、STM32固件庫使用外圍設備的主要思路在STM32中,外圍設備的配置思路比較固定。2、如果在源文件中未定義以下預定義,需在工程「C/C++」中預定義一欄 填寫「USE_STDPERIPH_DRIVER,STM32F10X_CL(器件所屬分類),USE_STM3210C_EVAL(使用的評估板,庫自帶的歷程中需要根據"readme"文件提示添加,自己的工程除非是在一樣的評估板上運行,否則不需要預定義此項)」
  • 單片機(STM32)使用ADC,對鋰電池採集思路分析
    我們在開發相關產品過程中,考慮到隨身攜帶,以及方便使用,一般會在設計之初,就會考慮使用鋰電池供電,那麼使用鋰電池供電,就一定要使用到鋰電池電源管理晶片,會硬體和軟體的開發過程,都會對鋰電池的管理,充電,放電,充滿,充電中等狀態能進行檢測。
  • 詳解STM32 ISP設置及使用說明
    STM32的BOOT概述STM32三種啟動模式對應的存儲介質均是晶片內置的,它們是:用戶快閃記憶體:    BOOT1=x  BOOT0=0   晶片內置的Flash,即主存儲器FlashSRAM:        BOOT1=1  BOOT0=1  晶片內置的SRAM 區,就是內存啦。
  • Linux系統啟動過程
    BIOS 上電自檢(POST)引導裝載程序 (GRUB2)內核初始化啟動 systemd,其是所有進程之父。BIOS 上電自檢(POST)這對於所有作業系統都一樣。當電腦接通電源,電腦開始執行 BIOS(基本輸入輸出系統Basic I/O System)的 POST(上電自檢Power On Self Test)過程。在 1981 年,IBM 設計的第一臺個人電腦中,BIOS 被設計為用來初始化硬體組件。POST 作為 BIOS 的組成部分,用於檢驗電腦硬體基本功能是否正常。
  • STM32關於GPIO的問題
    答:當TPAL=0時:如果在啟動侵入檢測TAMPER引腳前(通過設置TPE位)該引腳已經為高電平,一旦啟動侵入檢測功能,則會產生一個額外的侵入事件(儘管在TPE位置』1』後並沒有出現上升沿)。 ● 當TPAL=1時:如果在啟動侵入檢測引腳TAMPER前(通過設置TPE位)該引腳已經為低電平,一旦啟動侵入檢測功能,則會產生一個額外的侵入事件(儘管在TPE位置』1』後並沒有出現下降沿)。