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

    关注

    2265

    文章

    10860

    浏览量

    354578
  • IAP
    IAP
    +关注

    关注

    2

    文章

    163

    浏览量

    24238
收藏 人收藏

    评论

    相关推荐

    BQ79600-Q1启动过程

    电子发烧友网站提供《BQ79600-Q1启动过程.pdf》资料免费下载
    发表于 11-09 14:57 0次下载
    BQ79600-Q1<b class='flag-5'>启动过程</b>

    负载电容对电源转换器启动过程的影响

    理想的电源转换器需要无论负载如何变化都保持输出电压稳定。在实际应用中,负载瞬态期间选择不合适的输出电容会导致过高的纹波电压和浪涌电流,从而影响电源转换器的性能。本文将介绍选择输出电容的指南,详细介绍负载电容对启动过程的影响,并提供改进建议。
    的头像 发表于 10-28 11:08 196次阅读
    负载电容对电源转换器<b class='flag-5'>启动过程</b>的影响

    PA3113D2在系统启动过程中会出现一个POP声,请问是什么原因造成的?

    请教各位高手,我现在CODEC芯片用的是WOLFSON WM8960,OPA用的是TI PA3113D2,瞬间的POP声已经解决,但是在系统启动过程中(快启动完成时)还会出现一个P
    发表于 10-18 06:39

    使用pahomqtt启动过程中pipe_fops_open时出现rt_condvar_timedwait ,如何解决?

    在使用pahomqtt 启动过程中pipe_fops_open 时出现rt_condvar_timedwait 死等,而RTT 5.0则可以。请问该如何解决?
    发表于 09-26 07:11

    自耦降压启动和星启动区别在哪

    自耦降压启动和星启动是两常用的电动机启动方式,它们在启动过程中对电动机的电流和转矩的影响有
    的头像 发表于 06-19 09:10 2434次阅读

    启动与星启动的区别在哪里

    启动与星启动是两不同的电机启动方式,它们在启动过程中对电机的电流和转矩有不同的影响。
    的头像 发表于 06-18 11:37 2082次阅读

    信号调制的三种基本方法

    号调制的三种基本方法:调幅(AM)、调频(FM)和调相(PM),并分析它们的优缺点及应用场景。 调幅(AM) 2.1 调幅原理 调幅(Amplitude Modulation,AM)是一将低频信号的幅度变化映射到高频载波信号的
    的头像 发表于 06-03 09:38 2708次阅读

    STM32__UCOSII系统启动过程中空闲任务和统计任务扮演怎样的角色?

    如题STM32__UCOSII系统启动过程中空闲任务和统计任务扮演怎样的角色
    发表于 05-08 07:37

    STM32WBA Nucleo-64设置主频为100M,发现启动过程中卡死在PWR_VOSR_VOSRDY,为什么?

    使用ST官方的STM32WBA Nucleo-64板子, 当设置主频为100M,发现启动过程中卡死在PWR_VOSR_VOSRDY; 设置主频为16MHz的时候,可以正常完成初始化。 使用的是CodeMx生成的工程 这是啥原因呢?看手册也没找到原因
    发表于 03-14 08:28

    放大电路有哪三种基本分析方法?举例说明

    放大电路是电子电路的重要组成部分,它起到放大信号的作用。在设计和分析放大电路时,有三种基本的分析方法:传输特性分析、小信号分析和大信号
    的头像 发表于 02-25 15:56 2527次阅读

    运放的三种应用

    运放在电路中主要存在三种应用,放大器,滤波器,振荡器。再这三种应用电路中,运放的两大特点虚短虚断仍然成立吗? 在阻尼振荡器中,工作过程是否按照我描述的这样,在反相输入端加一个近似锯齿波的电流源,正半
    发表于 01-26 16:18

    电源芯片启动过冲有哪些影响?怎么测试电源芯片的启动过冲?

    电源芯片的启动过冲过大会对芯片中的元件造成损害,例如电容、电感等。这些元件在受到过冲电压的作用时可能会出现短路或开路等现象,从而造成芯片损害,影响芯片的整体稳定性和可靠性,因此启动过冲是电源芯片测试中必不可少的项目。电源芯片的启动过
    的头像 发表于 12-27 15:48 1032次阅读
    电源芯片<b class='flag-5'>启动过</b>冲有哪些影响?怎么测试电源芯片的<b class='flag-5'>启动过</b>冲?

    stm32启动过程详解

    STM32启动过程详解 近年来,STM32微控制器在嵌入式系统中的应用越来越广泛。STM32微控制器具有高性能、低功耗、易扩展和丰富的外设接口等优势。而要让
    的头像 发表于 12-08 15:47 1496次阅读

    kernel到android核心启动过程

    总结一个图:kernel 到android核心启动过程 kernel镜像执行跳转到start_kernel开始执行,在rest_init会创建两个kernel 进程(线程),其分别是为
    的头像 发表于 12-04 16:59 872次阅读
    kernel到android核心<b class='flag-5'>启动过程</b>

    logd的启动过程和内容

    logd作为native service,系统启动过程通过读取rc文件来启动,相关的属性定义在如下logd.rc文件中。 2.2.1 logd启动过程 logd启动后会存在
    的头像 发表于 11-23 16:54 796次阅读
    logd的<b class='flag-5'>启动过程</b>和内容