STM32再學習——啟動流程分析

2021-01-09 電子產品世界

  我們寫嵌入式程序,基本上採用C語言來編寫,以main( )作為程序的入口。但實際上,mian()並不是最先要執行的,在這之前需要做一些基本的工作,如堆、棧的定義;main函數的復位連接等,這些工作就需要一個專門的啟動程序來完成,由於需要做的工作內容不多,並且需要更直接的管理內存,一般採用彙編編寫。

本文引用地址:http://www.eepw.com.cn/article/236700.htm

  無論是STM32、ARM系列的單片機,還是簡單的如51,PIC等,都以為上述原因,需要啟動程序,只不過51,PIC等單片機的啟動程序已經在相應的IDE編譯、連結的時候隱含的編譯了,故在寫單片機程序的時候無需考慮。而STM32的啟動有相應的啟動文件,本文將採用KEIL MDK自帶的啟動文件STM32F10x.s進行分析。

  1 啟動模式的選擇

  STM32晶片自帶的啟動方式有3種如下表

啟動模式選擇引腳

啟動模式

說明

BOOT1

BOOT0

X

0

主快閃記憶體存儲器

主快閃記憶體存儲器作為啟動區域

0

1

系統存儲器

系統存儲器作為啟動區域

1

1

內置SRAM

內置SRAM作為啟動葡萄

  STM32的啟動選擇,通過設置BOOT1、BOOT0的引腳的高低電平即可選擇。其中主快閃記憶體啟動是將程序下載到內置的Flash進行啟動(該flash可運行程序),該程序可以掉電保存,下次開機可自動啟動;系統存儲器啟動是將程序寫入到一快特定的區域,一般由廠家直接寫入,不能被隨意更改或擦除。內置SRAM啟動,由於SRAM掉電丟失,不能保存程序,一般只用於程序的調試。

  就程序的啟動而言,採用以上3種方式啟動,但對於一個嵌入式系統的程序來說,如果程序執行文件很大,而STM32內置的存儲空間有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存儲在flash中,程序執行在SDRAM中,既節約了成本有提高了運行效率。如果採用外置的Flash+SDRAM的方式,就需要一個更加複雜的啟動文件(bootloader),需要考慮flash的COPY,Flash的驅動,內存的管理,通信機制等,本文暫不涉及此內容,以後有機會專門講述。

  2 啟動文件STM32F10x.s分析

  關於STM32F10x.s的啟動文件,主要做了3個工作:分配和初始化堆、棧;定義復位向量並初始化;中斷向量表及其相應的異常處理程序。

  2.1 定義堆、棧及其初始化

  堆和棧是能夠運行C語言的前提,如以下程序:

  定義棧:

  Stack_Size EQU 0x00000200

  AREA STACK, NOINIT, READWRITE, ALIGN=3

  Stack_Mem SPACE Stack_Size

  __initial_sp

  定義堆:

  Heap_Size EQU 0x00000000

  AREA HEAP, NOINIT, READWRITE, ALIGN=3

  __heap_base

  Heap_Mem SPACE Heap_Size

  __heap_limit

  初始化堆、棧:

  _user_initial_stackheap

  LDR R0, = Heap_Mem

  LDR R1, =(Stack_Mem + Stack_Size)

  LDR R2, = (Heap_Mem + Heap_Size)

  LDR R3, = Stack_Mem

  BX LR

  2.2 定義復位向量

  Boot引腳的設置不同,復位時,起始地址的位置不同,SRAM的起始地址為0x2000000, flash的起始地址為0x8000000。Cortex-M3內核規定,起始地址必須存放堆定指針,而第二個地址必須存放復位中斷入口向量。在系統復位時,內核會自動從其實地址的下一個地址(即32位)空間取出復位中斷入口向量,然後跳轉到復位中斷服務程序,該服務程序就會跳轉到main()執行程序。

  中斷向量表(部分向量):

  __Vectors

  DCD __initial_sp ; Top of Stack // 初始化堆跳轉

  DCD Reset_Handler ; Reset Handler // 復位中斷向量跳轉

  DCD NMI_Handler ; NMI Handler

  DCD HardFault_Handler ; Hard Fault Handler

  DCD MemManage_Handler ; MPU Fault Handler

  DCD BusFault_Handler ; Bus Fault Handler

  DCD UsageFault_Handler ; Usage Fault Handler

  DCD 0 ; Reserved

  DCD 0 ; Reserved

  DCD 0 ; Reserved

  DCD 0 ; Reserved

  DCD SVC_Handler ; SVCall Handler

  DCD DebugMon_Handler ; Debug Monitor Handler

  DCD 0 ; Reserved

  DCD PendSV_Handler ; PendSV Handler

  DCD SysTick_Handler ; SysTick Handler

  復位中斷服務程序

  ; Reset Handler // 該程序會跳轉到main()

  Reset_Handler PROC

  EXPORT Reset_Handler [WEAK]

  IMPORT __main

  LDR R0, =__main

  BX R0

  ENDP

  3 其他中斷向量及服務子程序

  在啟動文件中,只定義了中斷向量,其相應的服務子程序跳轉到空操作。為以後擴展中斷服務程序做了準備。

  在以上這些都勝利跑完之後,我們的微處理器(MCU)就開始main函數之旅……

相關焦點

  • RT-Thread學習筆記+2.RTT的啟動分析
    摘要本文主要介紹RT-Thread剛剛入手,以及RTT的上電啟動過程分析。然後在rt-thread\bsp\stm32\libraries目錄下,把其他用不到的庫文件也刪掉,只保留了F1的庫文件夾即可。最後強調一下:學習RTT,板子不是關鍵,不論是正點原子、野火、安富萊,還是F1、F4、F7都是可以的,不要糾結板子,最主要的了解RTT的使用方法。
  • Keil MDK下學習STM32注意事項
    在MDK下學習使用STM32也快兩個禮拜了,基本掌握了STM32在MDK環境下的開發流程和基本硬體程序的書寫。其間,遇到了許多問題,其中不少問題花費了我相當多得時間才得以解決,現將這些問題和解決方法列出。其中也有一些是學習過程中我覺得需要記下的注意事項。
  • stm32 啟動代碼 C語言實現 2
    以後再根據我的板子用外部的HSE實現。先來看看硬體。GPIO輸出低硬體實際操作流程如圖片。代碼也簡單,不再分析,對照上述圖片及注釋,分別對應寄存器手冊的設置,Clock最後,如圖片,紅色LED已亮,最簡單的啟動代碼加上電亮LED 已完成。
  • 帶你一步步了解STM32啟動代碼
    ,BIOS(那個藍色的界面)可能不會太陌生吧,這貨就是電腦的啟動代碼。BIOS主要是做一些開機前的準備工作,例如系統時間設定、啟動順序。。。扯遠了 其實電腦本身就是從單片機而來,那麼單片機也是有啟動代碼的,只是我們絕大部分情況 不去關心它。 啟動代碼究竟都幹了些什麼工作,為何需要它?想想你在c語言中用到了什麼東西,而這些東西卻是拿來就可以用的?堆、棧!沒錯,就是他們。
  • Swoole學習二Hyperf框架啟動流程分析
    這裡我們以Hyperf為例進行學習,因為大體上這些框架是差不多的,其實就是它有啥我趕緊也弄一個,如果要應用在生產環境上,還需要根據自己的需求進行選擇,具體可以看下項目的維護進度、社區的活躍程度等,Hyperf是Swoole官方推薦的框架,開發人員也是swoole的核心人員。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?   二、stm32單片機介紹   由ST廠商推出的stm32系列單片機,行業的朋友都知道,這是一款性價比超高的系列單片機,應該沒有之一,功能及其強大。
  • 分析STM32的三種上電啟動過程
    分析STM32的三種上電啟動過程 HACK實驗室 發表於 2020-05-03 18:03:00 上一篇文章我寫了STM32的RAM和Flash,文章最後我建議大家來深入研究一下
  • 對於新手學習stm32單片機我的個人建議路線
    使用stm32也有4年了、走了很多彎路。那我就說說個人看法。分享一下stm32學習路線。建議先學stm32cube 可以對照硬石電子教程學一下配置。之後要看正點原子的教程、原子的更加仔細細節。c基礎好一點學野火的也更適合。不要用開發板。
  • STM32關於GPIO的問題
    問:在學習GPIO時,遇到到埠復用問題一直不能明白,我舉個例子:PB6 PB7默認情況下是做普通IO使用的,當我想用I2C1是,我開啟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);當我要使用I2C1的重定義時,我要打開,RCC_APB1PeriphClockCmd
  • STM32單片機的定時器和ADC的應用方法介紹
    開啟兩個定時器給FPGA使用 要求是 一、定時器可以在任何時刻關閉,就算計數不滿也要停 二、定時器在再次開啟時可以從0計數 三、定時器可以在啟動過程中停止,然後更改定時周期再開始從0計數
  • Linux啟動過程流程分析
    Linux啟動過程流程分析 李倩 發表於 2018-04-24 14:48:55 內核引導階段 1、bootsect階段 2、setup階段 3、head.S階段
  • Zookeeper原理篇-Zookeeper啟動流程分析
    前言上篇我們通過了解Paoxs算法開始,到Zab協議的兩大特性:崩潰恢復和消息廣播,學習了Zookeeper是如何通過Zab協議實現高可用,本篇開始我們來學習Zookeeper的啟動流程單機模式啟動流程
  • stm32屬於arm嗎_arm和stm32的區別
    打開APP stm32屬於arm嗎_arm和stm32的區別 發表於 2017-10-10 11:34:35        stm32
  • stm32mp157開發板入門使用教程
    >1.1 有哪些資料、怎麼下載請參考:《第 1 篇 新學習路線、視頻介紹、資料下載》《第二章 資源下載方法》1.2 本篇開發板手冊中需要學習哪些章節Buildroot基於 Buildroot 2020.02 LTS,針對 100ask_stm32mp157 開發板進行適配,增加 busybox systemV systemD 系統服務支持,讓系統啟動速度更快,系統鏡像更小,並在裡面加入各種常用軟體包等工具
  • Stm32單片機開發KEIL啟動文件彙編語言詳解
    文章目錄簡介啟動文件彙編代碼相關指令堆棧空間的定義初始化中斷向量表復位中斷函數中斷函數的弱(WEAK)聲明用戶棧和堆初始化簡介我們在做單片機編程的時候,大部分都是用KEIL自帶的啟動文件來使程序進入C語言main函數,然後進行C語言編程開發的工作。那麼這個啟動文件到底做了什麼呢?相信朋友們肯定和我一樣好奇,想弄明白啟動文件到底都幹了些什麼。
  • STM32 IAP功能實現學習筆記
    最早接觸STM32的時候就了解到,stm32有IAP功能,但是一直沒有用到,最近公司項目中用到了,我才詳細的學習了這個功能,學完之後感覺這個功能很好用,也很實用,特此寫下來,做個筆記,同時也希望能幫助到所有的熱愛單片機的人。
  • STM32的啟動過程是怎麼樣的?
    STM32的啟動過程是怎麼樣的? STM32嵌入式開發 發表於 2020-11-27 16:36:44 分享這篇文章,談一下STM32啟動流程。
  • STM32學習—如何選擇各個電路部分的主要晶片
    STM32學習—如何選擇各個電路部分的主要晶片 李倩 發表於 2018-03-27 09:59:30 電路設計的基本過程一般是這樣的:需求分析——元件選型——原理圖設計——PCB設計——焊接調試。
  • STM32MP157開發板入門使用教程
    一、資料1. 1 有哪些資料、怎麼下載《第 1 篇 新學習路線
  • STM32——硬體和軟體I2C協議
    假如我們使能了 I2C 中斷,以上所有事件產生時,都會產生 I2C 中斷信號,進入同一個中斷服務函數,到 I2C中斷服務程序後,再通過檢查寄存器位來判斷是哪一個事件。主接收器接收流程及事件說明如下:(1) 同主發送流程,起始信號(S)是由主機端產生的,控制發生起始信號後,它產生事件「EV5」,並會對 SR1寄存器的「SB」位置 1,表示起始信號已經發送