news 2026/6/10 16:56:31

44.STM32启动文件过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
44.STM32启动文件过程

ARM Cortex-M CPU从0x00000000取指执行的完整流程

核心逻辑:CPU上电复位后,先从0x00000000地址完成栈指针初始化,再从0x00000004地址跳转到复位处理函数,最终通过启动文件完成内存初始化并进入用户main函数。

一、硬件复位阶段(核心:读取中断向量表前两个值)

0x00000000是Cortex-M的中断向量表起始地址(物理地址通常映射到Flash 0x08000000或系统Bootloader,由BOOT0/BOOT1引脚配置),复位后CPU优先执行两步核心操作:

  • 加载主栈指针(MSP)

CPU从0x00000000地址读取4字节数据,作为栈指针(SP)的初始值(通常指向RAM顶部,如0x20008000):

LDR sp, [0x00000000] ; 初始化栈指针,为后续函数调用做准备
  • 跳转到复位处理函数

CPU从0x00000004地址读取4字节的复位向量(Reset_Handler函数地址),并将其赋值给程序计数器(PC),触发跳转:

LDR pc, [0x00000004] ; 跳转到启动文件中的Reset_Handler
二、启动文件(startup.s)执行阶段(Reset_Handler核心逻辑)

Reset_Handler是系统第一个执行的函数,完成程序运行前的内存初始化,步骤如下:

Reset_Handler: ; 1. 初始化.data段:将Flash中存储的已初始化全局变量复制到RAM LDR r0, =_sdata ; RAM中.data段起始地址(VMA) LDR r1, =_edata ; RAM中.data段结束地址 LDR r2, =_sidata ; Flash中.data段加载地址(LMA) CopyDataLoop: LDR r3, [r2], #4 ; 从Flash读数据,地址自增4 STR r3, [r0], #4 ; 写入RAM,地址自增4 CMP r0, r1 ; 判断是否复制完成 BNE CopyDataLoop ; 未完成则循环 ; 2. 初始化.bss段:将未初始化全局变量清零 LDR r0, =_sbss ; RAM中.bss段起始地址 LDR r1, =_ebss ; RAM中.bss段结束地址 MOVS r2, #0 ; 清零用的初始值 ZeroBssLoop: STR r2, [r0], #4 ; 向.bss段写入0,地址自增4 CMP r0, r1 ; 判断是否清零完成 BNE ZeroBssLoop ; 未完成则循环 ; 3. 配置系统时钟(硬件初始化) BL SystemInit ; 调用时钟配置函数,初始化CPU/外设时钟 ; 4. 进入用户代码入口 BL main ; 跳转到main函数,执行用户代码 ; 5. 异常处理:main返回后进入死循环(防止程序跑飞) B . ; 无限跳转到当前指令,原地循环
三、用户代码执行阶段
  1. 完成上述初始化后,CPU正式进入main()函数,开始执行用户编写的业务逻辑;
  2. main()函数执行完毕返回,CPU会进入Reset_Handler最后的死循环,避免程序执行未知地址的指令。

总结

  1. 核心流程:复位→初始化栈指针→跳转到Reset_Handler→初始化.data/.bss段→配置时钟→进入main函数;
  2. 关键地址:0x00000000(栈指针初始值)、0x00000004(复位函数地址),物理映射由BOOT引脚决定;
  3. 核心目的:启动文件完成内存段初始化(.data复制、.bss清零),为用户代码提供合法的运行环境。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:23:24

懒人专属!用预装MGeo的云端镜像3步完成地址清洗

懒人专属!用预装MGeo的云端镜像3步完成地址清洗 政务系统中经常遇到地址数据混乱的问题,比如"XX路1号"和"XX路01号"这种看似相同但写法不同的地址。传统正则表达式难以覆盖所有情况,而人工核对又耗时耗力。本文将介绍如何…

作者头像 李华
网站建设 2026/6/10 11:13:36

快递电子面单优化:基于MGeo云API的智能地址补全

快递电子面单优化:基于MGeo云API的智能地址补全实战 在物流行业中,手写面单识别错误导致的配送延迟问题长期困扰着企业运营。据统计,近30%的配送延误源于地址信息的手写识别误差。本文将介绍如何通过MGeo云API实现智能地址补全,在…

作者头像 李华
网站建设 2026/6/10 11:03:41

KETTLE vs 手动编程:ETL效率对比实验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个ETL效率对比测试平台。功能:1. 提供相同的数据处理任务(如CSV到数据库导入);2. 分别用KETTLE和Python实现;3. 自…

作者头像 李华
网站建设 2026/6/10 11:09:23

5分钟快速验证:替换CDN对网站速度的影响

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个Web工具原型,允许用户:1) 输入网站URL;2) 自动检测页面中的Google CDN资源;3) 一键替换为指定CDN;4) 使用Light…

作者头像 李华
网站建设 2026/6/10 11:05:53

MGeo地址匹配API的设计与封装实践

MGeo地址匹配API的设计与封装实践 在地理信息处理、物流调度、用户画像构建等实际业务场景中,地址数据的标准化与实体对齐是数据清洗环节的关键挑战。由于中文地址存在表述多样、缩写习惯差异、层级结构不统一等问题(如“北京市朝阳区” vs “北京朝阳”…

作者头像 李华
网站建设 2026/6/10 11:03:45

MGeo模型部署成本优化:按需使用云端GPU的实战技巧

MGeo模型部署成本优化:按需使用云端GPU的实战技巧 地址标准化是许多企业业务中不可或缺的环节,无论是物流配送、用户注册还是数据分析,都需要对地址信息进行规范化处理。MGeo作为达摩院与高德联合推出的多模态地理文本预训练模型,…

作者头像 李华