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.mzph.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 编…