当前位置:首页 > 技术 > 正文内容

STM32启动文件机制深度剖析

访客 技术 2026年7月30日 1

启动过程核心解析

芯片启动文件是程序执行的初始阶段,深入分析可掌握处理器架构、指令集及中断处理逻辑。本文以STM32F10x系列为例,详解Cortex-M3启动流程。

启动阶段总览

从上电至main函数执行包含以下阶段:

  1. 硬件自动加载SP与PC
  2. 系统时钟初始化
  3. 软件栈指针配置
  4. .data段加载与.bss段清零
  5. 跳转至main函数

关键文件包括startup_stm32f10x_hd.s及链接器生成的entry系列模块。

Flash存储布局

程序在Flash中的结构:

  • 初始栈顶指针(MSP)
  • 异常向量表
  • 外部中断向量表
  • 代码段
  • 初始化数据段(.data)
  • 未初始化数据段(.bss)

数据加载参数包含源地址(如0x0800033C)、目标地址(如0x20000000)及数据长度(如0x0000000C)。

SRAM运行时结构

执行main函数时SRAM布局:

  • 栈区域(向下增长)
  • .data段(已初始化变量)
  • .bss段(零初始化变量)
  • 堆区域(可选)

启动流程详解

1. 硬件初始化SP/PC

上电后从向量表获取初始值:

SP = *(0x08000000)  // 栈顶地址
PC = *(0x08000004)  // 复位处理函数地址

2. 系统时钟配置

通过SystemInit函数初始化时钟树,示例指令:

LDR R0, =SystemInit
BLX R0

3. 软件栈设置

__main段调整栈指针:

LDR SP, [PC, #12]  // 更新SP值

4. 数据加载与初始化

__scatterload_rt2循环执行:

load_loop:
  LDR R3, [R4, #12]
  ORR R3, R3, #1
  LDM R4, {R0-R2}
  BLX R3
  ADD R4, #0x10
  CMP R4, R5
  BCC load_loop

关键函数重写示例:

data_copy:        // 数据复制函数
  B check_size
copy_block:
  LDR R6, [R7], #4
  STR R6, [R8], #4
  SUB R9, #4
check_size:
  CMP R9, #0
  BNE copy_block
  BX LR

mem_zero:         // 内存清零函数
  MOV R6, #0
zero_loop:
  STR R6, [R7], #4
  SUB R8, #4
  CMP R8, #0
  BNE zero_loop
  BX LR

5. 跳转至main

__main_init:
  LDR R0, =main
  BX R0

中断向量表实现

向量表示例:

AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors DCD __initial_sp
          DCD Reset_Handler
          DCD NMI_Handler
          ... // 其他中断向量

弱符号机制允许覆盖默认处理函数:

; 汇编文件
NMI_Handler PROC
  EXPORT NMI_Handler [WEAK]
  B .
  ENDP

// C文件
void NMI_Handler(void) {
  // 用户自定义实现
}

微库与标准库差异

关键区别:

  • 微库:无需堆初始化,启动流程简化
  • 标准库:需初始化堆内存,增加额外步骤

堆栈初始化代码对比:

IF :DEF:__MICROLIB
  // 微库直接导出符号
ELSE
  // 标准库需配置双区域内存
  __user_initial_stackheap
    LDR R0, =Heap_Start
    LDR R1, =(Stack_End)
    LDR R2, =Heap_End
    LDR R3, =Stack_Start
    BX LR
ENDIF
标签: STM32

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。