ARM-CortexM核心的启动过程

原创 云深之无迹 2025-02-01 10:50

所以这个东西到底是咋运行起来的,一给电源就启动了。

启动代码是 MCU 复位后执行的第一段代码,主要作用是 初始化堆栈、设置中断向量表、调用系统初始化函数,并最终跳转到 main()。该文件采用 ARM 汇编实现,并按照 Cortex-M 内核启动流程设计。

因为最终是要有一个稳定的执行指令的环境的,就是PC指针开始工作,CPU开始工作。

一开始的堆栈初始化就是:为 SP(栈指针)和 malloc() 分配 RAM。

接下来是:存储 MCU 的中断入口地址,就是NVIC

  1. 第一项:栈指针
  2. 第二项:Reset_Handler 作为复位后执行的代码

接下来是开始复位:

  1. 设置 SP,确保堆栈正确
  2. 调用 SystemInit(),初始化 MCU 时钟
  3. 跳转 __main(),最终执行 main()

在总结一下:

1️⃣ MCU 复位,CPU 读取向量表 0x00000000 

2️⃣ 加载 __initial_sp 到 SP 

3️⃣ 跳转 Reset_Handler 执行 

4️⃣ 调用 SystemInit() 初始化系统 

5️⃣ 跳转 __main() 进行 C 运行环境初始化 

6️⃣ 最终进入 main(),运行用户代码

这也是一样的流程

就在这里

引导加载程序是一段代码,可用于更新用户应用程序代码。可以使用其他下载渠道(USB或网络端口)获取新代码。引导 ROM 执行后,将执行引导加载程序,并在需要时进行更新,然后执行最终用户应用程序。
引导加载程序和用户应用程序应作为两个单独的 µVision 项目或目标进行编写和构建,从而产生两个单独的可执行映像/应用程序。
引导加载程序的主要任务是重新编程/替换用户应用程序,并跳转到用户应用程序执行它。
用户应用程序不一定需要知道引导加载程序的存在。
引导加载程序通常放置在芯片闪存基地址处,以便在复位后由 CPU 执行。下图演示了用户应用程序和引导加载程序的典型代码放置位置。

基址在这里,下面是引导的中断向量表。接着是引导代码,直接一段没使用,然后是用户的中断表,这个表还会拿出来继续映射。

这个一个栈指针,下一个就是程序指针

下一个就是中断源了

CPU 复位后,取出向量表中的 MSP(堆栈指针).

  1. 第 0 号地址:存储堆栈指针(MSP, Main Stack Pointer) 初始值。
  2. 第 1 号地址:存储复位向量(Reset Vector),指向 Reset_Handler。
  3. 第 2~N 号地址:存储 各种异常和中断的入口地址。

那就是APB,AHB和M0+往下了

从下往上走

在M3和M4架构中,中断向量表通常位于程序的起始位置。
中断向量表中的第一个条目是初始堆栈指针(SP)的值,第二个条目是复位向量(Reset Handler)的地址。
BootLoader程序的主要任务是初始化硬件(如串口),然后跳转到应用程序(APP)的起始地址执行。
  1. 初始化串口等外设,确保BootLoader可以与外部设备通信。
  2. 在跳转到应用程序之前,需要关闭所有中断,以避免在跳转过程中发生中断导致不可预知的行为。
  3. 从应用程序的起始地址(即中断向量表的第一个条目)读取初始堆栈指针的值,并将其设置为当前堆栈指针。
  4. 从应用程序的起始地址+4的位置读取复位向量的地址,并将其强制转换为函数指针,然后跳转到该地址执行。


大概就是这样

堆栈指针的设置:在跳转到应用程序之前,必须正确设置堆栈指针,否则应用程序可能无法正常运行。
中断的关闭:在跳转之前关闭中断是为了避免在跳转过程中发生中断,导致程序进入不可预知的状态。
应用程序的复位向量:应用程序的复位向量是应用程序的入口点,跳转到该地址相当于执行了一次复位操作。

__IO 是编译器特定的宏,通常表示“volatile”,用于告诉编译器该变量可能会被硬件或外部事件修改,避免编译器优化。
vu32 是一个易变的32位无符号整数类型,用于访问硬件寄存器或内存映射的外设。


这是一个用汇编编写的函数,用于设置主堆栈指针(MSP)。
  1. MSR MSP, r0:将传入的参数(addr,存储在寄存器 r0 中)赋值给主堆栈指针(MSP)。
  2. BX r14:跳转到链接寄存器(r14,即 LR)中存储的地址,用于返回到调用函数。

看看这个复杂的函数

检查栈顶地址是否合法:
(*(vu32*)appxaddr):读取应用程序起始地址的第一个字(栈顶地址)。
&0x2FFE0000:掩码操作,用于检查栈顶地址是否在RAM范围内(通常RAM的起始地址是 0x20000000)。
如果栈顶地址合法(即 (*(vu32*)appxaddr)&0x2FFE0000) == 0x20000000),则继续执行。
获取中断的地址:

jump2app = (void(*)())*(vu32*)(appxaddr+4):读取应用程序起始地址的第二个字(复位中断地址),并将其赋值给函数指针 jump2app。

设置堆栈指针:
MSR_MSP(*(vu32*)appxaddr):调用汇编函数 MSR_MSP,将应用程序的栈顶地址设置为当前堆栈指针。
关闭中断:
通过写 NVIC->ICER 和 NVIC->ICPR 寄存器,关闭所有中断并清除中断标志位,确保跳转过程中不会发生中断。

是这样

跳转到应用程序:
jump2app():通过函数指针跳转到应用程序的复位中断地址,开始执行应用程序。
  1. 栈顶地址检查:确保应用程序的栈顶地址在合法的RAM范围内。
  2. 复位中断地址:应用程序的第二个字是复位中断地址,BootLoader通过该地址跳转到应用程序。
  3. 关闭中断:在跳转之前关闭所有中断,确保跳转过程的安全。
  4. 堆栈指针设置:在跳转之前,正确设置应用程序的堆栈指针。

然后呢?怎么走?

堆栈已经好了

复制 .data 段(已初始化变量)
从 Flash 复制 .data(已初始化全局变量) 到 SRAM。.data 存在 Flash 中,运行时需要复制到 RAM。
清空 .bss 段(未初始化变量)
.bss(未初始化全局变量)在 RAM,需要全部清零。
调用 SystemInit()(初始化时钟等)
SystemInit() 由 CMSIS 提供,
通常用于:配置 系统时钟(HSE, HSI, PLL)
设置 Flash 加速
配置 总线时钟(AHB, APB)
STM32 HAL 库提供默认 SystemInit(),可在 system_stm32f4xx.c 修改。
调用 main()
main() 是用户程序的入口,至此启动完成。

当然这个还是写的不全面,下次再写!

评论 (0)
  • 2020年,世界经济论坛发布了《将来工作报告》,预言了人工智能 (AI)、机器人和自动化将在五年内对劳动力市场带来反天性的变化。最震撼人心的预测是:85亿个工位将消失,97亿个新工位将被创造。这个信息给我们提出了一些骂烈的疑问:AI究竟会消灭哪些工作?管理者的规划依然重要吗?AI会代替我们的管理之路吗?AI不会替代管理者,会进一步增强他们随着AI在机器学习、自然语言处理和预测分析方面的进步,许多人对AI接管事务表示担心。但研究显示,大多数情况下,AI将作为工具与管理者协同完成任务,而不是替换他们
    优思学院 2025-03-01 12:22 194浏览
  • 2025年世界移动通信大会(MWC 2025)期间,紫光展锐联合移远通信,正式发布了全面支持5G R16特性的模组RG620UA-EU,以强大的灵活性和便捷性赋能产业。展锐芯加持,关键性能优异RG620UA-EU模组基于紫光展锐V620平台开发,搭载4核Arm®Cortex®-A55 CPU,符合3GPP R16标准,在传输速率、计算能力、R16关键特性等方面表现优异。该模组配备了丰富的功能接口,包括USXGMII、PCIe3.0、USB3.1、SDIO3.0、UART、SPI、I2S、I2C、
    紫光展锐 2025-03-04 19:54 110浏览
  • 在当今数据驱动的世界,内存解决方案需要的不仅仅是原始性能。贞光科技代理的紫光国芯全系列存储产品提供定制化解决方案,解决各行业面临的独特挑战,同时确保可靠性、兼容性和面向未来的创新。打破“唯性能论”,迎接多元化存储需求一直以来,高性能似乎成了衡量存储产品的唯一标准。 没错,速度快、效率高,固然重要。 但话说回来, 难道所有应用场景,都对性能有着“变态”级的需求吗? 答案显然是否定的。 就像穿鞋一样,合脚才是最重要的, 一味追求“跑得快”, 反而容易磨脚,甚至崴脚!在实际应用中,各行各业对存储的需求
    贞光科技 2025-03-03 17:05 125浏览
  • 中小企业(SME)对全球经济的贡献日益显著,不仅是发展中国家的经济支柱,通常还是其经济快速增长的关键部分。中小企业的其他关键作用还包括促进创业和创新,从而保证竞争力。从这一点来说,中小企业助力了许多大公司,并对世界经济做出重大贡献。本章将介绍中小企业的定义和经济份额,分析其特点以及它们与大型企业的区别。中小企业的定义任何组织在制订计划和策略时,最重要的都是了解业务的性质和类型。全球各企业的分类主要基于它们的体量,例如固定资产、产值、资金和员工数量。从大的分类来讲,大公司被划归为一种类型,而所有其
    优思学院 2025-03-04 11:07 97浏览
  • DeepSeek的风还吹到了TV圈。去年,人工智能领域迎来了重大突破,然而对大多数人而言,它依旧是个颇为模糊的概念。即便是如ChatGPT这样的产品,给人最直接的感受也仅仅是一个相较于Siri更为智能的语音交互工具。直至今年,DeepSeek的惊艳亮相,人们真正感受到了生成式人工智能在实际应用中的价值。在这股浪潮的推动下,电视厂商们也纷纷跟上了脚步。2月11日,海信电视宣布正式接入DeepSeek,并支持满血R1和V3版本自由切换,成为行业首个搭载深度思考智能体的电视品牌。长虹电视紧随其后,宣布
    刘旷 2025-03-03 09:55 266浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 382浏览
  • 在现代各种工业设备的复杂电路中,栅极驱动芯片虽不常被大众提及,却扮演着至关重要的角色。栅极驱动芯片是低压控制器和高压电路之间的缓冲电路,主要用于放大控制器的控制信号,从而令功率器件实现更快速高效的导通和关断,是保障电子设备稳定、高效运行的核心元件之一。驱动芯片的类型(按结构划分)电力电子应用基于功率器件技术,而无论是MOSFET、IGBT,还是SiC MOSFET等功率器件都需要相应的栅极驱动芯片(Gate Driver IC)。选择一款合适的驱动芯片,不仅可以简化相应电气系统的设计复杂度,还可
    华普微HOPERF 2025-03-04 14:40 101浏览
  • 压力传感器是指能感受压力信号,并能按照一定的规律将压力信号转换成可用的电信号的器件或装置。压力传感器通常由压力敏感元件和信号处理单元组成,按不同测压方法,压力传感器可分为表压传感器、差压传感器和绝压传感器;按不同测压原理,压力传感器又可分为常见的压阻式压力传感器、电容式压力传感器、扩散硅压力传感器、蓝宝石压力传感器与陶瓷压力传感器等。作为工业自动化与智能化的关键器件,压力传感器在各类工业设备中扮演着不可或缺的角色,其通过精确感知和转换物理压力信号,为工业物联网(IIoT)构建起了高效精确的“压力
    华普微HOPERF 2025-03-03 10:19 195浏览
  • 文/Leon编辑/cc孙聪颖在中国制造转向“智造”的过程中,一批80、90后企业创始人闪亮登场,用互联网思维进行创新,在全球市场取得了傲人的成绩,如大疆汪滔、宇树科技王兴兴、影石Insta360刘靖康,都是各自领域的佼佼者。在引领全球市场后,独角兽企业的下一步自然是上市。据悉,中国证监会于2025年2月26日正式批复影石Insta360创新科技股份有限公司(以下简称影石Insta360)的IPO申请,拟在上交所科创板上市,中信证券为保荐机构,拟募集资金4.64亿元。影石Insta360主要从事手
    华尔街科技眼 2025-03-03 18:40 174浏览
  • 在2025年世界移动通信大会(MWC 2025)期间,紫光展锐携手美格智能正式推出了基于紫光展锐V620平台的第二代5G Sub6G R16模组SRM812,以超高性价比方案,全面赋能合作伙伴,加速5G规模化应用在各垂直领域的全面落地。展锐芯赋能,全面支持R16关键特性SRM812模组基于紫光展锐推出的V620平台设计,V620是业界首款全面支持R16的5G宽带物联网芯片平台,具备强劲的射频能力和全网通特性。得益于此,SRM812成为业界首批全面支持5G R16宽带物联网特性的芯片平台。SRM8
    紫光展锐 2025-03-04 19:55 108浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦