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
    +关注

    关注

    2305

    文章

    11123

    浏览量

    371230
  • IAP
    IAP
    +关注

    关注

    2

    文章

    165

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32时钟的启动过程

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

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

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

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

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

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

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

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

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

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

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

    电机软启动器无故障报警停机原因分析与控制系统改造

    相全控桥式整流电路。使用软启动启动电动机时,晶闸管的输出电压逐渐增加,电动机逐渐加速,直到晶闸管全导通,电动机工作在额定电压的机械特性,实现平滑
    发表于 04-27 19:29

    redis三种集群方案详解

    在Redis中提供的集群方案总共有三种(一般一个redis节点不超过10G内存)。
    的头像 发表于 03-31 10:46 1284次阅读
    redis<b class='flag-5'>三种</b>集群方案详解

    GaN、超级SI、SiC这三种MOS器件的用途区别

    如果想要说明白GaN、超级SI、SiC这三种MOS器件的用途区别,首先要做的是搞清楚这三种功率器件的特性,然后再根据材料特性分析具体应用。
    的头像 发表于 03-14 18:05 2210次阅读

    STM32F103做从站 过程,上位机不断发送数据造成,通讯失败怎么解决?

    主机上挂了多个STM32 485从站, 主机不断轮询发送数据,STM32过程中如果主站已经在不断发送数据了就
    发表于 03-13 08:11

    STM32启动过程分享

    复位后的启动模式。xa0 xa0 需要注意的是STM32电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间
    发表于 03-07 08:09

    光伏系统的三种类型及其应用分析

    ,即使在夜间或阴天也能持续供电,常用于离网或偏远地区的设置。第三种系统为交流电(AC)负载供电,使用逆变器将直流电转化为交流电,使其可以与住宅和商业电器兼容。仅日间
    的头像 发表于 01-20 11:40 1973次阅读
    光伏系统的<b class='flag-5'>三种</b>类型及其应用<b class='flag-5'>分析</b>

    SMT贴片空焊异常

    SMT厂使用我们同款产品在三种不同机种上皆出现空焊现象,我们对不良品进行EDX分析,无异常;对同批次样品锡实验无异常;量测产品尺寸(产品高度、焊盘大小、镀层厚度)无异常,可能是什么原
    发表于 01-08 11:50

    示波器的三种触发模式

    示波器的触发方式不仅影响波形捕捉的时机,还决定了显示的波形是否稳定。 常见的触发模式有三种: 单次触发 (Single)、 正常触发 (Normal)和 自动触发 (Auto)。下面将对这三种触发
    的头像 发表于 01-07 11:04 1.3w次阅读
    示波器的<b class='flag-5'>三种</b>触发模式

    ADS8688,ADS8688A,ADS8688AT三种型号有什么区别?如何选择?

    问一下官方,ADS8688有三种型号,ADS8688,ADS8688A,ADS8688AT,好像还不是同一个手册的型号,请问这三种型号有什么区别?如何选择?如果芯片有区别,万一买错了怎么办?
    发表于 12-12 07:51