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

    关注

    2239

    文章

    10669

    浏览量

    348685
  • IAP
    IAP
    +关注

    关注

    2

    文章

    161

    浏览量

    23960
收藏 人收藏

    评论

    相关推荐

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

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

    运放的三种应用

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

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

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

    stm32启动过程详解

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

    logd的启动过程和内容

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

    ATF的启动过程介绍

    ATF的启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。 在AArch32中是不会去加载bl31而是将EL3或者Monitor模式的运行代码保存在bl32
    的头像 发表于 11-07 15:48 473次阅读
    ATF的<b class='flag-5'>启动过程</b>介绍

    ARM64位与ARM32位OP-TEE启动过程的差异

    ARM32的OP-TEE与ARM64的OP-TEE启动过程大致相同。ARM64的OP-TEE的_start函数定义在generic_entry_a64.S文件中,而且该函数不像ARM32位系统
    的头像 发表于 11-07 15:12 272次阅读

    STM32的完整启动流程分析

    STM32的完整启动流程分析
    的头像 发表于 10-25 16:00 758次阅读
    <b class='flag-5'>STM32</b>的完整<b class='flag-5'>启动</b>流程<b class='flag-5'>分析</b>

    RL78启动过程详解

    RL78启动过程详解
    的头像 发表于 09-28 16:39 858次阅读
    RL78<b class='flag-5'>启动过程</b>详解

    STM32上电启动过程分析(START_TEST代码实例)

    STM32作为一款高端 Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。
    发表于 08-31 14:36 1036次阅读
    <b class='flag-5'>STM32</b>上电<b class='flag-5'>启动过程</b><b class='flag-5'>分析</b>(START_TEST代码实例)

    ESP32学习笔记:存储分布和启动过程

    今天我们来说说ESP32 for Arduino存储分布以及启动过程
    的头像 发表于 07-14 15:10 1586次阅读
    ESP32学习笔记:存储分布和<b class='flag-5'>启动过程</b>

    谈一下STM32启动流程

    下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程
    的头像 发表于 07-04 17:09 1020次阅读
    谈一下<b class='flag-5'>STM32</b>的<b class='flag-5'>启动</b>流程

    求大佬分享关于N32926启动过程

    大家好,最近在使用n32926做网络摄像头功能,查阅了一下新塘的SDK发现没有**介绍n32926的详细启动过程。之前用6410都是由uboot来引导linux 内核,现在先想自己实现一个uboot类似功能的bootloader但是由于不了解n32926的启动流程无从下手
    发表于 06-25 06:29

    直流他励电动机的调节与制动过程

    有关直流他励电动机的几种调节与制动过程,包括电动机正向启动加速过程,正向弱磁升速调节过程,正向强磁降速调节过程,正向电压反接制
    的头像 发表于 05-31 09:47 1453次阅读
    直流他励电动机的调节与制<b class='flag-5'>动过程</b>

    一文了解STM32启动过程

    每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。
    发表于 05-08 09:44 2399次阅读
    一文了解<b class='flag-5'>STM32</b><b class='flag-5'>启动过程</b>