STM32F103 單片機(基于 ARM Cortex-M3 內核)的啟動過程涉及硬件初始化、固件配置和程序執行流程。

1. 啟動模式與地址映射

STM32F103 的啟動模式由 BOOT0 和 BOOT1 引腳配置決定,不同的啟動模式對應不同的存儲器映射:

啟動模式 映射地址范圍 說明
主 Flash 0x08000000~0x0807FFFF 用戶程序存儲在 Flash 中,復位后從 Flash 啟動(默認模式)。
系統存儲器 0x1FFFF000~0x1FFFF7FF 內置 Bootloader(ISP 編程用),用于通過串口/USB 下載程序。
內置 SRAM 0x20000000~0x2000FFFF 調試或臨時運行代碼時使用,需手動加載程序到 SRAM。
地址重映射:Cortex-M3 內核復位后,始終從 0x00000000 讀取初始堆棧指針(SP)和復位向量。STM32 通過內部機制將上述物理地址映射到 0x00000000(例如,Flash 啟動時 0x08000000 被映射到 0x00000000)。

2. 啟動過程關鍵步驟

(1) 硬件復位
復位后,內核執行以下操作:

從 0x00000000 讀取 初始堆棧指針(MSP)。

從 0x00000004 讀取 復位向量地址(程序入口 Reset_Handler)。

跳轉到復位向量地址執行代碼。

(2) 啟動文件(Startup Code)
啟動文件(如 startup_stm32f103xe.s)是匯編代碼,負責初始化關鍵硬件并引導到 main() 函數。主要流程如下:

初始化堆棧指針
定義主堆棧(MSP)和可選的進程堆棧(PSP):

assembly
; 定義堆棧段
Stack_Size      EQU     0x400AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

向量表(Vector Table)
中斷向量表位于 Flash 起始位置,包含中斷服務函數地址:

assembly
; 中斷向量表
Vector_Table    DCD     __initial_sp             ; 初始堆棧指針DCD     Reset_Handler            ; 復位向量DCD     NMI_Handler              ; NMI 處理函數DCD     HardFault_Handler        ; 硬件錯誤處理函數...                              ; 其他中斷向量

復位處理函數(Reset_Handler)
復位后執行的核心初始化代碼:

assembly
Reset_Handler   PROCEXPORT  Reset_Handler           [WEAK]IMPORT  SystemInit               ; 引入 SystemInit 函數IMPORT  __main                  ; 引入 C 庫初始化函數LDR     R0, =SystemInit          ; 加載 SystemInit 地址BLX     R0                       ; 調用 SystemInit(初始化時鐘等)LDR     R0, =__main              ; 加載 __main 地址BX      R0                       ; 跳轉到 __main(初始化 C 庫并調用 main())ENDP

(3) SystemInit 函數
SystemInit() 在 system_stm32f1xx.c 中定義,負責初始化關鍵系統配置:

設置時鐘源(HSI/HSE/PLL)。

配置 Flash 預取、等待周期。

初始化 AHB/APB 總線時鐘。

可選:配置向量表偏移寄存器(VTOR)。

(4) __main 和 main()
__main:C 庫函數,負責初始化全局變量、堆棧,最終調用用戶 main()。

main():用戶程序入口。

  1. 關鍵指令說明
    啟動文件中的匯編指令示例:

LDR R0, =label
將 label 的地址加載到寄存器 R0。

assembly
LDR R0, =SystemInit ; 將 SystemInit 函數的地址加載到 R0
BLX R0
跳轉到 R0 指向的地址(調用函數),并保存返回地址到 LR 寄存器。

assembly
BLX R0 ; 調用 SystemInit()
BX R0
跳轉到 R0 指向的地址(不保存返回地址)。

assembly
BX R0 ; 跳轉到 __main
PROC / ENDP
定義函數塊的開始和結束。

assembly
Reset_Handler PROC

ENDP

4. 內存布局與 VTOR

向量表偏移寄存器(VTOR):
默認向量表位于 Flash(0x08000000),可通過修改 VTOR 寄存器重定位向量表(如將向量表復制到 RAM):

c
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; // 在 SystemInit 中配置
典型內存分布:

0x00000000: 映射到啟動存儲器(Flash/系統存儲器/SRAM)
0x08000000: Flash 實際地址
0x20000000: SRAM 地址
0x40000000: 外設寄存器

5. 常見問題

啟動失敗的可能原因

堆棧溢出導致 MSP 初始化錯誤。

復位向量未正確指向 Reset_Handler。

時鐘配置錯誤(如未啟用外部晶振 HSE)。

調試技巧

檢查向量表是否對齊到 0x200 的倍數。

使用調試器查看 SP 和 PC 的初始值。

總結

STM32F103 的啟動過程由硬件復位、啟動文件初始化、系統配置和用戶程序執行組成。理解地址映射、向量表和關鍵指令對調試和優化啟動流程至關重要。開發者可通過修改啟動文件或調整 BOOT 引腳選擇不同的啟動模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76859.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言-選擇排序算法】實現對十個數進行排序

目錄 前言 一、選擇排序算法原理 二、選擇排序算法實現對十個數進行排序 三、代碼運行示例 四、選擇排序算法的時間復雜度和空間復雜度分析 五、選擇排序算法的優缺點 六、總結 前言 在計算機科學領域,排序算法是基石般的存在,它們就像是整理雜亂…

配置Intel Realsense D405驅動與ROS包

配置sdk使用 Ubuntu20.04LTS下安裝Intel Realsense D435i驅動與ROS包_realsense的驅動包-CSDN博客 中的方法一 之后不通過apt安裝包,使用官方的安裝步驟直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 從這一步開始 執行完 這一步…

基于SpringBoot的中華詩詞文化分享平臺-項目分享

基于SpringBoot的中華詩詞文化分享平臺-項目分享 項目介紹項目摘要管理員功能圖會員功能圖系統功能圖項目預覽會員主頁面詩詞頁面發布問題回復評論 最后 項目介紹 使用者:管理員、會員 開發技術:MySQLJavaSpringBootVue 項目摘要 本文旨在設計與實現一…

ProxySQL 性能調優工具推薦

ProxySQL 的性能優化需結合?實時監控工具?與?自動化分析平臺?,以下為常用工具分類與推薦: 一、?內置診斷工具? ProxySQL Admin 接口? 通過內置管理表直接分析性能數據: sql Copy Code SELECT * FROM stats_mysql_query_digest; – 高頻查詢分析(執行次數、平均耗…

unity TEngine學習記錄3

上一篇講了怎么使用te框架,本篇主要學習的是UI,一個游戲百分之70%都是UI的展示效果,現在讓我們繼續打開te官網找到UI部分繼續學習。 ui創建以及加載 我們根據文檔首先打開命名規則界面,大家第一次看就知道這個是干啥的,你想使用此…

23種設計模式-創建型模式之單例模式(Java版本)

Java 單例模式(Singleton Pattern)詳解 🌟 什么是單例模式? 單例模式確保一個類只有一個實例,并提供一個全局訪問點來訪問它。 🧠 使用場景 配置管理類(如讀取配置文件)日志工具類…

2025能源網絡安全大賽CTF --- Crypto wp

文章目錄 前言simpleSigninNumberTheory 前言 大半年以來寫的第一篇文章!!! simpleSignin 題目: from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…

加密與解密完全指南,使用Java實現

文章目錄 1. 加密基礎知識1.1 什么是加密?1.2 加密的歷史簡介1.2.1 古典加密1.2.2 現代加密的起源 1.3 加密的基本概念1.3.1 密碼學中的關鍵術語1.3.2 加密的基本原則 1.4 加密的分類1.4.1 對稱加密(Symmetric Encryption)1.4.2 非對稱加密&a…

十一、數據庫day03--SQL語句02

文章目錄 一、查詢語句1. 基本查詢2. 條件查詢2.1 ?較運算符&邏輯運算符2.2 模糊查詢2.3 范圍查詢2.4 判斷空 3. 其他復雜查詢3.1 排序3.2 聚合函數3.3 分組3.4 分頁查詢 二、回顧1. 使? Navicat ?具中的命令列2.命令?基本操作步驟 提示:以下是本篇文章正文…

Flowable 與 bpmn.io@7.0 完整集成示例 Demo

Flowable 與 bpmn.io7.0 完整集成示例 Demo 下面是一個完整的前后端集成示例&#xff0c;包含前端使用 bpmn.js 7.0 和與 Flowable 后端交互的實現。 1. 后端實現 (Spring Boot Flowable) 1.1 添加依賴 (pom.xml) <dependencies><!-- Spring Boot --><depe…

ROS2 安裝詳細教程,Ubuntu 22.04.5 LTS 64 位 操作系統

一、完整安裝流程&#xff08;推薦&#xff09; 1. 安裝依賴工具 sudo apt update && sudo apt install -y software-properties-common curl gnupg2 2. 添加 ROS 2 GPG 密鑰 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /…

STM32 基本GPIO控制

目錄 GPIO基礎知識 ?編輯IO八種工作模式 固件庫實現LED點燈 蜂鳴器 按鍵基礎知識 ?編輯繼電器 震動傳感器 433M無線模塊 GPIO基礎知識 GPIO(General-Purpose input/output,通用輸入/輸出接口) 用于感知外部信號&#xff08;輸入模式&#xff09;和控制外部設備&…

14.Chromium指紋瀏覽器開發教程之WebGL指紋定制

WebGL指紋概述 當在瀏覽器打開的網頁上瀏覽內容時&#xff0c;看到的大多是平面的、靜態的圖像和文字。但是有時想要在網頁上看到更加生動、立體的圖像&#xff0c;如3D游戲、虛擬現實應用等。這時&#xff0c;就需要用到WebGL。 簡單來說&#xff0c;WebGL&#xff08;Web G…

C# foreach 循環中獲取索引的完整方案

一、手動維護索引變量 ?實現方式?&#xff1a; 在循環外部聲明索引變量&#xff0c;每次迭代手動遞增&#xff1a; int index 0; foreach (var item in collection) { Console.WriteLine($"{index}: {item}"); index; } ?特點?&#xff1a; 簡單直接&#…

Android 下拉欄中的禁用攝像頭和麥克風隱藏

Android 下拉欄中的禁用攝像頭和麥克風隱藏 文章目錄 Android 下拉欄中的禁用攝像頭和麥克風隱藏一、前言二、下拉框中的禁用攝像頭和麥克風隱藏實現1、設置支持屬性為false2、修改代碼 三、其他1、下拉欄中的禁用攝像頭和麥克風隱藏小結2、 Android SensorPrivacyService ps&a…

數字后端設計 (四):時鐘樹綜合——讓芯片的「心跳」同步到每個角落

—— 試想全城的人要在同一秒按下開關——如果有的表快、有的表慢&#xff0c;結果會亂套&#xff01;時鐘樹綜合就是給芯片內部裝一套精準的“廣播對時系統”&#xff0c;讓所有電路踩著同一個節拍工作。 1. 為什么時鐘如此重要&#xff1f; 芯片的「心跳」&#xff1a;時鐘信…

華為網路設備學習-19 路由策略

一、 二、 注意&#xff1a; 當該節點匹配模式為permit下時&#xff0c;參考if else 當該節點匹配模式為deny下時&#xff1a; 1、該節點中的apply子語句不會執行。 2、如果滿足所有判斷&#xff08;if-match&#xff09;條件時&#xff0c;拒絕該節點并跳出&#xff08;即不…

機器學習決策樹

一、何為決策樹 決策樹&#xff08;Decision Tree&#xff09;是一種分類和回歸方法&#xff0c;是基于各種情況發生的所需條件構成決策樹&#xff0c;以實現期望最大化的一種圖解法。由于這種決策分支畫成圖形很像一棵樹的枝干&#xff0c;故稱決策樹。它的運行機制非常通俗易…

香港服務器CPU對比:Intel E3與E5系列核心區別與使用場景

香港服務器的 CPU 配置(核心數與主頻)直接決定了其并發處理能力和數據運算效率&#xff0c;例如高頻多核處理器可顯著提升多線程任務響應速度。在實際業務場景中&#xff0c;不同負載需求對 CPU 架構的要求存在顯著差異——以 Intel E3 和 E5 系列為例&#xff0c;由于兩者在性…

【Rust 精進之路之第8篇-工具賦能】深入 Cargo:依賴管理、構建配置與工作空間 (Workspace)

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:超越構建,Cargo 是 Rust 生態的引擎 在我們的 Rust 學習之旅初期(第二篇),我們已經與 Cargo 有過初步的接觸。我們學會了使用 cargo new 創建項目骨架,用 cargo build 編…