【STM32】启动流程分析补充

单片机的上电启动流程 单片机上电后一直到准备好C语言运行环境并跳转到main函数执行总共经历了5个步骤:1.内核初始化;2.强制PC指针指向中断向量表的复位中断向量执行复位中断函数;3.在复位中断函数中调用 SystemInit 函数,初始化时钟,配置中断向量表等4.调用 __main 函数完成全局/静态变量的初始化和重定位工作,初始化堆栈和库函数5.跳转到main函数中执行。 阅读详情

在面试的时候,我遇到一个提问,单片机上电之后都做了些什么?

那么STM32上电之后都做了些啥呐?
可以配合起来看: 单片机启动文件分析

三种启动模式

简而言之就是根据启动模式决定0x0000 0000重映射到下图哪个地址,那么当单片机开始执行的时候就从哪里开始执行(还是从0x0000 0000开始,只不过这个时候的0x0000 0000代表的实际位置是以下几个之一了。)
在这里插入图片描述
三种启动模式:
下好程序后,根据重启芯片时,SYSCLK的第4个上升沿,BOOT引脚被锁存的值,确定启动模式。

1.从主闪存存储器启动,将主Flash地址0x08000000重映射到0x00000000,这样代码启动之后就相当于从0x08000000开始。主闪存存储器是STM32内置的Flash,作为芯片内置的Flash,是正常的工作模式。一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序,这是最常用的启动方式。

2.从系统存储器启动。首先控制BOOT0、BOOT1管脚,复位后,STM32与上述两种方式类似,从系统存储器地址0x1FFF F000开始执行代码。系统存储器是芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。启动的程序功能由厂家设置。系统存储器存储的其实就是STM32自带的bootloader代码。也是ISP烧录,串口下载程序的启动方式。

3.从内置SRAM启动,将SRAM地址0x20000000映射到0x00000000,这样代码启动之后就相当于从0x20000000开始。内置SRAM,也就是STM32的内存,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码,用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。

重映射

这部分呢见链接: 存储映射_重映射
举个例子,简单来说就是,在arm中访问一个地址是通过地址解释器进行的,0x0000 0000重映射到0x0800 0000,那么在重映射之后,访问0x0000 0000实际上是访问0x0800 0000.
不知道我这么理解是否有错,欢迎指正。

【不是问题的问题】: 为什么STM32的Flash地址要设置到0x08000000

从0x0000 0000开始

简述启动过程以及启动过程中ZI RW RO处理

以主Flash为目的的重映射之后,STM32F407ZGT6的启动过程,采用Cortex-M4、Cortex-M3内核的芯片基本都是这个过程:
1.(标号1)上电后首先从0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表。
2.然后在运行用户代码之前会在(标号2)处有一段引导代码负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区域全部清零(标号4)。
3.之后才正式开始运行用户代码(标号5)。
在这里插入图片描述

从0x8000 0000开始,直到用户main()

一般而言,系统上电后第一个执行的是由汇编所编写的启动文件,这部分与上图都是从0x8000 0000开始,直到用户main(),但是侧重点不同。

总的来说是这么一个流程:

  (1)、初始化堆栈指针SP=_initial_sp
  (2)、初始化PC指针,令其=Reset_Handler
  (3)、初始化中断向量表 Reset_Handler处于中断向量表第二位
  (4)、配置系统时钟 由Reset_Handler中的systeminit函数处理
  (5)、调用C库函数_main初始化用户堆栈,从而最终调用main函数进入C的世界

在这里插入图片描述

1. 取栈顶地址存入MSP

1.从0x0800 0000读取栈顶地址,并将该地址存入MSP中。
我的理解是,栈顶地址是程序运行的上界,栈顶地址的值为0x2000 xxxx,工程所生成bin文件的前两个字节即为栈顶地址。从0x2000 0000到0x2000 xxxx即为程序所运行的范围,该段内存分布为:RW段、ZI段:其中RW段为可读写的非0数据段,ZI段包括了0数据段、堆区、栈区。
这边可以看一下:stm32堆栈的认知
在这里插入图片描述

2. 跳转至复位中断(Reset_Handler(void))

从0x0800 0004读取中断向量表的首地址(即复位中断入口地址),装入PC程序计数器,跳转执行

3. 系统时钟设置(在复位中断程序内被调用)

这篇帖讲的很详细: STM32启动过程解读与跟踪验证

这里摘取了一些主要内容
在这里插入图片描述
在这里插入图片描述
指令 LDR R0,=SystemInit 将函数SystemInit的入口地址传给R0,从反汇编窗口可以看到指令被写成LDR r0,[pc,#36],表明SystemInit的入口地址在存放在PC指针偏移36处,即0x08000420(+0x4)+0x24=0x08000448(因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4《Cortex™-M3权威指南》)

下一条指令在0x08000422处,BLX R0 将R0的值传给PC(必须保证加载到PC的数值是奇数(即LSB=1),传给PC后,PC的LSB读回0),调用SystemInit函数。这个函数里面开启了外部晶振,设置了PLL,除能了所有中断,设置了时钟为32MHz,并且重定位中断向量表在0x08000000处(这句在Flash启动时可以不需要,因为能从0x00000000映射到0x08000000)。

从该函数返回后,用同样的方式调用C/C++标准实时库的__main函数,进行了一些处理(如用户堆栈初始化等,具体可以跟踪汇编代码,这部分网上已有过分析,不再赘述)后,调用main函数,进入C语言环境。

最详细STM32 启动流程 这三种启动模式为STM32芯片提供了灵活性和可靠性,使其适用于各种不同的应用场景。开发人员可以根据实际需求选择合适的启动模式来确保系统的正常运行和维护。STM32的启动流程比较简单,从这个流程可以学习通用的的ARM系统的启动模式。这段启动代码实现了STM32的启动流程,一、STM32三种启动方式。二、常规启动模式分析。 阅读详情

相关推荐

[东拼西凑]STM32单片机启动流程及RAM和Flash的配置关系和堆栈溢出现象

开头的话: 之前一直用现成的LED工程demo,改改就上,也没细究。直到做MQTT移植的时候,发现malloc始终出错,开始找问题,于是写下本文。(前前后后摘抄、参考、改进本文,侵删) 一、STM32上电启动 BOOT1 BOOT0 启动方式 X 0 从STM32内置flash启动,JTAG或者SWD固化程序位置 1 1 从STM32内置SRAM启动,由于SRAM没有程序存储能...

江东风又起 1万+

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

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

sudoeast的博客 8791

STM32启动流程详解(超全,startup_stm32xx.s分析)

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

9543

mcu 启动流程

2、复位中断服务程序执行的最终结果是跳转至C程序的main函数,如上图中标号2️⃣所示,而main函数应该是一个死循环,是一个永不返回的函数。stm32内部闪存的起始地址为0x8000000,程序从此处写入,中断向量表位于该位置,首先从0x8000000取出MSP的栈顶指针(设置堆栈),然后从中断向量表中取出复位中断向量,并执行复位中断程序来完成启动。建立中断向量表:中断向量表作为中断源的识别标志,可以形成相应的中断入口地址,或者中断服务程序的入口地址的偏移量和段基值。

weixin_42734533的博客 1万+

STM32启动过程分析

1. 程序和数据在Flash和SRAM上的存储结构 在讲解 STM32 启动过程之前,我们先来了解一下 STM32 的程序和数据在 Flash 和 SRAM 上到底是如何存储的,因为有了这方面的知识之后,非常有助于我们理解 STM32 启动过程中还做了哪些隐藏的工作。关于详细的程序和数据存储分布信息,我们可以从Keil生成的 .map 文件中得到,要生成 .map 文件操作如下: 1.1 STM32的程序在flash上的存储结构 STM32 的程序在 Flash 上的存储结构如下图所示: 栈顶指针 M

luobeihai的博客 7789

【STM32】STM32启动流程分析

然后,微控制器会读取 0x00000004 位置的数据,这是复位向量的地址,它会指向复位处理程序(如 Reset_Handler)的入口。后面带有弱符号[WEAK]的中断服务函数意味着如果没有定义其他强符号的处理程序,链接器会使用默认的处理程序(通常是一个空的处理程序,可能会进入无限循环,等待恢复或其他动作)。在keil的项目中经常会看到.s的文件就是启动文件,启动文件的作用通常包括设置中断向量表、初始化堆栈、清除未初始化的数据、调用系统初始化函数、以及最后跳转到 main() 函数执行应用程序代码。

qq_69923281的博客 3159

STM32的完整启动流程分析

关于STM32的启动流程,网上有的资料在讨论几种boot模式,有的在回答启动文件的内容,在查阅了很多资料后,本文给出一个比较全面的总结和回答。 1. 根据boot引脚决定三种启动模式 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式: 从主Flash启动。主Flash指的是STM32的内

Setul 2万+

STM32的启动过程分析

STM32的启动过程分析

wheat_in_winner的博客 1万+

STM32单片机启动流程分析

  作为一个单片机相关的开发人员,大家应该都很清楚单片机是从main函数开始执行代码的,但是很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。那么单片机又是如何找到咱们所写的main函数的呢,大家应该在各种单片机开发过程中都会了解到一个启动文件的东西。没错,单片机正式通过启动文件来找到咱们的main函数的。接下来咱们就来看一下STM32单片机是如何启动的。

qq_44971108的博客 5640

STM32的启动流程

MDK 编译工程,会生成一些中间文件(如.o、 .axf、 .map 等),最终生成 hex 文件,以便下载到 MCU 上面执行,共 11 个类型,分别是: .axf、 .crf、 .d、 .dep、.hex、 .lnp、 .lst、 .o、 .htm、 bulild_log.htm 和.map。文件看着不是很多,但是随着工程的增大,这些文件也会越来越多,大项目编译一次,可以生成几百甚至上千个这种文件,不过文件类型基本就是上面这些。

weixin_52849254的博客 2553

嵌入式开发八:STM32启动过程分析

使用一个STM32芯片,对于内存而言有两个直观的指标就是 RAM 大小,FLASH大小,那么着两个大小意味着什么?怎么去理解这两个内存,那就得从什么是Flash,什么是RAM说起。⾸先,对于嵌入式开发,⼀般使⽤的是C语言开发。⽽我们知道C语言都是从main函数开始 的,因此,对于处理器来说它是如何找到并执行main函数的,就需要用到启动文件,就是各种 startup_xxx.s文件。对于我们STM32f407来说其启动⽂件为:startup_stm32f40_41xx.s。

weixin_47040031的博客 2184

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万+

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 490

STM32的启动流程分析 和 一些底层控制的原理

阅读引言: 阅读本文之后, 你将对单片机, 甚至是嵌入式系统, 或者是传统的PC机系统的启动流程有一个大致的了解, 本文更加偏向于单片机的启动流程分析。一、基础知识。

m0_74976404的博客 3403

【外挂编程】外挂编程技术揭秘(二)

引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握。我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧。话不多说了,让我们开始吧。 文章中代码github地址: https://github.com/Diamonds-ZhaoYu/hz_example 环境要求: 系统:Windows 语言...

c-rain 4032

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 251

STM32 芯片启动过程

下面主要讲解从上电复位到 main 函数的过程。初始化中断向量表配置系统时钟调用 C 库函数_main初始化用户堆栈,然后进入main函数至此,启动过程圆满结束!

Projectsauron 的博客 3万+

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4702

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

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

无际单片机编程 2279

innovus:set_clock_latency与insertion_delay

当1ns clock latency设置在capture上,在report_timing报告中体现在other end arrival time以及capture clock path的Arrival Time上。因为-1ns的insertion delay存在,所以skew group报告中显示的Arrival (ns)是减1ns的结果,即1.819-1=0.819 ns。CTS阶段create_ccopt_clock_tree_spec之后,spec中会产生对应的insertion_delay命令。

m0_61544122的博客 1618

【归因】MATLAB实现最佳指纹法(待更新)

简述用于归因分析的最佳指纹法,及其MATLAB实现。

WW、forever的博客 4284

STM32 程序启动全流程解析

STM32是一款广泛使用的嵌入式微控制器系列,具有强大的性能和丰富的外设。在启动编写STM32程序时,通常包括以下步骤,本文对这些步骤实现的功能做了详细的分析,便于了解MCU的启动工作机制。

mftang的博客 3665

地平线旭日X5开发板--搭建ROS1环境开发

由于RDK X5是基于Ubuntu22.04 进行版本释放,而ROS1只兼容到了20.04,为了更很好的做以前ROS1相关代码方案的快速迁移,提供了使用docker 的ros环境,进而使用ros1的方案。

bingdund的博客 1019

STM32启动流程解析:从BootROM到BootLoader

本文解析了STM32启动流程中的BootROM与BootLoader机制。BootROM是芯片出厂固化的只读代码,负责基础硬件初始化和启动模式选择;BootLoader则是可编程的软件层,提供高级初始化和固件更新功能。文章对比了两者的区别,指出BootROM位于芯片内核不可修改,而BootLoader存储在可擦写存储器中可高度定制。同时解释了为什么BootROM在地址映射中不可见的原因,并提供了相关参考资源。全文系统梳理了嵌入式系统的启动层次架构,对理解MCU启动过程具有参考价值。

C语言、数据结构、单片机、嵌入式实时操作系统、C++ 学习路径记录 2798

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 【STM32】单片机启动文件分析 01
下一篇: 【Python】字典dict 基础用法
熟练的魔法师
博客等级 码龄8年 2714粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值