STM32的完整启动流程分析

STM32启动流程详解(超全,startup_stm32xx.s分析) 启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到0x00000000地址位置);真正产生复位信号的时候,CPU还是从开始位置执行。值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。 阅读详情
AI摘要

本文详细解读STM32的启动流程,包括三种Boot模式(Flash、ROM和SRAM)、bootloader的作用、内存初始化过程,以及ISP、IAP和ICP烧录方法的比较。深入剖析启动文件结构和内存管理策略,适合MCU开发者深入理解。

最近又写了一篇补充描述,适合与本文一起查阅。深入理解MCU启动原理
关于STM32的启动流程,网上有的资料在讨论几种boot模式,有的在回答启动文件的内容,在查阅了很多资料后,本文给出一个比较全面的总结和回答。

1. 根据boot引脚决定三种启动模式

在这里插入图片描述

复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式:

  1. 从主Flash启动。主Flash指的是STM32的内置Flash。选择该启动模式后,内置Flash的起始地址将被重映射到0x00000000地址,代码将在该处开始执行。一般我们使用JTAG或者SWD模式下载调试程序时,就是下载到这里面,重启后也直接从这启动。
  2. 从系统存储器启动。系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UART/CAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(In System Programing)代码,这种烧录代码的方式也被称为ISP烧录。关于ISP、ICP和IAP之间的区别将在后续章节中介绍。
  3. 从嵌入式SRAM中启动。显然,该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。

总结:上面的每一种启动方式我都描述了“xxx的起始地址被重映射到了0x00000000地址,从而代码从xxx开始启动”,如下图是STM32F4xx中文参考手册中的图,可以看到类似的表述。同时,在下图中也展示了STM32F4xx中统一编址下,各内存的地址分配,注意一点,即使相应的内存被映射到了0x00000000起始的地址,通过其原来地址依然是可以访问的。
在这里插入图片描述

2. 启动后bootloader做了什么?

根据BOOT引脚确定了启动方式后,处理器进行的第二大步就是开始从0x00000000地址处开始执行代码,而该处存放的代码正是bootloader。
bootloader,也可以叫启动文件,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。同样,STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件。
网上有很多资料分析了STM32的启动文件的内容,在此我只进行简单的表述。启动文件中首先会定义堆栈,定义中断/异常向量表,而其中只实现了复位的异常处理函数Reset_Handler,该函数内容如下(STM32F4XX,IAR编译器),可以看到其主要执行了SystemInit和__iar_program_start两个函数,其主要功能除了初始化时钟,FPU等,还会执行一个重要功能,那就是内存的搬移、初始化操作。 这是我想重点介绍的内容,同时也会回答一个疑问,就是如果从Flash启动的话,代码究竟是运行在哪儿的?在我之前接触ARM9、CortexA系列的时候,一般都是把代码搬到内部的SRAM或者外部DDR中执行的,STM32是如何呢?答案下一小节揭晓。
在这里插入图片描述

3. bootloader中对内存的搬移和初始化

本节针对程序在内置Flash中启动的情况进行分析。

在这里插入图片描述
我们知道烧录的镜像文件中包含只读代码段.text,已初始化数据段.data和未初始化的或者初始化为0的数据段.bss。代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就OK,但是.data段和.bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此bootloader会执行很重要的一步,就是会在RAM中初始化.data和.bss段,搬移或清空相应内存区域。
因此我们知道,当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据则会被拷贝到内部SRAM中,该过程是由bootloader完成的。bootloader在完成这些流程之后,就会将代码交给main函数开始执行用户代码。

  • 现在让我们思考一个问题,PC机在运行程序的时候将程序从外存(硬盘)中,调入到RAM中运行,CPU从RAM中读取程序和数据;而单片机的程序则是固化在Flash中,CPU运行时直接从Flash中读取程序,从RAM中读取数据,那么PC机能从Flash之类的存储介质中直接读代码执行吗?
  • 答案是不行。因为x86构架的CPU是基于冯.诺依曼体系的,即数据和程序存储在一起,而且PC机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。但是单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。

4. ISP、IAP、ICP三种烧录方式

虽然这个小节稍稍偏题,但是由于上面在3中启动方式中介绍过了ISP烧录,因此一并在此介绍剩下的两种烧录方式。
本小节摘自 https://blog.youkuaiyun.com/zhuimeng_ruili/article/details/119709888。

  1. ICP(In Circuit Programing)。在电路编程,可通过CPU的Debug Access Port 烧录代码,比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group);
  2. ISP(In System Programing)。在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码。
  3. IAP(In Applicating Programing)。在应用编程,由开发者实现Bootloader功能,比如STM32存储映射Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码),开发者可以将自己实现的Bootloader存放到Flash区间,MCU上电启动先执行用户的Bootloader代码,该代码可为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现OTA空中升级功能。
  4. IAP和ISP 的区别。
    a、ISP程序一般是芯片厂家提供的。IAP一般是用户自己编写的
    b、ISP一般支持的烧录方式有限,只有串口等。IAP就比较灵活,可以灵活的使用各种通信协议烧录
    c、isp一般需要芯片进行一些硬件上的操作才行,IAP全部工作由程序完成,不需要去现场
    d、isp一般只需要按格式将升级文件通过串口发送就可以。IAP的话控制相对麻烦,如果是OTA的话还需要编写后台的。
    e、注意,这里介绍的bootloader功能显然跟之前介绍的启动文件bootloader有所区别,其目的是为了能接受外部镜像进行烧录,而不是为了运行普通用户程序。

5. 参考资料

  1. STM32 BOOT模式配置以及作用: https://www.cnblogs.com/huanzxj/p/6273014.html
  2. 高手带你分析STM32 的启动过程: https://blog.youkuaiyun.com/zhuimeng_ruili/article/details/108789033
  3. [原创]在main()之前,IAR都做了啥?https://www.cnblogs.com/mssql/archive/2011/01/29/tt146.html
  4. STM32启动过程启动文件分析:https://www.sohu.com/a/77623300_119709
  5. STM32中的程序在RAM还是FLASH里运行?https://blog.youkuaiyun.com/u012252959/article/details/80800559
最详细STM32 启动流程 这三种启动模式为STM32芯片提供了灵活性和可靠性,使其适用于各种不同的应用场景。开发人员可以根据实际需求选择合适的启动模式来确保系统的正常运行和维护。STM32的启动流程比较简单,从这个流程可以学习通用的的ARM系统的启动模式。这段启动代码实现了STM32的启动流程,一、STM32三种启动方式。二、常规启动模式分析。 阅读详情

相关推荐

STM32的启动流程

本文主要介绍,STM32从 CPU 上电复位执行第 1 条指令开始(汇编文件)到进入 C 程序 main()函数入口之间的那个部分。

qq_45570844的博客 7113

【32单片机学习】(11)STM32启动过程详解

以stm32f1x系列单片机为参照,经过查阅官方手册和对代码进行单步调试,详细地叙述了STM32上电启动的具体过程。对于关键性的知识都指明了出处。

sudoeast的博客 8790

STM32的完整启动流程分析-----在外存flash中运行代码

我用#优快云#这个app发现了有技术含量的博客,小伙伴们求同去《STM32的完整启动流程分析》, 一起来围观吧 https://blog.youkuaiyun.com/Setul/article/details/121685929?utm_source=app&app_version=4.20.0&code=app_1562916241&uLinkId=usr1mkqgl919blen ...

dianqicyuyan的博客 6980

STM32启动流程详解

STM32的启动流程大致可分为以下几步: 1、设置堆栈 2、跳转到Reset_Handler 3、Reset_Handler调用SystemInit完成时钟、中断向量偏移的初始化工作,然后跳转到__main,__main函数会完成RW、ZI数据段的重定位工作,即将ROM中的RW数据拷贝到RAM中,将ZI段清零,然后跳转到_rt_entry进行Stack和Heap的初始化。 4、跳转到真正的main函数。 ST官方给我们提供了启动文件,我们可以通过启动文件来详细地分析STM32的启动流程。

Dokin 1万+

深入理解STM32运行原理:从上电到主程序执行的完整过程

STM32基于ARM Cortex-M内核,采用哈佛架构,具有独立的指令总线和数据总线。Cortex-M3内核:32位RISC处理器,最高72MHz主频内存架构:Flash存储程序代码,SRAM存储运行时数据总线矩阵:AHB、APB1、APB2等多级总线架构中断控制器:NVIC(嵌套向量中断控制器)本文深入剖析了STM32的运行原理,从上电复位到程序执行的完整流程。启动过程:向量表、复位处理、系统初始化内存管理:栈、堆、全局变量的管理中断系统:NVIC配置、中断响应机制时钟配置。

电脑管家 1918

STM32MP257 eMMC启动无限重启之IAC exception 128定位与恢复

嵌入式系统启动过程中,安全隔离机制是保障系统稳定运行的关键。当处理器访问了未被授权的内存或外设区域时,硬件会触发非法访问异常,导致系统陷入无限重启循环。本文以STM32MP257平台为背景,深入解析eMMC启动路径下RIF(资源隔离框架)如何拦截非法访问并上报IAC异常,同时对比DFU与eMMC两种启动方式的本质差异,解释为何烧录成功却无法正常引导。针对调试中常见的fastboot设备无法枚举问题,从U-Boot配置、USB权限、系统驱动等多个维度给出详细排查思路,并展示一套完整的重刷与恢复流程,帮助开发者

weixin_33968104的博客 550

简单讲解一下STM32的启动过程

前几段声明了__Vectors(向量起始地址)、__Vectors_End (向量结束地址)和 __Vectors_Size (向量大小)三个标号具有全局性(EXPORT),可被外部的文件使用。61行注释说了这一个是,栈顶指针,这里如果是在内部FLASH运行,就是0x08000000。DCD表示以四字节对齐分配内存,那么下个地址是 0x0800 0004,存放的是中断函数入口地址。这里也说明函数其实就是一个地址。这里截图不完整,在ST公司的参考手册9.1.2中断和异常向量中有完整的向量表。

p18440的博客 2859

STM32启动流程详解:从复位到main函数完整拆解

在嵌入式开发中,MCU的启动过程是底层机制的核心,也是面试与工程实践中反复涉及的高频知识点。ARM Cortex-M内核在复位后,会从固定地址获取初始栈指针与复位向量,并通过BOOT引脚配置选择从Flash、系统存储器或SRAM的启动模式。随后,启动文件中的Reset_Handler负责调用SystemInit完成时钟初始化,再经由__main建立C运行环境,最终进入用户main函数。理解这一过程,不仅能帮助开发者定位程序跑飞、进不了main、IAP跳转失败等实际问题,还能更深入地掌握中断向量表、链接脚本、

weixin_34226706的博客 420

最通俗易懂的STM32完整启动流程分析

它通常是用汇编语言写的,负责在 C 语言环境准备好之前,把硬件初始化搞定。在汇编中,标号的位置由其定义处决定,因此 __initial_sp 的地址是 Stack_Mem 的起始地址加上 Stack_Size,也就是堆栈的最高地址。(栈顶),程序启动时,CPU 会将这个地址加载到 SP 寄存器,作为堆栈的初始指针,随着数据压栈,SP 会从这个地址开始向下(地址减小)移动。,通常位于 Flash 的起始地址(例如 0x08000000),用于存储一些关键信息,包括堆栈顶部,复位函数,中断回调函数的地址。

无际单片机编程 2279

STM32启动流程详解与优化技巧

嵌入式系统中的启动流程是硬件与软件协同工作的关键环节,涉及从复位向量获取到C语言环境初始化的完整过程。以ARM Cortex-M内核为例,启动过程主要包括硬件复位、时钟树初始化、内存段初始化和运行时环境搭建等阶段。在STM32等微控制器中,启动文件(startup文件)负责关键的数据段搬运和BSS段清零操作,确保变量初始状态符合预期。理解启动机制对于优化启动时间、调试启动故障以及实现安全启动等场景具有重要价值。通过分析STM32F103的典型启动流程,可以掌握时钟配置优化、DMA数据搬运等实用技巧,这些方法

weixin_28366475的博客 226

UniApp 与 Taro 深度解析:如何根据项目需求选择最佳跨平台框架?

本文深度对比了UniApp和Taro两大主流跨平台开发框架。UniApp基于Vue生态,提供开箱即用的高效开发体验,尤其适合快速覆盖多端小程序;Taro则根植React范式,架构灵活,便于与现有React生态集成,更适合对性能和原生体验有高要求的复杂项目。文章结合团队技术栈、项目类型及性能需求,为开发者提供了清晰的选型指南。

snow3的博客 204

STM32上电后到底干了啥?从Boot模式到main()函数启动的完整流程拆解(附启动文件分析)

本文详细解析了STM32芯片从上电到main()函数启动的完整流程,包括Boot模式选择、内存映射机制、启动文件分析及C运行环境构建。通过调试实战案例,帮助开发者深入理解STM32启动过程,解决常见的启动问题,并提供了性能优化技巧。

weixin_42568801的博客 163

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传

本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。

weixin_42531588的博客 387

FlipperZero深度剖析:STM32启动流程与固件开发实战

嵌入式系统开发中,理解微控制器上电后的启动流程是掌握底层硬件与固件协作的基础。以STM32为代表的Cortex-M系列芯片,其启动过程遵循从复位向量读取、存储器重映射到执行Reset_Handler、初始化时钟并最终进入main函数的固定链路。这一过程中,向量表、启动文件和链接脚本的配置直接影响系统能否稳定运行。而在复杂产品中,Bootloader与固件签名校验进一步增加了启动链路的层次。FreeRTOS等实时操作系统的引入,则通过任务调度器将裸机顺序执行转变为多任务并发模型,提升了系统的响应能力与可维护性

weixin_29190573的博客 232

RV1126B RV1126B-P 瑞芯微 高性能视觉处理器SoC 芯片

它集成了大量算法加速器,如 HDR、3A、LSC、3DNR、2DNR、锐化、去雾、鱼眼校正、伽马校正、特征点检测等。此外,还配备了一款最多8兆像素的 AI-ISP,作为对传统ISP 的补充,以提供卓越的空间去噪性能和增强的图像增强效果。除了先前的高性能多媒体区块外,RV1126B还包含丰富的音频、内存和其他外围接口,如I2C、SPI、PWM等。借助这-特性,来自相机的视频可以以高分辨率进行编码,并存储在本地内存中,同时还能将另-段较低分辨率的视频传输到云存储。

szhorsway的博客 1855

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载)

本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。

weixin_29223603的博客 387

【STM32】STM32启动流程-从启动文件分析

栈的作用是用于局部变量,函数调用,函数形参等的开销,STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。第35行:表示开辟栈的大小为 0X00000400(1KB),EQU是伪指令,相当于C 中的 define。第37行:开辟一段可读可写数据空间,ARER 伪指令表示下面将开始定义一个代码段或者数据段。此处是定义数据段。ARER 后面的关键字表示这个段的属性。段名为STACK,可以任意命名;NOINIT 表示不初始化;

qq_38089448的博客 1168

【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?

如何查看 WPS 的输入静态地理数据(二进制格式)?

WW、forever的博客 632

STM32平台下wl_arm启动流程深度剖析

深入解析wl_arm架构在STM32平台的启动机制,涵盖启动文件、内存布局与初始化过程。通过对wl_arm特性的精准把握,揭示从复位向量到C环境建立的关键步骤,为嵌入式开发提供坚实基础。

weixin_32535825的博客 981

无刷电机FOC硬件电路设计

本文先对MIT无刷电机FOC硬件电路分析做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章软件程序在我另外一个博客【嵌入式–伺服电机】MIT无刷电机FOC驱动程序分析。

qq_35635374的博客 574

PICO640红外探测器配置模块verilog

Ulis pico 640红外探测器配置模块

Go Forward Forever! 2031

【正点原子STM32MP157 启动篇】(3) STM32MP1 二进制头部信息+Linux 系统启动过程

本章节介绍了STM32MP1 二进制头部信息+Linux 系统启动过程。

qq_54050349的博客 1323

用 SAP CDS View 和 Fiori Elements 快速打造 CRM Service Order 应用──十分钟跑通从数据模型到上线的全流程

通过CDS 视图 + Fiori Elements的组合,我们得以在极短时间内把传统 CRM Service Order 场景迁移到现代化的 Fiori 界面,而且代码量极小、可维护性高。若后续需要离线能力,可考虑将同一 OData 服务暴露给 Mobile Services,再配合 MDK 或 UI5 Mobile Toolkit;若要支持复杂审批流,则可以在同一 Launchpad 内嵌入 Process Visibility Dashboard,实现端到端可视化。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 388

CPU不认识main():STM32启动流程深度解析

在嵌入式系统中,程序执行并非始于高级语言的main函数,而是由CPU硬件复位机制触发——它只识别向量表、栈指针和机器指令。这一底层原理决定了所有C运行时初始化(如.data复制、.bss清零、SystemInit调用)必须在main执行前完成。理解该机制对解决HardFault、启动失败、变量未初始化等典型问题至关重要。尤其在WeAct STM32F411等国产开发板上,Boot引脚配置、向量表重映射、DFU Bootloader占用及链接脚本与启动文件的耦合关系,进一步放大了启动阶段的脆弱性。本文聚焦裸机

weixin_42620340的博客 128

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32项目实战篇: 麦克纳姆轮小车系统完整执行逻辑分析报告(函数执行流程分析,逻辑框图绘制,完整过程梳理)

主控芯片实时操作系统:FreeRTOS控制频率:100Hz (10ms控制周期)小车类型:麦克纳姆轮四轮独立驱动实时性强:100Hz控制频率,10ms响应时间精度高:增量式PI控制,编码器闭环反馈稳定性好:多重安全检查,异常保护机制扩展性强:模块化设计,支持多种控制方式。

Naiva的博客 1623

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深入剖析STM32启动流程:从Flash到SRAM的代码执行之旅

本文深入解析STM32启动流程,从Flash到SRAM的代码执行机制。详细介绍了启动模式选择、启动文件配置、代码搬运技巧及内存初始化等关键环节,并分享实际项目中的性能优化经验,帮助开发者更好地理解和优化STM32的启动过程。

weixin_29190573的博客 235

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: STM32 HAL库IIC驱动
下一篇: 为什么CPU需要不同的特权等级?
隋边边
博客等级 码龄11年 304粉丝 91原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值