当前位置: 首页 > news >正文

STM32F10X 启动文件完整分析

最近在准备面试相关 顺便复盘总结一下之前的内容
启动文件在基于ARM的芯片是很重要的组成部分,它主要负责完成芯片上电启动时的一系列初始化工作和各种异常及中断的入口地址。
也是理解bootloader自举的关键点,所以需要理解一下

1. 向量表定义

启动文件的开头部分定义了中断向量表,它是一个存储中断服务程序入口地址的数组。在 STM32F103 中,中断向量表包含了初始堆栈指针(Initial Stack Pointer,ISP)和各种异常及中断的入口地址。

; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_Size__Vectors 		DCD     __initial_sp               ; Top of StackDCD     Reset_Handler              ; Reset HandlerDCD     NMI_Handler                ; NMI HandlerDCD     HardFault_Handler          ; Hard Fault Handler; 其他异常和中断向量...
__Vectors_End
__Vectors_Size  EQU  __Vectors_End - __Vectors

首先,里面设计四个汇编语言伪指令,先说明一下伪指令的功能

-1. AREA 伪指令用于定义一个代码段或数据段,在程序的组织和内存管理中起着重要作用

语法
AREA 段名, 属性1 [, 属性2, ..., 属性n]属性:用于指定该区域的特性,常见的属性有以下几种:
CODE:表示该区域是代码段,存储程序的指令代码,通常具有只读和可执行的属性。
DATA:表示该区域是数据段,存储程序中使用的数据,如变量、常量等。
READONLY:指定该区域是只读的,不允许进行写操作。
READWRITE:指定该区域是可读写的。
ALIGN = n:指定该区域的起始地址按 n 字节对齐,n 通常是 2 的幂次方,如 1、2、4、8 等。
NOINIT:表示该区域的数据不需要初始化,通常用于定义未初始化的数据段。
。

在这里定义了一个名为 RESET 的属性为只读的数据段

  • 2.EXPORT 伪指令的主要作用是将符号(比如变量、函数等)导出为全局符号,这样一来,这个符号就能够被其他汇编文件或者链接单元访问。在模块化的程序设计中,各个模块可能会被分别编译,然后再通过链接器将它们组合成一个完整的可执行文件。借助
    EXPORT 指令,不同模块之间就可以共享某些符号,从而实现模块间的交互与协作。
语法
EXPORT 符号名 [, WEAK]
符号名:这是需要被导出的符号的名称,它可以是变量名、函数名等。符号名要符合汇编语言对于标识符的命名规则。
[WEAK](可选):这是一个可选的修饰符。当使用 WEAK 修饰时,表示该符号是一个弱符号。弱符号意味着如果在其他地方有相同名称的强符号定义,链接器会优先使用强符号;只有当没有强符号定义时,才会使用这个弱符号。

**在这里是输出了3个共享变量,使其成为全局变量。分别是__Vectors向量表/数组的起始地址和结束地址__Vectors_End 向量表大小__Vectors_Size **

  • 3.DCD 是 “Define Constant Doubleword” 的缩写,意思是定义双字(32 位)常量。它的主要功能是在内存中分配一定的存储空间,并将指定的数据(通常是 32 位的值)存储到该空间中。
语法
[标号:] DCD 表达式1 [, 表达式2, ..., 表达式n]
标号(可选):为当前存储单元指定一个名称,方便在程序的其他地方引用该地址。标号需遵循汇编语言关于标识符的命名规则。
表达式:可以是常量、变量地址、表达式计算结果等,每个表达式代表一个 32 位的数据。多个表达式之间用逗号分隔,表示依次在内存中存储这些数据。

在这个示例中,DCD 指令用于定义中断向量表,依次存储了初始堆栈指针和各个中断处理函数的入口地址。当发生相应的中断时,系统会根据中断向量表中的地址跳转到对应的中断处理函数执行。

  • 4.EQU伪指令 euqate缩写 用于给一个符号名赋予一个特定的值,在后续的程序里,这个符号名就可以当作该值的替代来使用。
语法
符号名 EQU 表达式
符号名:是用户自定义的一个标识符,用来代表后面的表达式的值。它需遵循汇编语言关于标识符的命名规则,通常由字母、数字和下划线组成,且不能以数字开头。
表达式:可以是一个常量、数值、地址、寄存器编号或者由它们通过运算符组合而成的式子。

中断向量表的地址这么定义好了

2.堆栈初始化

; Stack ConfigurationAREA    STACK, NOINIT, READWRITE, ALIGN=3
__stack_size    EQU     0x00000400
__initial_sp
Stack_Mem       SPACE   __stack_size
__top_of_stackHeap_Size       EQU     0x00000200AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limitPRESERVE8THUMB

出现了新的伪指令是SPACE

  • 5.SPACE 伪指令是一种用于为程序预留存储空间的重要工具,
语法
label SPACE count
label:可选参数,用于标识预留空间的起始地址,后续可通过该标签引用这块预留的内存区域。
count:必填参数,指定要预留的字节数。

在这里,为Stack_Mem栈预留__stack_size大小的空间, __initial_sp 写在这里如何解释为栈的起始地址, 同问,__top_of_stack为啥是栈顶的地址

PRESERVE8、THUMB指令8字节对齐
THUMB:伪指令,表明从这里开始的代码将使用 Thumb 指令集进行汇编。这两个简单介绍即可

3. 复位处理函数
AREA    |.text|, CODE, READONLY; Reset handler
Reset_Handler   PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0               LDR     R0, =__mainBX      R0ENDP

复位处理函数Reset hander 是芯片上电复位后执行的第一个函数,它主要完成系统时钟配置、初始化数据段等工作,然后跳转到用户的主函数。

  • 6.伪指令 PROC和ENDP 用于定义一个子程序,这里定义了Reset_Handler子程序
  • 7.IMPORT伪指令用于导入外部符号,这里导入了__main和SystemInit函数
  • 8.LDR指令将函数地址加载到寄存器R0中,
  • 9.BLX和BX用于调用函数。
  • 在这里插入图片描述
    在这里插入图片描述
4. 异常和中断处理函数
; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler     PROCEXPORT  NMI_Handler                [WEAK]B       .ENDP
HardFault_Handler\PROCEXPORT  HardFault_Handler          [WEAK]B       .ENDP

B . B表示跳转指令 .b表示当前地址 表示

5. 数据段初始化

在复位处理函数中,通常会调用一些函数来初始化数据段(如 .data 和 .bss 段),确保全局变量和静态变量能够正确初始化。不过,这些代码可能在链接器脚本或其他库文件中实现,启动文件中一般不直接体现。

比如STM32 链接器脚本的处理位置在
在这里插入图片描述

综上所述,STM32F103 启动文件通过定义中断向量表、初始化堆栈、实现复位处理函数和异常中断处理函数等,为芯片的正常启动和运行提供了必要的基础。

根据AN2606应用手册,
bootloader 存储在STM32设备的系统存储器,是由ST在生产线期间写入的,主要任务是下载应用程序到内部Flash通过可支持的接口(如USART、CAN、USB、I2C、SPI)

通用的bootloader描述
4.1 bootloader激活
4.2 bootloader 识别
4.3 bootloader连接要求
4.4 bootloader内存管理
4.5 UART波特率检测
4.6 编程约束
4.7 exitsecurememory 特性

实际上,STM32 通过启动模式选择,程序从哪里启动,三个选项,闪存,系统存储器(内置ST写的bootloader),或SRAM(适合调试阶段,快速加载和运行代码,无需烧录到内存,程序大小需要不超过SRAM大小)

写的有点枯燥 ,暂时写这么多吧

相关文章:

STM32F10X 启动文件完整分析

最近在准备面试相关 顺便复盘总结一下之前的内容 启动文件在基于ARM的芯片是很重要的组成部分,它主要负责完成芯片上电启动时的一系列初始化工作和各种异常及中断的入口地址。 也是理解bootloader自举的关键点,所以需要理解一下 1. 向量表定义 启动文件…...

typescript快速入门之安装与运行

安装 安装ts环境,最好全局安装,这样就不需要开一个项目又安装 npm i -g typescript初始化 可以运行初始化配置文件,也可以手动生成;不生成的话会运行默认配置 使用默认配置 把ts文件转成js文件使用的是es3语言,语…...

React源码解读

配置React源码本地调试环境 本次环境构建采用了node版本为16、react-scripts 版本号为 3.4.4,源码下载地址 react源码调试: react源码调试环境 使用 create-react-app 脚手架创建项目 npx create-react-app react-test 进入刚刚下载的目录,弹射 crea…...

【DeepSeek-R1】 API申请(火山方舟联网版)

DeepSeek-R1 API申请(火山方舟联网版) 1、新建联网版应用2、开通信息增强服务3、开启联网内容插件4、创建接入点5、获取模型名称6、获取API Key 如果第一次注册账号,请先按照文章《【Deepseek-R1】 API申请(火山方舟)》…...

负载均衡集群——LVS-DR配置

一、简介 1.1 什么是集群? 两台及以上的计算机完成一个任务的模式称为集群。 常见的集群类型包括: LB(负载均衡)集群:按照不同的算法将前端的访问转发给后端计算点,使节点负载相对平衡。提高并发能力 缺…...

数据结构篇

链表 用数组模拟链表,看该链表结构,有几个域则用几个数组分别存储 单链表是只知道下一个元素位置,双链表还知道上一个链表位置 单链表 双向链表 左移右移 栈 模拟栈 判断括号序列 队列 模拟队列 递归 集合和哈希 集合就是哈希表 哈希表的实现…...

「软件设计模式」建造者模式(Builder)

深入解析建造者模式:用C打造灵活对象构建流水线 引言:当对象构建遇上排列组合 在开发复杂业务系统时,你是否经常面对这样的类:它有20个成员变量,其中5个是必填项,15个是可选项。当用户需要创建豪华套餐A&…...

Matlab 机器人 雅可比矩阵

工业机器人运动学与Matlab正逆解算法学习笔记(用心总结一文全会)(四)——雅可比矩阵_staubli机器人正逆向运动学实例验证matlab-CSDN博客 matlab求雅可比矩阵_六轴机械臂 矢量积法求解雅可比矩阵-CSDN博客 (63 封私信 / 80 条消息…...

DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

IntelliJ IDEA 2024.1.4版无Tomcat配置

IntelliJ IDEA 2024.1.4 (Ultimate Edition) 安装完成后,调试项目发现找不到Tomcat服务: 按照常规操作添加,发现服务插件中没有Tomcat。。。 解决方法 1、找到IDE设置窗口 2、点击Plugins按钮,进入插件窗口,搜索T…...

chrome://version/

浏览器输入: chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) (64 位) (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…...

知识图谱数据库 Neo4j in Docker笔记

下载 docker pull neo4j:community官方说明 https://neo4j.com/docs/operations-manual/2025.01/docker/introduction/ 启动 docker run \--restart always \--publish7474:7474 --publish7687:7687 \--env NEO4J_AUTHneo4j/your_password \--volumeD:\files\knowledgegrap…...

【动手学强化学习】02多臂老虎机

问题定义 强化学习关注的是在于环境交互中学习,是一种试错学习的范式。在正式进入强化学习之前,我们先来了解多臂老虎机问题。该问题也被看作简化版的强化学习,帮助我们更快地过度到强化学习阶段。 有一个拥有 K K K 根拉杆的老虎机&#…...

【网络编程】之Udp网络通信步骤

【网络编程】之Udp网络通信步骤 TCP网络通信TCP网络通信的步骤对于服务器端对于客户端 TCP实现echo功能代码实现服务器端getsockname函数介绍 客户端效果展示 对比两组函数 TCP网络通信 TCP网络通信的步骤 对于服务器端 创建监听套接字。(调用socket函数&#xff…...

Java 基于 SpringBoot+Vue 的家政服务管理平台设计与实现

博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&#x1f447…...

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明: 一、Nginx 的核心功能 1. 静态资源服务 功能:直接返回静态文件(如 HTML、CSS、JS、图片、视频等)。配置示例:server {listen 80…...

Spring Boot中使用Flyway进行数据库迁移

文章目录 概要Spring Boot 集成 FlywayFlyway 其他用法bug错误Flyway版本不兼容数据库存在表了Flyway 的校验和(Checksum)不匹配 概要 在 Spring Boot 项目开发中,数据库的变更不可避免。手动执行 SQL 脚本不仅容易出错,也难以维…...

CAS单点登录(第7版)9.属性

如有疑问,请看视频:CAS单点登录(第7版) 属性 属性定义 概述 属性定义 从身份验证或属性存储库源获取和解析 CAS 中属性的定义时,往往使用其名称进行定义和引用,而无需任何其他元数据或修饰。例如&#…...

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...

P9853 [入门赛 #17] 方程求解

P9853 [入门赛 #17] 方程求解 - 洛谷 题目描述 小A有n个关于x的方程,第i个方程形如ai​xi​bi​ci​。方程的解x均为正整数,例如下面几个方程都是符合要求的方程: 2x 4 10 -3x 13 10 4x - 8 16 其中,第一组方程的解为x1​…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...