首页/文章/ 详情

STM32的完整启动流程

5小时前浏览16
关于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.csdn.net/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有所区别,其目的是为了能接受外部镜像进行烧录,而不是为了运行普通用户程序。

声明:


 
声明:文章来源网络。本号对所有原创、转载文章的陈述与观点均保持中立,推送文章仅供读者学习和交流。文章、图片等版权归原作者享有,如有侵权,联系删除。  


来源:硬件笔记本
ACTSystem电路通用电子UG芯片通信控制SCL
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-11-11
最近编辑:5小时前
硬件笔记本
本科 一点一滴,厚积薄发。
获赞 156粉丝 45文章 526课程 0
点赞
收藏
作者推荐

0欧电阻、电感、磁珠单点接地时有什么区别?看完这篇终于有答案了~

一、0欧姆电阻 重点介绍:模拟地和数字地单点接地只要是地,最终都要接到一起,然后入大地。如果不接在一起就是“浮地”,存在压差,容易积累电荷,造成静电。地是参考0电位,所有电压都是参考地得出的,地的标准要一致,故各种地应短接在一起。人们认为大地能够吸收所有电荷,始终维持稳定,是最终的地参考点。虽然有些板子没有接大地,但发电厂是接大地的,板子上的电源最终还是会返回发电厂入地。如果把模拟地和数字地大面积直接相连,会导致互相干扰。不短接又不妥,理由如上有四种方法解决此问题: ① 用磁珠连接;  ② 用电容连接;  ③ 用电感连接;  ④ 用0欧姆电阻连接。 区别: ① 磁珠的等效电路相当于带阻限波器,只对某个频点的噪声有显著抑制作用,使用时需要预先估计噪点频率,以便选用适当型号。对于频率不确定或无法预知的情况,磁珠不合。  ② 电容隔直通交,造成浮地。   ③ 电感体积大,杂散参数多,不稳定。 ④ 0欧电阻相当于很窄的电流通路,能够有效地限制环路电流,使噪声得到抑制。电阻在所有频带上都有衰减作用(0欧电阻也有阻抗),这点比磁珠强。 0欧姆电阻的其它作用 ① 在电路中没有任何功能,只是在PCB上为了调试方便或兼容设计等原因。   ② 可以做跳线用,如果某段线路不用,直接不贴该电阻即可(不影响外观)。 ③ 在匹配电路参数不确定的时候,以0欧姆代替,实际调试的时候,确定参数,再以具体数值的元件代替。   ④ 测某部分电路的耗电流的时候,可以去掉0ohm电阻,接上电流表,这样方便测耗电流。   ⑤ 布线时,如果实在布不过去了,也可以加一个0欧的电阻    ⑥ 在高频信号下,充当电感或电容用(与外部电路特性有关),主要是解决EMC问题。如地与地,电源和IC Pin间    ⑦ 单点接地(指保护接地、工作接地、直流接地在设备上相互分开,各自成为独立系统。)    ⑧ 熔丝作用    ⑨ 跨接时用于电流回路 当分割电地平面后,造成信号最短回流路径断裂,此时,信号回路不得不绕道,形成很大的环路面积,电场和磁场的影响就变强了,容易干扰/被 干扰。在分割区上跨接0欧电阻,可以提供较短的回流路径,减小干扰。 ⑩ 配置电路    一般,产品上不要出现跳线和拨码开关。有时用户会乱动设置,易引起误会,为了减少维护费用,应用0欧电阻代替跳线等焊在板子上。空置跳线在高频时相当于天线,用贴片电阻效果好。   ⑾ 其他用途    布线时跨线、调试/测试用、临时取代其他贴片器件、作为温度补偿器件,更多时候是出于EMC对策的需要。另外,0欧姆电阻比过孔的寄生电感小,而且过孔还会影响地平面(因为要挖孔),还有就是不同尺寸0欧电阻允许通过电流不同,一般0603的1A,0805 的2A,所以不同电流会选用不同尺寸的。还有就是为磁珠、电感等预留位置时,得根据磁珠、电感的大小还做封装,所以0603、0805等不同尺寸的都有了。 附:1欧姆电阻的作用 1欧姆电阻在电路中经常是用来测试的,比如,需要测一个电路中的电流时,我们可以在该电路中串一个1欧姆电阻,测量其两端的电压即是该电路的电流(I=U/R,因为R=1,所以测出的电压值即是电流值)。 二、磁珠 磁珠专用于抑制信信号线、电源线上的高频噪声和尖峰干扰,还具有吸收静电脉冲的能力。磁珠是用来吸收超高频信号,象一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR,SDRAM,RAMBUS等)都需要在电源输入部分加磁珠,而电感是一种蓄能元件,用在LC振荡电路,中低频的滤波电路等,其应用频率范围很少超过50MHZ。磁珠有很高的电阻率和磁导率,等效于电阻和电感串联,但电阻值和电感值都随频率变化。磁珠的功能:主要是消除存在于传输线结构(电路)中的RF噪声,RF能量是叠加在直流传输电平上的交流正弦波成分,直流成分是需要的有用信号,而射频RF能量却是无用的电磁干扰沿着线路传输和辐射(EMI)。要消除这些不需要的信号能量,使用片式磁珠扮演高频电阻的角色(衰减器),该器件允许直流信号通过,而滤除交流信号。通常高频信号为30MHz以上,然而,低频信号也会受到片式磁珠的影响。磁珠有很高的电阻率和磁导率,它等效于电阻和电感串联,但电阻值和电感值都随频率变化。它比普通的电感有更好的高频滤波特性,在高频时呈现阻性,所以能在相当宽的频率范围内保持较高的阻抗,从而提高调频滤波效果。作为电源滤波,可以使用电感。磁珠的电路符号就是电感但是型号上可以看出使用的是磁珠在电路功能上,磁珠和电感是原理相同的,只是频率特性不同罢了。注:磁珠的单位是欧姆,而不是亨利,这一点要特别注意。因为磁珠的单位是按照它在某一频率 产生的阻抗来标称的,阻抗的单位也是欧姆。三、电感 电感是闭合回路的一种属性。当线圈通过电流后,在线圈中形成磁场感应,感应磁场又会产生感应电流来抵 制通过线圈中的电流。这种电流与线圈的相互作用关系称为电的感抗,也就是电感,单位是“亨利(H)”。磁珠和电感的区别 电感是储能元件,而磁珠是能量转换(消耗)器件。电感多用于电源滤波回路,侧重于抑止传导性干扰;磁珠多用于信号回路,主要用于EMI方面。磁珠用来吸收超高频信号,象一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR,SDRAM,RAMBUS等)都需要在电源输入部分加磁珠,而电感是一种储能元件,用在LC振荡电路、中低频的滤波电路等,其应用频率范围很少超过50MHz。在电路功能上,磁珠和电感是原理相同的,只是频率特性不同罢了。 声明: 声明:文章来源网络。本号对所有原创、转载文章的陈述与观点均保持中立,推送文章仅供读者学习和交流。文章、图片等版权归原作者享有,如有侵权,联系删除。 来源:硬件笔记本

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈