CM3/4启动流程

CM3/4启动流程

  • 1. 启动模式
  • 2. 启动流程

1. 启动模式

复位方式有三种:上电复位硬件复位软件复位
当产生复位,并且离开复位状态后,CM3/4 内核做的第一件事就是读取下列两个 32 位整数的值:

  • 从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。
  • 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值指向复位后执行的第一条指令(复位向量)。
    在这里插入图片描述

  上述过程中,内核是从 0x0000 0000 和 0x0000 0004 两个的地址获取堆栈指针 SP 和程序计数器指针 PC。事实上,0x0000 0000 和 0x0000 0004 两个的地址可以被重映射到其他的地址空间。例如:我们将 0x0800 0000 映射到 0x0000 0000,即从内部 FLASH 启动,那么内核会从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,从地址 0x0800 0004 处取出程序计数器指针PC 的初始值。CPU 会从 PC 寄存器指向的地址空间取出的第 1 条指令开始执行程序,就是开始执行复位中断服务程序 Reset_Handler。将 0x0000 0000 和 0x0000 0004 两个的地址重映射到其他地址空间,就是启动模式选择。
  启动模式(也称自举模式)有三种,如下图所示:
在这里插入图片描述
  根据 BOOT 引脚的电平 [0:低电平;1:高电平;x:任意电平,即高低电平均可] 选择启动模式,这两个 BOOT 引脚根据外部施加的电平来决定芯片的启动地址。(0 和 1 的准确电平范围可以查看 F4 系列数据手册 I/O 特性表,但我们最好是设置成 GND 和 VDD 的电平值)
  复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。复位后,用户可以通过设置 BOOT0 [专用引脚] 和 BOOT1 [与 PB2 引脚共用] 引脚来选择需要的自举模式。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。
  器件退出待机模式时,还会对 BOOT 引脚重新采样。因此,当器件处于待机模式时,这些引 脚必须保持所需的自举模式配置。这样的启动延迟结束后,CPU 将从地址 0x0000 0000 获 取栈顶值,然后从始于 0x0000 0004 的自举存储器开始执行代码。


1. 内部FLASH启动方式:
  当芯片上电后采样到 BOOT0 引脚为低电平时,0x00000000 和 0x00000004 地址被映射到内部 FLASH 的首地址 0x08000000 和 0x08000004。因此,内核离开复位状态后,读取内部 FLASH的 0x08000000 地址空间存储的内容,赋值给栈指针 MSP,作为栈顶地址,再读取内部 FLASH的 0x08000004 地址空间存储的内容,赋值给程序指针 PC,作为将要执行的第一条指令所在的地址。完成这两个操作后,内核就可以开始从 PC 指向的地址中读取指令执行了。

2. 内部 SRAM 启动方式:
  类似于内部 Flash,当芯片上电后采样到 BOOT0 和 BOOT1 引脚均为高电平时,地址0x00000000 和 0x00000004 被映射到内部 SRAM 的首地址 0x20000000 和 0x20000004,内核从SRAM 空间获取内容进行自举。在实际应用中,由启动文件 starttup_stm32f407xx.s 决定了0x00000000 和 0x00000004 地址存储什么内容,链接时,由分散加载文件(sct)决定这些内容的绝对地址,即分配到内部 FLASH 还是内部 SRAM。

3. 系统存储器启动方式:也称为 ISP 启动方式
  当芯片上电后采样到 BOOT0=1,BOOT1=0 的组合时,内核将从系统存储器的 0x1FFFF000及 0x1FFFF004 获取 MSP 及 PC 值进行自举。系统存储器是一段特殊的空间,用户不能访问,ST 公司在芯片出厂前就在系统存储器中固化了一段代码。因而使用系统存储器启动方式时,内核会执行该代码,该代码运行时,会为 ISP(In System Program)提供支持,在 STM32F4 上最常见的是检测 USART1 传输过来的信息,并根据这些信息更新自己内部 FLASH 的内容,达到升级产品应用程序的目的,因此这种启动方式也称为 ISP 启动方式。

2. 启动流程

  以前 ARM7/ARM9 内核的控制器在复位后,CPU 会从存储空间的绝对地址0x00000000 取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为 0x00000000(PC =0x00000000),同时中断向量表的位置也是固定的。而 CM3/4内核复位后的起始地址和中断向量表的位置可以被重映射,重映射的方法是通过3 种启动模式来选择的(如上)


在这里插入图片描述

启动流程:【以代码下载到内部 FLASH 的情况举例】

  1. 当产生复位[上电复位、硬件复位、软件复位],并且离开复位状态后,从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。 [小端:MSP=0x2000 0788]
  2. 从地址 0x0800 0004 处取出程序计数器指针 PC 的初始值,该值指向复位后执行的第一条指令。 [小端:PC=0x0800 01CD]


在这里插入图片描述
  因为 CM3/4 使用的是向下生长的满栈,所以 MSP 的初始值必须是堆栈内存的末地址加 1。举例来说,如果你的栈区域在 0x2000 0388‐0x2000 0787(1KB 大小)之间,那么 MSP 的初始值就必须是 0x2000 0788。
  向量表跟随在 MSP 的初始值之后——也就是第 2 个表目。
  R15 是程序计数器,在汇编代码中,可以使用名字“PC”来访问它。ARM 规定:PC 最低两位并不表示真实地址,最低位 LSB 用于表示是 ARM 指令(0)还是 Thumb 指令(1),因为 CM3 主要执行 Thumb 指令,所以这些指令的最低位都是 1(都是奇数)。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。比如说:【0x1000: MOV R0, PC ; R0 = 0x1004】
  如果向 PC 写数据,就会引起一次程序的分支(但是不更新 LR 寄存器)。CM3/4 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。然而,在分支时,无论是直接写 PC 的值还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),表明是在 Thumb 状态下执行。倘若写了 0,则视为转入 ARM 模式,CM3 将产生一个 fault 异常。
  正因为上述原因,使用 0x0800 01CD 来表达地址 0x0800 01CC。当 0x0800 01CD 处的指令得到执行后,就正式开始了程序的执行(即去到 C 的世界)。所以在此之前初始化 MSP 是必需的,因为可能第 1 条指令还没执行就会被 NMI 或是其它 fault 打断。MSP 初始化好后就已经为它们的服务例程准备好了堆栈。


详细启动流程:
1. 硬件复位

  • 初始化内核寄存器。
  • 设置程序计数器(PC)为 0x08000000(Flash的起始地址)。

2. 读取初始栈指针(SP)

  • 从Flash的起始地址(0x08000000)读取初始栈指针(SP)的值。
  • 栈指针用于初始化栈,栈通常位于RAM的顶部。

3. 读取复位向量

  • 从Flash的第二个字(0x08000004)读取复位处理程序(Reset_Handler)的地址。
  • 复位向量是复位处理程序的入口地址。

4. 执行复位处理程序

  • 设置堆和栈的起始地址。
  • 调用 SystemInit 函数(如果存在),配置外部 SRAM 作为数据存储器(可选)和 配置重映射的中断向量表地址(可选)。
  • 跳转到 __main 函数。
     1. 初始化 .data 段
      data 段存储已初始化的全局变量和静态变量。这些变量的初始值存储在Flash中,将这些值复制到RAM中。
       步骤1:获取 .data 段在Flash中的起始地址和大小。
       步骤2:将数据从Flash复制到RAM中的目标地址。
     2. 初始化 .bss 段
      .bss 段存储未初始化的全局变量和静态变量。将 .bss 段对应的RAM区域清零。清零步骤如下:
      步骤1:获取 .bss 段的起始地址和大小。
      步骤2:将对应内存区域清零。
     3. 设置堆和栈
      栈(Stack)用于存储局部变量和函数调用信息。栈的大小在启动文件中定义,通常位于RAM的顶部。
      堆(Heap)用于动态内存分配(如 malloc 和 free)。堆的大小也在启动文件中定义。
      __main 函数根据启动文件中的定义,初始化堆和栈的起始地址和大小。
     4. 调用用户的 main 函数
      在完成上述初始化工作后,__main 函数会跳转到用户的 main 函数,开始执行用户代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

限时特惠,香港服务器,低至53元/年

家人们谁懂啊!香港服务器这价格简直逆天了,居然比内地的还便宜!就拿阿里云来说,人家最低配置的服务器,价格都很难做到这么亲民。 最低配的就不说了,2 核 4G 的配置,应对日常业务稳稳当当&#x…

【STM32】点击下载按钮时,提示No ST-LINK detected

00. 目录 文章目录 00. 目录01. 问题描述02. 问题分析03. 问题解决04. 问题验证05. 附录 01. 问题描述 点击下载按钮时,提示No ST-LINK detected。 02. 问题分析 电脑没有检测到有ST-LINK设备,一般是ST-LINK驱动的问题。 03. 问题解决 \1. 先确保ST…

SAP BC 同服务器不同client之间的传输SCC1

源配置client不需要释放 登录目标client SCC1

【前端开发常用网站汇总-01】

1、仿mac界面代码截图 https://codeimg.io/?utm_sourceappinn.com 2、可视化大屏汇总(在线Demo) https://www.xiongze.net/viewdata/index.html 3、在线Photoshop(实现简单P图) https://ps.gaoding.com/#/ 4、在线生成ico图标(png转icon文件) https://www.bitbug.net/in…

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 💻💻AI一下💻💻   libtorch库是一个用于深度学习的C库,是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…

Unity学习笔记(六)使用状态机重构角色移动、跳跃、冲刺

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 整体状态框架(简化) Player 是操作对象的类: 继承了 MonoBehaviour 用于定义游戏对象的行为,每个挂载在 Unity 游戏对象上的脚本都需要继承自 MonoBehaviour&#x…

4. 多线程(2)---线程的状态和多线程带来的风险

文章目录 前言1. 线程的状态1.1. 观察线程的所有状态1.2. 通过不同线程的状态,来调试代码,观察现象 2. 多线程的带来的风险---线程不安全2.1.观察线程不安全的现象2.2 线程不安全的原因2.3.线程不安全的原因 前言 上一篇博客我们学习了,线程…

UE5失真材质

渐变材质函数:RadialGradientExponential(指数径向渐变) 函数使用 UV 通道 0 来产生径向渐变,同时允许用户调整半径和中心点偏移。 用于控制渐变所在的位置及其涵盖 0-1 空间的程度。 基于 0-1 的渐变中心位置偏移。 源自中心的径…

嵌入式中QT实现文本与线程控制方法

第一:利用QT进行文件读写实现 利用QT进行读写文本的时候进行读写,读取MP3歌词的文本,对这个文件进行读写操作。 实例代码,利用Qfile,对文件进行读写。 //读取对应文件文件,头文件的实现。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…

计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【U8+】用友U8软件中,出入库流水输出excel的时候提示报表输出引擎错误。

【问题现象】 通过天联高级版客户端登录拥有U8后&#xff0c; 将出入库流水输出excel的时候&#xff0c;提示报表输出引擎错误。 进行报表输出时出现错误&#xff0c;错误信息&#xff1a;找不到“fd6eea8b-fb40-4ce4-8ab4-cddbd9462981.htm”。 如果您正试图从最近使用的文件列…

《Spring Framework实战》1:Spring简介

欢迎观看《Spring Framework实战》视频教程 Spring简介 目录 1. Spring简介 2. Spring项目 3. Spring 能做什么&#xff1f; Spring 使 Java 简单化。 Spring 使 Java 现代化。 Spring 使 Java 富有成效。 Spring 使 Java 反应性。 Spring 使 Java 轻松上云。 Sprin…

esp32开发笔记之一:esp32开发环境搭建vscode+ubuntu

最近想用esp32做一个物联网项目&#xff0c;踩坑N个终于有点心得&#xff0c;写下来避免和我一样的小白踩无谓的坑。 写在前面&#xff1a; 第一&#xff0c;大家一定要用linux系统作为编译工具&#xff0c;速度上是windows无法比的&#xff0c;不要因为不熟悉linux而选择win…

Maven 详细配置:Maven 项目 POM 文件解读

Maven 是 Java 开发领域中广泛使用的项目管理和构建工具&#xff0c;通过其核心配置文件——POM&#xff08;Project Object Model&#xff09;文件&#xff0c;开发者能够定义项目的基本信息、依赖关系、插件配置以及构建生命周期等关键要素。POM 文件不仅是 Maven 项目的核心…

低空管控技术-无人机云监视技术详解!

一、无人机监听技术的原理 无人机监听技术主要依赖于射频&#xff08;RF&#xff09;探测、光学和红外传感器等技术手段。这些技术通过被动监听和监测无人机与飞行员&#xff08;或控制器&#xff09;之间的通信链路传输&#xff0c;以确定无人机的位置&#xff0c;甚至在某些…

2024年6月英语六级CET6听力原文与解析

目录 0 序言 1.Long Conversation(长对话) 1.1 Blender 搅拌机 1.2 村庄的改造变化 2.Passage 2.1 micro robots 微型机器人 2.2 elite sleeper 睡眠精英 3.Lecture 3.1 对自身观念变化的低察觉度及相关研究发现 3.2 美国母亲群体数量变化及母亲节消费趋势分析 3.3 …

如何在读博过程中缓解压力

博士生涯充满了挑战和压力&#xff0c;但通过一些实用的方法&#xff0c;我们可以有效地缓解这些压力。以下是我在博士期间采用的一些策略&#xff0c;希望能对正在读博或即将开始博士生涯的你有所帮助。 1. 周末彻底放松 在周末&#xff0c;我尽量避免进行论文写作。这两天…

flutter 专题三十二 Flutter Android embedding升级到v2

一、背景 为了更好地支持将Flutter添加到现有项目的执行环境&#xff0c;旧的Android平台端包装器在 io.flutter.app.FlutterActivity 及其相关类托管Flutter运行时已被弃用。取而代之的则是 io.flutter.embedding.android.FlutterActivity 及其相关的类。如果我们不进行升级&…

MetaGPT - 多Agent框架

文章目录 一、关于 MetaGPT功能介绍快速开始的演示视频教程 二、安装Pip安装Docker安装 一、关于 MetaGPT MetaGPT 为GPTs分配不同的角色&#xff0c;以形成一个协作实体来完成复杂的任务。 github : https://github.com/geekan/MetaGPTtwitter : https://twitter.com/MetaGP…

人工智能伦理困境:技术发展的界限在哪里?

引言 人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着世界。从自动驾驶汽车到智能语音助手&#xff0c;再到精准医疗和金融预测&#xff0c;AI正在重塑各行各业。然而&#xff0c;技术进步的背后也隐藏着复杂的伦理难题&#xff0c;引发人们对AI发展边界的深刻…