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

    文章

    7482

    浏览量

    151007
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211086
  • PC
    PC
    +关注

    关注

    9

    文章

    2065

    浏览量

    153998
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354682
  • Boot
    +关注

    关注

    0

    文章

    149

    浏览量

    35778
收藏 人收藏

    评论

    相关推荐

    浅谈芯片制造的完整流程

    在科技日新月异的今天,芯片作为信息技术的核心部件,其制作工艺的复杂性和精密性令人叹为观止。从一粒普通的沙子到一颗蕴含无数晶体管的高科技芯片,这一过程不仅凝聚了人类智慧的结晶,也展现了现代半导体工业的极致工艺。本文将讲述芯片制造的完整流程,揭开这一高科技产品的神秘面纱。
    的头像 发表于 10-28 14:30 305次阅读
    浅谈芯片制造的<b class='flag-5'>完整流程</b>

    嵌入式系统的启动流程

    嵌入式系统的启动流程是一个复杂但有序的过程,它涉及从系统上电到操作系统内核及应用程序启动的多个阶段。
    的头像 发表于 10-05 17:44 278次阅读

    高速PCB信号完整分析及应用

    电子发烧友网站提供《高速PCB信号完整分析及应用.pdf》资料免费下载
    发表于 09-21 14:14 1次下载

    高速PCB信号完整性设计与分析

    高速PCB信号完整性设计与分析
    发表于 09-21 11:51 0次下载

    AMD Versal自适应SoC CPM5 QDMA的Tandem PCIe启动流程介绍

    本文将从硬件设计和驱动使用两个方面介绍基于 CPM5 QDMA 的 AMD Versal 自适应 SoC 的 Tandem 设计和启动流程
    的头像 发表于 09-18 10:07 408次阅读
    AMD Versal自适应SoC CPM5 QDMA的Tandem PCIe<b class='flag-5'>启动</b><b class='flag-5'>流程</b>介绍

    信号完整性与电源完整性-电源完整分析

    电子发烧友网站提供《信号完整性与电源完整性-电源完整分析.pdf》资料免费下载
    发表于 08-12 14:31 38次下载

    STM32启动脚本详解

    我从Keil和STM32CubeIDE开始我的嵌入式开发,然后慢慢过渡到只使用文本编辑器而没有任何集成开发环境(IDE)。我一直使用这些IDE提供的启动文件。在这篇文章中,我将解释如何用C++编写
    发表于 05-31 14:17 1次下载

    求助,关于TRAVEO MCU闪存启动流程的问题求解

    我有一个关于 TRAVEO MCU 闪存启动流程的问题。 Q) 架构 TRM - 34.3.3 闪存启动流程,(6)、(8)、(9)、(10)、(11)、(12) 和 (13) 可以在
    发表于 05-30 06:25

    Linux启动流程基本分析

    Linux启动流程总的来说可以分成三个阶段 Linux启动流程图   第一步:上电 Ø在 x86 系统中,将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给
    的头像 发表于 05-11 08:49 604次阅读
    Linux<b class='flag-5'>启动</b><b class='flag-5'>流程</b>基本<b class='flag-5'>分析</b>

    Rockchip 3588 系统启动流程

    Rockchip 3588是一款高性能、低功耗的ARM处理器,广泛应用于智能电视、智能音箱和车载娱乐系统等领域。在本文中,我们将深入探讨Rockchip 3588的系统启动流程。 系统启动流程
    的头像 发表于 01-07 16:08 2353次阅读

    Rockchip 系统启动流程

    Rockchip 系统的启动流程,包括 Boot ROM、Mask ROM、U-Boot、Linux 内核等。 Boot ROM 阶段: 在 Rockchip 系统启动的第一阶段,处理器复位后会首先执行
    的头像 发表于 01-04 15:54 1215次阅读

    14种电机启动电路分析

    【资料】14种电机启动电路分析
    的头像 发表于 01-04 10:56 1165次阅读
    14种电机<b class='flag-5'>启动</b>电路<b class='flag-5'>分析</b>

    stm32启动过程详解

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

    SMP多核secondary cpu启动流程

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

    springboot启动流程

    。 Spring Boot 的启动流程可以分为以下几个步骤:初始化启动环境、加载自动配置类、创建 Spring 上下文、启动嵌入式服务器。 初始化
    的头像 发表于 11-22 16:04 630次阅读