STM32F1 - 启动文件startup_stm32f10x_hd.s

startup_stm32f10x_hd.s

  • 1> 启动文件类型
  • 2> 启动文件干了点啥?
    • 2.1> 设置栈
    • 2.2> 设置堆
    • 2.3> 设置中断向量表
    • 2.4> 复位程序
    • 2.5> 中断服务函数
    • 2.6> 用户栈和堆的初始化
  • 3> __main库函数


1> 启动文件类型

标准库中提供:启动文件(汇编代码)
1

1
表格来自stm32f10x.h总结,省略STM32 value line devices系列产品


2> 启动文件干了点啥?


2.1> 设置栈

Set the initial SP

Stack_Size      EQU     0x00000400AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp           

定义栈空间大小:1KByte;

16进制0x400,也就是10进制的1024;

__initial_sp

__initial_sp 紧挨了SPACE放置,表示栈的结束地址,
栈是从高往低生长,结束地址就是栈顶地址。


2.2> 设置堆

Heap_Size       EQU     0x00000200AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

定义栈空间大小:0x200, 512Byte;


2.3> 设置中断向量表

; 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 HandlerDCD     MemManage_Handler          ; MPU Fault HandlerDCD     BusFault_Handler           ; Bus Fault HandlerDCD     UsageFault_Handler         ; Usage Fault HandlerDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     SVC_Handler                ; SVCall HandlerDCD     DebugMon_Handler           ; Debug Monitor HandlerDCD     0                          ; ReservedDCD     PendSV_Handler             ; PendSV HandlerDCD     SysTick_Handler            ; SysTick Handler; External InterruptsDCD     WWDG_IRQHandler            ; Window WatchdogDCD     PVD_IRQHandler             ; PVD through EXTI Line detectDCD     TAMPER_IRQHandler          ; TamperDCD     RTC_IRQHandler             ; RTCDCD     FLASH_IRQHandler           ; FlashDCD     RCC_IRQHandler             ; RCCDCD     EXTI0_IRQHandler           ; EXTI Line 0DCD     EXTI1_IRQHandler           ; EXTI Line 1DCD     EXTI2_IRQHandler           ; EXTI Line 2DCD     EXTI3_IRQHandler           ; EXTI Line 3DCD     EXTI4_IRQHandler           ; EXTI Line 4DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TXDCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1DCD     CAN1_SCE_IRQHandler        ; CAN1 SCEDCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5DCD     TIM1_BRK_IRQHandler        ; TIM1 BreakDCD     TIM1_UP_IRQHandler         ; TIM1 UpdateDCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and CommutationDCD     TIM1_CC_IRQHandler         ; TIM1 Capture CompareDCD     TIM2_IRQHandler            ; TIM2DCD     TIM3_IRQHandler            ; TIM3DCD     TIM4_IRQHandler            ; TIM4DCD     I2C1_EV_IRQHandler         ; I2C1 EventDCD     I2C1_ER_IRQHandler         ; I2C1 ErrorDCD     I2C2_EV_IRQHandler         ; I2C2 EventDCD     I2C2_ER_IRQHandler         ; I2C2 ErrorDCD     SPI1_IRQHandler            ; SPI1DCD     SPI2_IRQHandler            ; SPI2DCD     USART1_IRQHandler          ; USART1DCD     USART2_IRQHandler          ; USART2DCD     USART3_IRQHandler          ; USART3DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI LineDCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspendDCD     TIM8_BRK_IRQHandler        ; TIM8 BreakDCD     TIM8_UP_IRQHandler         ; TIM8 UpdateDCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and CommutationDCD     TIM8_CC_IRQHandler         ; TIM8 Capture CompareDCD     ADC3_IRQHandler            ; ADC3DCD     FSMC_IRQHandler            ; FSMCDCD     SDIO_IRQHandler            ; SDIODCD     TIM5_IRQHandler            ; TIM5DCD     SPI3_IRQHandler            ; SPI3DCD     UART4_IRQHandler           ; UART4DCD     UART5_IRQHandler           ; UART5DCD     TIM6_IRQHandler            ; TIM6DCD     TIM7_IRQHandler            ; TIM7DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End__Vectors_Size  EQU  __Vectors_End - __VectorsAREA    |.text|, CODE, READONLY

STM32F103中断向量表:
1
将中断向量表,用汇编语言,建立在Flash中,

__Vectors DCD __initial_sp ; Top of Stack
地址0x0000 0000存放的就是,栈指针SP;

DCD Reset_Handler
地址0x0000 0004存放的就是,复位函数指针;

从代码上看,向量表中存放的都是中断服务函数的函数名,函数名就是一个地址;


2.4> 复位程序

                AREA    |.text|, CODE, READONLY   
; Reset handler
Reset_Handler   PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0               LDR     R0, =__mainBX      R0ENDP

STM32F103上电执行的第1个程序Reset_Handler()
先调用SystemInit(){初始化时钟}
再调用main()函数


2.5> 中断服务函数

; 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
MemManage_Handler\PROCEXPORT  MemManage_Handler          [WEAK]B       .ENDP
BusFault_Handler\PROCEXPORT  BusFault_Handler           [WEAK]B       .ENDP
UsageFault_Handler\PROCEXPORT  UsageFault_Handler         [WEAK]B       .ENDP
SVC_Handler     PROCEXPORT  SVC_Handler                [WEAK]B       .ENDP
DebugMon_Handler\PROCEXPORT  DebugMon_Handler           [WEAK]B       .ENDP
PendSV_Handler  PROCEXPORT  PendSV_Handler             [WEAK]B       .ENDP
SysTick_Handler PROCEXPORT  SysTick_Handler            [WEAK]B       .ENDPDefault_Handler PROCEXPORT  WWDG_IRQHandler            [WEAK]EXPORT  PVD_IRQHandler             [WEAK]EXPORT  TAMPER_IRQHandler          [WEAK]EXPORT  RTC_IRQHandler             [WEAK]EXPORT  FLASH_IRQHandler           [WEAK]EXPORT  RCC_IRQHandler             [WEAK]EXPORT  EXTI0_IRQHandler           [WEAK]EXPORT  EXTI1_IRQHandler           [WEAK]EXPORT  EXTI2_IRQHandler           [WEAK]EXPORT  EXTI3_IRQHandler           [WEAK]EXPORT  EXTI4_IRQHandler           [WEAK]EXPORT  DMA1_Channel1_IRQHandler   [WEAK]EXPORT  DMA1_Channel2_IRQHandler   [WEAK]EXPORT  DMA1_Channel3_IRQHandler   [WEAK]EXPORT  DMA1_Channel4_IRQHandler   [WEAK]EXPORT  DMA1_Channel5_IRQHandler   [WEAK]EXPORT  DMA1_Channel6_IRQHandler   [WEAK]EXPORT  DMA1_Channel7_IRQHandler   [WEAK]EXPORT  ADC1_2_IRQHandler          [WEAK]EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]EXPORT  CAN1_RX1_IRQHandler        [WEAK]EXPORT  CAN1_SCE_IRQHandler        [WEAK]EXPORT  EXTI9_5_IRQHandler         [WEAK]EXPORT  TIM1_BRK_IRQHandler        [WEAK]EXPORT  TIM1_UP_IRQHandler         [WEAK]EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]EXPORT  TIM1_CC_IRQHandler         [WEAK]EXPORT  TIM2_IRQHandler            [WEAK]EXPORT  TIM3_IRQHandler            [WEAK]EXPORT  TIM4_IRQHandler            [WEAK]EXPORT  I2C1_EV_IRQHandler         [WEAK]EXPORT  I2C1_ER_IRQHandler         [WEAK]EXPORT  I2C2_EV_IRQHandler         [WEAK]EXPORT  I2C2_ER_IRQHandler         [WEAK]EXPORT  SPI1_IRQHandler            [WEAK]EXPORT  SPI2_IRQHandler            [WEAK]EXPORT  USART1_IRQHandler          [WEAK]EXPORT  USART2_IRQHandler          [WEAK]EXPORT  USART3_IRQHandler          [WEAK]EXPORT  EXTI15_10_IRQHandler       [WEAK]EXPORT  RTCAlarm_IRQHandler        [WEAK]EXPORT  USBWakeUp_IRQHandler       [WEAK]EXPORT  TIM8_BRK_IRQHandler        [WEAK]EXPORT  TIM8_UP_IRQHandler         [WEAK]EXPORT  TIM8_TRG_COM_IRQHandler    [WEAK]EXPORT  TIM8_CC_IRQHandler         [WEAK]EXPORT  ADC3_IRQHandler            [WEAK]EXPORT  FSMC_IRQHandler            [WEAK]EXPORT  SDIO_IRQHandler            [WEAK]EXPORT  TIM5_IRQHandler            [WEAK]EXPORT  SPI3_IRQHandler            [WEAK]EXPORT  UART4_IRQHandler           [WEAK]EXPORT  UART5_IRQHandler           [WEAK]EXPORT  TIM6_IRQHandler            [WEAK]EXPORT  TIM7_IRQHandler            [WEAK]EXPORT  DMA2_Channel1_IRQHandler   [WEAK]EXPORT  DMA2_Channel2_IRQHandler   [WEAK]EXPORT  DMA2_Channel3_IRQHandler   [WEAK]EXPORT  DMA2_Channel4_5_IRQHandler [WEAK]WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandlerB       .  ; 表示无限循环ENDPALIGN

启动文件中定义中断服务函数,用户使用需要在C文件中实现;


2.6> 用户栈和堆的初始化

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************IF      :DEF:__MICROLIB  EXPORT  __initial_spEXPORT  __heap_baseEXPORT  __heap_limit   ELSE      IMPORT  __use_two_region_memoryEXPORT  __user_initial_stackheap__user_initial_stackheapLDR     R0, =  Heap_MemLDR     R1, =(Stack_Mem + Stack_Size)LDR     R2, = (Heap_Mem +  Heap_Size)LDR     R3, = Stack_MemBX      LRALIGNENDIFEND

3> __main库函数

__mian会调用__user_initial_stackheap, 进行初始化堆栈;
堆栈初始化完成后,会调用C语言的main函数;

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

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

相关文章

ThinkPad X201 经典小黑 折腾玩

前段时间,在折腾ThinkPad T430时,偶然看到了ThinkPad X200,一个12.1英寸的高端便携小本。 想当年,但那是总裁级别才能用的,应该是接近2万元,我们是一直用DELL的。 没想到的是,在海鲜市场上&am…

基于modbus rtu协议操作PLC的EPICS示例

硬件设备 本实验中使用到的设备如下: 1、S7-200 Smart SR20 PLC 作为受控设备,执行机构。 S7-200 Smart是西门子的一款小型PLC产品(以下简称Smart系列)。 Smart系列PLC是西门子公司经过大量调研,为中国小型自动化…

Javaweb之SpringBootWeb案例之登录校验功能的详细解析

2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试,在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址:http://localhost:9528/#/system/dept,发现没有登录仍然可以进…

五、优化日程(Optimize Your Schedule)

3. Optimize Your Schedule 三、优化日程 The right length of time for focus is the time you have available.If you only have half an hour to squeeze in on a side project, then that’s the time you have.If you can devote a block of four hours every morning, ma…

async 与 await(JavaScript)

目录捏 前言一、async二、await三、使用方法总结 前言 async / await 是 ES2017(ES8) 提出的基于 Promise 解决异步的最终方案。上一篇文章介绍了 回调地狱 与 Promise(JavaScript),因为 Promise 的编程模型依然充斥着大量的 then 方法&#…

【力扣】查找总价格为目标值的两个商品,双指针法

查找总价格为目标值的两个商品原题地址 方法一:双指针 这道题和力扣第一题“两数之和”非常像,区别是这道题已经把数组排好序了,所以不考虑暴力枚举和哈希集合的方法,而是利用单调性,使用双指针求解。 考虑数组 pri…

可达鸭二月月赛——入门赛第四场(周三)题解

可达鸭二月月赛——入门赛第四场(周三)题解 博文作者:王胤皓 题目(可达鸭学员应该能打开,打不开的题解里有题目简述)题解(点击即可跳转,里面有我的名字)T1 小可喝水linkT2 \texttt{ }\texttt{ …

数据结构:双向链表

文章目录 1. 双向带头循环链表的结构2. 相关操作2.1 创建节点2.2 尾插2.3 头插2.4 打印2.5 尾删2.6 头删2.7 查找2.8 指定位置前/后插入2.9 删除指定位置的节点2.10 删除指定位置后的节点2.11 销毁链表 3.顺序表与链表区别 1. 双向带头循环链表的结构 与单链表不同的是&#xf…

详解计算机软件基本概念

软件基本概念 软件的定义 一个完整的计算机系统是由硬件系统和软件系统协同工作来完成某一给定的任务的。 只有硬件的计算机称为裸机,裸机必须安装了计算机软件后才可以完成各项任务。 从广义地讲,软件是指计算机程序、数据以及开发、使用和维护程序…

Python 视频转场特效处理笔记

本文参考Python-OpenCV 实现美图秀秀视频剪辑效果【特效】_opencv 多张图片 视频 特效-CSDN博客 最近研究了点python处理视频相关的东西,本文展示特效包括,竖向开幕/横向开幕,渐隐/渐显,推近/拉远,方形开幕&#xff0…

Excel——有效性、二级菜单联动

一、录入规范数据 1.手动输入序列录入有效性信息 选择需要录入有效性的所有单元格 选择【数据】——【有效性】——【有效性】 在【允许】输入的值之间选择【序列】 在【序列】输入框中输入想要选择的值,中间用逗号(必须是英文逗号)隔开 。…

Spring Authorization Server Spring Security密码加密

文章目录 一、修改密码编码器二、效果三、注意点1. RegisteredClient2. UserDetailsService 一、修改密码编码器 以BCryptPasswordEncoder举例。 直接将其注册成PasswordEncoder 的Bean即可。 Beanpublic PasswordEncoder passwordEncoder() {// 密码为明文方式 // ret…

【Qt学习笔记】Qt Creator环境下 信号与槽 详解(自定义信号槽、断连、lambda表达式等)

文章目录 1. 信号槽概念1.1 信号的本质1.2 槽的本质1.3 标准信号槽1.4 信号槽 实例 2. 自定义信号槽2.1 自定义槽函数2.2 自定义信号2.3 带参 信号槽 3. 信号槽的意义 与 作用4. 信号槽断连 (了解)5. lamda表达式的使用5.1 基本用法5.2 捕获局部变量5.3 …

JavaScript相关(一)——作用域

本篇将从JS的执行上下文开始,去理解:变量提升、 栈式调用、作用域和闭包。 参考: 浏览器工作原理与实践 JS执行上下文 执行上下文是 JavaScript 执行一段代码时的运行环境,比如调用一个函数,就会生成这个函数的执行…

『运维备忘录』之 Ansible 自动化运维工具

一、简介 Ansible是基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能的自动化运维工具,广泛用于配置管理、应用部署以及任务协…

ES节点故障的容错方案

ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…

DoWhy:Python 中的因果推断库

DoWhy:Python 中的因果推断库 DoWhy 是一个强大的 Python 库,用于因果推断和因果推断分析。本文将介绍 DoWhy 的基本概念、主要功能和使用方法,帮助读者了解如何利用该库进行因果推断,并解决因果关系的相关问题。 什么是DoWhy&…

备战蓝桥杯---动态规划(理论基础)

目录 动态规划的概念: 解决多阶段决策过程最优化的一种方法 阶段: 状态: 决策: 策略: 状态转移方程: 适用的基本条件 1.具有相同的子问题 2.满足最优子结构 3.满足无后效性 动态规划的实现方式…

2024年【R2移动式压力容器充装】考试内容及R2移动式压力容器充装免费试题

题库来源:安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试内容参考答案及R2移动式压力容器充装考试试题解析是安全生产模拟考试一点通题库老师及R2移动式压力容器充装操作证已考过的学员汇总,相对有效帮助R2移动式压力容器充装免费试题学…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…