STM32启动流程全解析:从复位到main函数
适用芯片STM32G474RET6适用场景单片机入门底层原理、面试核心考点、MDK/STM32CubeIDE 编译启动流程解析文档形式全程填空学习 原理讲解 答案文末附边学边记彻底吃透启动流程很多单片机开发者天天写main函数但绝大多数人不清楚单片机上电后并不是直接运行main函数。从上电复位到进入 main 函数CPU 经历了一整套固定的硬件软件启动流程。本文以STM32G474RET6Cortex-M4内核为例以填空问答的方式带你逐层拆解完整启动链路彻底搞懂底层启动逻辑。一、整体流程总览先建立全局认知STM32G474 上电完整执行链路硬件上电复位 → 读取___向量表第0项初始栈指针MSP___初始化栈指针 → 读取___向量表第1项复位向量Reset_Handler___进入复位服务函数 → 执行启动文件初始化代码 → 初始化系统时钟 → 初始化全局/静态变量 → 最终跳转执行main函数在startup_stm32g474xx.s文件中二、第一步硬件上电与复位硬件层当我们给 STM32G474 上电3.3V 供电单片机会自动触发上电复位POR。填空1复位后CPU的初始状态1. STM32G474 内核为_Cortex-M4_内核型号- ARM公司2. 复位后CPU 所有寄存器恢复默认值程序计数器 PC _0x0000_0000_(Cortex-M内核规定的复位取向量地址)注CPU 执行程序是一条一条顺序取指令的。PC 里存的就是下一条指令在内存中的地址。3. 此时 CPU 不会执行任何用户代码只会去_向量表中断向量表/ Vector Table_中读取启动参数核心知识点Cortex-M 内核单片机复位后固定从Flash起始地址0x08000000读取数据这是硬件固化的规则无法修改。三、第二步读取栈指针SP启动第一步取值STM32 的 Flash 起始地址存储了一张中断向量表向量表的前两个地址是启动的关键。填空2向量表前两个地址存储内容1. 地址0x08000000存储的是_主栈指针MSP栈顶地址__的初始值2. 地址0x08000004存储的是_Reset_Handler复位处理函数_的入口地址原理详解单片机上电后首先读取 0x08000000 地址的数据赋值给栈指针 SP。栈的作用是存放函数局部变量、函数调用现场、中断现场没有初始化栈CPU无法执行任何C语言函数。STM32G474 默认栈大小由启动文件中Stack_Size定义默认栈顶地址由向量表自动加载。四、第三步进入复位中断服务函数Reset_Handler填空3复位函数核心作用CPU 读取 0x08000004 地址数据后跳转到__Reset_Handler__函数该函数是汇编语言实现是上电后执行的第一段代码。填空4Reset_Handler内部执行流程在复位服务函数中依次执行3个核心操作1. 拷贝_.data__段数据将 Flash 中的已初始化全局变量拷贝到 RAM 中2. 清零_.bss__段数据将未初始化的全局变量、静态变量在 RAM 中清零3. 调用_SystemInit()__函数初始化系统时钟、外设等底层配置核心知识点我们在 C 语言中定义的Plain Textint a 10; //已初始化全局变量int b; // 未初始化全局变量static int c 5;这些变量的初始化全部在进入main函数之前完成如果没有这一步全局变量数值会随机错乱。注以上这是复位函数汇编代码五、第四步系统初始化与库函数配置填空5STM32G474启动初始化关键函数1. 复位函数中会调用__HAL_Init()HAL库初始化函数初始化HAL库底层时钟、中断优先级分组2. 执行_SystemClock_Config()_函数完成 STM32G474 系统时钟配置默认配置为最大主频 170MHz3. 初始化全局中断、外设默认状态为用户代码运行铺垫环境六、第五步最终跳转进入main函数填空6进入main函数的最后一步当栈初始化、变量初始化、系统时钟初始化、HAL库初始化全部完成后启动文件最后会执行_BX R0_指令正式进入用户的 main 函数。在startup_stm32g474xx.s文件关键误区纠正高频面试坑1.main函数不是程序入口真正的程序入口是Reset_Handler汇编函数2. 全局变量初始化早于main函数main 函数内不会重复初始化全局变量3. 没有栈初始化CPU 无法运行 C 代码只能运行纯汇编代码七、完整流程闭环复盘填空总结请完整默写梳理一遍流程STM32G474 上电 → 硬件POR复位 → 从Flash 0x08000000读取MSP主栈指针初值_→ 从0x08000004读取_Reset_Handler入口地址_→ 执行Reset_Handler → 拷贝data段、清零bss段 → 初始化HAL库、系统时钟 → 跳转_main()_正式运行用户程序八、所有填空标准答案整体总览填空栈指针(SP)、复位中断服务函数地址填空1Cortex-M4、0、内部Flash主闪存填空2栈指针(SP)、复位中断服务函数(Reset_Handler)填空3Reset_Handler填空4data、bss、系统初始化填空5HAL_Init()、SystemClock_Config()填空6跳转B/BL跳转指令闭环复盘填空栈指针、复位函数地址、main函数九、CSDN文末总结可直接复用1. STM32G474 上电不会直接运行 main先由硬件加载栈指针和复位入口2. Reset_Handler 是整个程序的真正入口负责变量初始化、系统底层配置3. data段、bss段初始化是C语言代码正常运行的基础保证全局变量数值正确4. 所有底层配置完成后才会跳转至用户编写的 main 函数开启循环执行用户逻辑。推荐STM32中断向量表详解、HAL库启动文件解析、单片机内存分区原理|注部分内容可能由AI生成新手嵌入式工程师大哥发现有问题还望在评论里面指出非常感谢!

相关新闻

Nyström方法:核矩阵低秩近似的工程落地指南

Nyström方法:核矩阵低秩近似的工程落地指南

1. 这不是“黑箱魔法”,而是核方法落地的关键一环你有没有遇到过这样的场景:手头有个非线性分类问题,用SVM效果不错,但训练时间越来越长,内存占用直线上升,数据量刚过万,服务器就开始告警&#…

2026/10/15 14:37:48 阅读更多 →
ZeroTermux 内置命令手册解读:rexec 远程命令执行完全指南

ZeroTermux 内置命令手册解读:rexec 远程命令执行完全指南

移动开发开发工具 【免费下载链接】ZeroTermux 项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTermux 点击查看 免费下载 导读 rexec 是 BSD r 系列远程管理命令家族的一员,用于在指定的远程 Linux 主机上直接执行命令,是早期 UNI…

2026/10/15 14:36:47 阅读更多 →
SQLite上下文感知搜索:MCP协议与BM25动态加权实战

SQLite上下文感知搜索:MCP协议与BM25动态加权实战

1. “context-mode”不是功能开关,而是上下文感知架构的代号 “context-mode”这个词最近在开发者社区里频繁冒头,但它既不是某个软件里的下拉菜单选项,也不是IDE里一个勾选框就能开启的“高级模式”。我第一次在RuoYi-Vue-Pro的PR评论区看到…

2026/10/15 14:36:47 阅读更多 →

最新新闻

OpenTelemetry Instrumentation for VoyageAI:为 Embedding 与 Rerank 调用接入可观测性

OpenTelemetry Instrumentation for VoyageAI:为 Embedding 与 Rerank 调用接入可观测性

LLMOps可观测性 【免费下载链接】openllmetry Open-source observability for your GenAI or LLM application, based on OpenTelemetry 项目地址: https://gitcode.com/gh_mirrors/op/openllmetry 点击查看 免费下载 这篇技术指南以 openllmetry 仓库中的 opentel…

2026/10/15 15:19:02 阅读更多 →
高校实训Day1:从环境初始化到最小可行闭环的工程启蒙

高校实训Day1:从环境初始化到最小可行闭环的工程启蒙

1. 项目概述:一场面向真实工程场景的入门实战“山东大学实训 Day1”这个标题看似简单,但背后承载的是高校工科教育中最具实操张力的一环——从理论课堂到工程现场的首次跨步。我带过不下二十期校企联合实训项目,几乎每届学生在第一天都会经历…

2026/10/15 15:19:02 阅读更多 →
Java养老院管理系统开发实践与技术解析

Java养老院管理系统开发实践与技术解析

1. 项目概述:养老院管理系统的核心价值养老院管理系统是针对养老机构日常运营需求开发的专业化信息管理平台。这个基于Java技术栈的系统整合了养老院从入住管理到日常护理的全流程业务,解决了传统纸质记录效率低下、信息孤岛严重、数据统计分析困难等行业…

2026/10/15 15:19:02 阅读更多 →
MCP协议安全解析:AI模块化连接的风险与防御

MCP协议安全解析:AI模块化连接的风险与防御

1. 项目概述:当AI生态遇上"万能接口"隐患去年参与某金融AI系统对接时,我第一次见识到MCP协议的威力——只需简单配置,三个不同厂商的AI模块就像乐高积木一样咔嗒对接成功。但庆祝酒会还没结束,安全团队就发来了警报&…

2026/10/15 15:19:02 阅读更多 →
VC++与OpenGL加载3ds模型:从chunk解析到场景漫游全攻略

VC++与OpenGL加载3ds模型:从chunk解析到场景漫游全攻略

简介:VC结合OpenGL与lib3ds库实现3ds模型导入、渲染及交互式漫游的完整工程源码,面向具备C基础、希望深入图形编程与三维模型处理的开发者。工程共102个文件,压缩包1.73MB,涵盖24个C/C头文件、20个C源文件、18个C源文件&#xff0…

2026/10/15 15:19:02 阅读更多 →
非负矩阵分解NMF详解:MATLAB手写代码与调参实践

非负矩阵分解NMF详解:MATLAB手写代码与调参实践

简介:这份非负矩阵分解MATLAB代码包较为完整地涵盖了基础NMF及常见扩展与优化实现,适合机器学习、图像处理、文本挖掘和生物信息学方向的研究者、学生及工程人员使用。包内围绕VWH的分解目标,提供了乘法更新、交替最小二乘等主流优化算法实现…

2026/10/15 15:18:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →