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

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

3天内不再提示

STM32的完整启动流程分析

jf_pJlTbmA9 来源:嵌入式电子 作者:嵌入式电子 2023-10-25 16:00 次阅读

关于STM32的启动流程,网上有的资料在讨论几种boot模式,有的在回答启动文件的内容,在查阅了很多资料后,本文给出一个比较全面的总结和回答。

1. 根据boot引脚决定三种启动模式

1.png

复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式:

1)从主Flash启动。主Flash指的是STM32的内置Flash。选择该启动模式后,内置Flash的起始地址将被重映射到0x00000000地址,代码将在该处开始执行。一般我们使用JTAG或者SWD模式下载调试程序时,就是下载到这里面,重启后也直接从这启动。

2从系统存储器启动。系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UART/CANUSB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(In System Programing)代码,这种烧录代码的方式也被称为ISP烧录。关于ISP、ICP和IAP之间的区别将在后续章节中介绍。

3嵌入式SRAM中启动。显然,该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。

总结:上面的每一种启动方式我都描述了“xxx的起始地址被重映射到了0x00000000地址,从而代码从xxx开始启动”,如下图是STM32F4xx中文参考手册中的图,可以看到类似的表述。同时,在下图中也展示了STM32F4xx中统一编址下,各内存的地址分配,注意一点,即使相应的内存被映射到了0x00000000起始的地址,通过其原来地址依然是可以访问的。

2.png

2. 启动后bootloader做了什么?

根据BOOT引脚确定了启动方式后,处理器进行的第二大步就是开始从0x00000000地址处开始执行代码,而该处存放的代码正是bootloader。

bootloader,也可以叫启动文件,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。同样,STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件。

网上有很多资料分析了STM32的启动文件的内容,在此我只进行简单的表述。启动文件中首先会定义堆栈,定义中断/异常向量表,而其中只实现了复位的异常处理函数Reset_Handler,该函数内容如下(STM32F4XX,IAR编译器),可以看到其主要执行了SystemInit和__iar_program_start两个函数,其主要功能除了初始化时钟,FPU等,还会执行一个重要功能,那就是内存的搬移、初始化操作。这是我想重点介绍的内容,同时也会回答一个疑问,就是如果从Flash启动的话,代码究竟是运行在哪儿的?在我之前接触ARM9、CortexA系列的时候,一般都是把代码搬到内部的SRAM或者外部DDR中执行的,STM32是如何呢?答案下一小节揭晓。

3.png

3. bootloader中对内存的搬移和初始化

本节针对程序在内置Flash中启动的情况进行分析。

4.png

我们知道烧录的镜像文件中包含只读代码段.text,已初始化数据段.data和未初始化的或者初始化为0的数据段.bss。代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就OK,但是.data段和.bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此bootloader会执行很重要的一步,就是会在RAM中初始化.data和.bss段,搬移或清空相应内存区域。

因此我们知道,当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据则会被拷贝到内部SRAM中,该过程是由bootloader完成的。bootloader在完成这些流程之后,就会将代码交给main函数开始执行用户代码。

  • 现在让我们思考一个问题,PC机在运行程序的时候将程序从外存(硬盘)中,调入到RAM中运行,CPU从RAM中读取程序和数据;而单片机的程序则是固化在Flash中,CPU运行时直接从Flash中读取程序,从RAM中读取数据,那么PC机能从Flash之类的存储介质中直接读代码执行吗?

  • 答案是不行。因为x86构架的CPU是基于冯.诺依曼体系的,即数据和程序存储在一起,而且PC机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。但是单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。

4. ISP、IAP、ICP三种烧录方式

虽然这个小节稍稍偏题,但是由于上面在3中启动方式中介绍过了ISP烧录,因此一并在此介绍剩下的两种烧录方式。

1)ICP(In Circuit Programing)。在电路编程,可通过CPU的Debug Access Port 烧录代码,比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group);

2)ISP(In System Programing)。在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码。

3)IAP(In Applicating Programing)。在应用编程,由开发者实现Bootloader功能,比如STM32存储映射Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码),开发者可以将自己实现的Bootloader存放到Flash区间,MCU上电启动先执行用户的Bootloader代码,该代码可为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现OTA空中升级功能。

4)IAP和ISP 的区别。

a、ISP程序一般是芯片厂家提供的。IAP一般是用户自己编写的

b、ISP一般支持的烧录方式有限,只有串口等。IAP就比较灵活,可以灵活的使用各种通信协议烧录

c、isp一般需要芯片进行一些硬件上的操作才行,IAP全部工作由程序完成,不需要去现场

d、isp一般只需要按格式将升级文件通过串口发送就可以。IAP的话控制相对麻烦,如果是OTA的话还需要编写后台的。

e、注意,这里介绍的bootloader功能显然跟之前介绍的启动文件bootloader有所区别,其目的是为了能接受外部镜像进行烧录,而不是为了运行普通用户程序。

来源:嵌入式电子

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇


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

    关注

    48

    文章

    6811

    浏览量

    147646
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10443

    浏览量

    206566
  • PC
    PC
    +关注

    关注

    9

    文章

    1950

    浏览量

    152799
  • STM32
    +关注

    关注

    2239

    文章

    10674

    浏览量

    348772
  • Boot
    +关注

    关注

    0

    文章

    142

    浏览量

    35251
收藏 人收藏

    评论

    相关推荐

    stm32启动过程详解

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

    SMP多核secondary cpu启动流程

    图,详细分析可以参考上篇博文。其中以下流程执行secondary cpu启动相关的一些初始化工作: 在初始化完成且hotplug线程创建完成后,就可通过以下流程唤醒cpu hotplu
    的头像 发表于 12-05 17:41 278次阅读
    SMP多核secondary cpu<b class='flag-5'>启动</b><b class='flag-5'>流程</b>

    MCU(STM32F767IGTX)上电启动后执行的代码分析

    这一节,我们来看一下MCU(STM32F767IGTX)上电启动后执行的代码,也就是常说的启动代码。上一节里我们已经讲过了CubeIDE工程的启动代码在Core/Startup文件夹下
    的头像 发表于 11-06 15:04 448次阅读

    Linux整体汇编启动流程分析

    汇编启动流程 先从整体分析汇编做的事情,有个大体框架。 路径: arch/riscv/kernel/head.S ,入口是 ENTRY(_start_kernel) 从 ENTRY
    的头像 发表于 10-08 11:28 298次阅读
    Linux整体汇编<b class='flag-5'>启动</b><b class='flag-5'>流程</b><b class='flag-5'>分析</b>

    Arm TrustZone STM32微控制器的安全启动和安全固件更新解决方案

    本应用笔记描述如何在基于 Arm Cortex ‑M33 处理器的 Arm TrustZone STM32 微控制器上获得安全启动和安全固件更新流程解决方案。该应用笔记还提供此解决方案
    发表于 09-11 10:08 1次下载

    STM32启动文件

    STM32启动文件
    发表于 08-21 10:27 1次下载

    d1哪吒开发板的启动流程分析

    将程序烧录到sd卡中。 这里将boot0的固件烧录到sd卡的8K处,系统可以正常的启动。 5.裸机程序的编写 在分析了上述SPL和opensbi的启动流程后,自行编译一个简单的裸机
    发表于 08-16 08:16

    u-boot启动流程分析

    今天给大家全面的分析一下u-boot启动流程。整理这篇文章花费时间较长,中间很长时间未更新,希望这篇文章对大家有所帮助。
    发表于 07-12 15:16 454次阅读
    u-boot<b class='flag-5'>启动</b><b class='flag-5'>流程</b><b class='flag-5'>分析</b>

    谈一下STM32启动流程

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

    详细的STM32启动配置流程解析

    STM32 从 Bootloader 启动到能够与外部设备进行数据交互需要一定的时间,因此连接需要一定的时间
    发表于 07-01 09:14 1471次阅读
    详细的<b class='flag-5'>STM32</b><b class='flag-5'>启动</b>配置<b class='flag-5'>流程</b>解析

    Openwrt开发指南 第13章 OpenWrt启动流程

    任何系统的启动都是开发人员首要关注的问题,因为只有了解了系统的启动流程启动机制,才能真正掌握一个系统,如果对启动
    的头像 发表于 06-29 09:09 2569次阅读
    Openwrt开发指南 第13章 OpenWrt<b class='flag-5'>启动</b><b class='flag-5'>流程</b>

    STM32启动详细流程分析

    进行操作的,并且前提是已经取到了指令。那现在问题来了,指令在哪? cpu上电复位后执行的第一步操作就是取指令 问题1:指令存储在何处 我们在电脑上编写的程序最终是要烧写到芯片内部的 FLASH中(此处特指STM32)。 问题2:如何将可执行文件烧写至 FLASH 上 STM32
    的头像 发表于 06-22 09:10 483次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>启动</b>详细<b class='flag-5'>流程</b><b class='flag-5'>分析</b>

    浅析STM32单片机的启动文件

    今天来总结的stm32基础知识是启动文件相关。要想对是stm32单片机有个深入的理解,那么启动文件就是一个绕不过去的坎。
    发表于 06-12 16:49 980次阅读
    浅析<b class='flag-5'>STM32</b>单片机的<b class='flag-5'>启动</b>文件

    详解STM32启动文件

    本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此文件的代码在任何一个STM32F10x工程中都可以找到。
    发表于 06-10 17:19 711次阅读
    详解<b class='flag-5'>STM32</b><b class='flag-5'>启动</b>文件

    AURIX™ TC3xx启动流程详解

    本文首先介绍整个启动流程的概况,接着分别介绍了firmware启动流程,boot mode的配置,以及用户程序启动
    的头像 发表于 06-06 10:31 2332次阅读
    AURIX™ TC3xx<b class='flag-5'>启动</b><b class='flag-5'>流程</b>详解