0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分析STM32的三种上电启动过程

汽车玩家 来源: HACK实验室 作者: HACK实验室 2020-05-03 18:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上一篇文章我写了STM32RAM和Flash,文章最后我建议大家来深入研究一下STM32上电启动过程。同时有小伙伴留言说想让我讲一下IAP(在线升级程序)。其实如果搞懂STM32的上电启动过程,那么IAP就可以信手拈来了。下面我们一起来研究研究。

先说启动文件

我们正常在操作一款单片机的时候,都是从main函数开始进行编程的,但是单片机上电是从main函数开始执行的吗?答案当然是否定的,在main函数之前单片机最先执行的是硬件设置SP、PC然后是“启动文件”,一般主要是项目文件里面的startup_xxxxx.s文件。其实这个就是我们常说的Bootloader。

其实不光STM32系列单片机是这样,我们接触的NXP微控制器TIMSP430以及51单片机等等其实都是有上述的启动文件的。启动文件负责的就是从单片机复位开始到main函数之前这段时间所需要进行的工作。我们一般很少接触启动文件的主要原因是开发环境往往给开发者自动的提供了这个启动文件,不需要我们再去操心,直接从main函数开始进行设计就可以了。

STM32三种启动方式

接触过STM32系列单片机的朋友应该知道STM32有三种启动模式,用户可以通过设置BOOT0和BOOT1的引脚电平状态,来选择复位后的启动模式。

需要注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。

1)从Flash启动,将Flash地址0x08000000映射到0x00000000,这样启动以后就相当于从0x08000000开始的,这是我们最常用的模式;

2)从SRAM启动,将SRAM地址0x20000000映射到0x00000000,这样启动以后就相当于从0x20000000开始的,用于调试,笔者基本没用过;

3)从系统存储器启动(可以看上篇文章里的内存映射图,System memory),将系统存储器地址0x1FFFF000映射到0x00000000,这样启动以后就相当于从0x1FFFF000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,这其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,下载完以后再切换到从Flash中启动就可以正常运行了。打个比方这个官方的Bootloader就相当于我们玩路由器时的“不死breed”。笔者之前在调STM32低功耗的时候将下载口给复用了其他功能导致“变砖”,就是通过这种方式恢复的

分析STM32的三种上电启动过程

切回正题

下面我们来具体看一下从用户的Flash启动STM32,从上电到main函数之间的这段时间都做了什么。

1)第一步是硬件设置SP、PC

我们参考《Cortex-M3权威指南》向量表章节表7.6,如下图所示:

分析STM32的三种上电启动过程

前两段地址主要是用来指定SP和PC的初值,上一节我们已经知道了映射关系,所以这时已自动从0x08000000位置处读取数据赋值给了栈指针SP,从0x08000004位置处读取数据赋值给了PC。需要注意的是这个复位向量初始值并不是固定的,可以通过一个叫“向量表偏移量寄存器”来修改定位。

分析STM32的三种上电启动过程

下图是我们那个开源OLED时钟项目的HEX文件,用J-Flash打开就可以看到设置完的SP=0x20005B88,PC=0x0800282D。

分析STM32的三种上电启动过程

2)第二步是设置系统时钟

我们接着来追踪系统的运行轨迹,上面我们已经知道了PC的地址为0x0800282D,但是这没有遵循4字节对齐,我们将其对齐为0x0800282C,这时我们打开项目文件里面的.map文件,找到这个地址,如下图示:

分析STM32的三种上电启动过程

我们发现来到了第一节说的startup_xxxxx.s文件,我们打开startup文件找到:

分析STM32的三种上电启动过程

我们发现运行到了SystemInit,C的世界我们就不陌生了,在项目文件的system_stm32f10x.c里面可以找到SystemInit函数,也就是初始化系统时钟了。

3)第三步是___main

到这里大家可能会以为已经到了main函数了,其实不是这样的。___main和main是不一样的,我们寻找这个___main会发现找不到,startup文件里面没有,map文件里面也没有。其实它是在MDK自带的库里面了,主要的功能是软件设置SP、加载.data.bss并初始化栈区。由于需要在线跟踪才能看到,我在这里就不给大家列出来了,感兴趣的朋友可以深入研究一下。

4)最后来到C的世界

在执行到___main的最后就跳转到了C文件的main函数了。

最后用一张图来整体看一下流程:

分析STM32的三种上电启动过程

总 结

到这里STM32的存储器以及上电启动过程就完整的总结完了,希望对大家有所帮助,大家如果感兴趣可以在调试STM32的时候一步一步的来跟踪一下看看,每一款单片机的启动文件其实都是很值得玩味的,对我们系统的来体会控制器的架构、指令集、中断向量等内容是很有帮助的。大家如果将启动过程了解清楚了对我们后面来进行IAP等有意思的操作是很有帮助的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2313

    文章

    11195

    浏览量

    374694
  • IAP
    IAP
    +关注

    关注

    2

    文章

    169

    浏览量

    26184
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Xilinx A7 FPGA的启动时间分析

    在测试板卡时,发现FPGA板卡启动后,从flash读取配置信息的时间大约需要5、6秒的时间,这个时间个人感觉有点长了。
    的头像 发表于 03-31 11:13 288次阅读
    Xilinx A7 FPGA的<b class='flag-5'>上</b><b class='flag-5'>电</b><b class='flag-5'>启动</b>时间<b class='flag-5'>分析</b>

    变频器起动过程曲线参数怎么设置

    变频器起动过程曲线参数的设置是工业自动化控制中的关键技术环节,直接影响电机启动性能、设备寿命及能耗效率。以下是基于工程实践和理论分析的详细设置指南: 一、基础参数理解 1. 加速时间
    的头像 发表于 01-23 12:03 482次阅读
    变频器起<b class='flag-5'>动过程</b>曲线参数怎么设置

    C语言中实现函数宏的三种方式

    ) 和 ({})。下文将一一对三种方式进行分析,比较各自的优劣点。 2. {} 方式 INT_SWAP 宏使用 {} 封装后形态如下: #define INT_SWAP(a,b) { int tmp = a
    发表于 12-29 07:34

    请问CW32芯片的三种工作模式是什么?

    CW32芯片的三种工作模式是什么?
    发表于 12-26 06:48

    CW32系统发启动过程

    CW32支持 2 不同的启动模式,通过 BOOT 引脚状态进行选择,启动模式选择电路只在芯片解复位时刻采样 BOOT 引脚状态,因此在芯片解复位前用户必须根据需要设置好BOOT 引脚的电平状态,以
    发表于 12-15 07:54

    CW32时钟的启动过程

    CW32F030 的时钟源启动过程类似,当设置 SYSCTRL_CR1.HSEEN 为 1 后,HSE 时钟振荡电路开始工作,但此时输出的时钟信号振幅很小。经过启动时间阶段后,输出时钟信号的振幅
    发表于 11-13 07:49

    三种SPWM波形生成算法的分析与实现

    摘要:变频技术作为现代电力电子的核心技术,集现代电子、信息和智能技术于一体。而SPW(正弦波脉宽调制)波的产生和控制则是变频技术的核心之一。本文对SPI波形生成的三种算法-对称规则采样法、不对称规则
    发表于 07-31 13:34

    MEMS中的三种测温方式

    在集成MEMS芯片的环境温度测量领域,热阻、热电堆和PN结原理是三种主流技术。热阻是利用热敏电阻,如金属铂或注入硅的温度电阻系数恒定,即电阻随温度线性变化的特性测温,电阻变化直接对应绝对温度,需恒流源供电。
    的头像 发表于 07-16 13:58 1913次阅读
    MEMS中的<b class='flag-5'>三种</b>测温方式

    无位置传感器无刷直流电机闭环段式启动策略

    摘 要:针对无位置传感器无刷直流电机(brshiess DC moor,BLDCM)启动问题,提出了一转子初始位置精准预定位与加速过程中优化定位相结合的闭环段式
    发表于 07-09 14:26

    启动自耦变压器,能提升设备运行稳定性吗?

    对于水泵、风机行业来说,启动设备的稳定性至关重要。你是否常常因为普通启动设备在启动过程中出现抖动现象,导致设备磨损加剧,进而影响设备的正常运行和使用寿命?同时,启动设备寿命短,频繁更换
    的头像 发表于 06-25 11:39 708次阅读
    <b class='flag-5'>三</b>相<b class='flag-5'>启动</b>自耦变压器,能提升设备运行稳定性吗?

    绕线转子永磁电机启动过程准时间最优控制

    摘要:绕线转子永磁电机(WR-PMM)转子斩波调阻启动是一便捷有效的启动控制策略。通过斩波调阻的方法实时调节转子外接电阻,能使启动过程中平均转矩始终保持最大值,实现绕线转子永磁电机
    发表于 06-12 13:50

    绕线电机启动状态到双馈状态过渡过程的研究

    摘要:比较了双馈电机的两启动方案,分析了电机定子侧电源的幅值及转子侧励磁电源的幅值、频率对双馈电机过渡过程的影响,并探讨了勋磁电源的频率与牵人双馈状态允许的最大转差之间的关系。分别以
    发表于 06-12 13:40

    晶闸管控制异步电机软启动过程中振荡现象研究

    纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:晶闸管控制异步电机软启动过程中振荡现象研究.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 06-04 14:39

    介绍三种常见的MySQL高可用方案

    在生产环境中,为了确保数据库系统的连续可用性、降低故障恢复时间以及实现业务的无缝切换,高可用(High Availability, HA)方案至关重要。本文将详细介绍三种常见的 MySQL 高可用
    的头像 发表于 05-28 17:16 1440次阅读

    精选好文!噪声系数测量的三种方法

    器件噪声系数的三种方法。每种方法都有其优缺点,适用于特定的应用。下表是三种方法优缺点的总结。理论,同一个射频器件的测量结果应该一样,但是由于射频设备的限制(可用性、精度、频率范围、噪声基底等),必须选择最佳的方法以获得正确的结
    发表于 05-07 10:18