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

STM32 从0开始系统学习3 启动流程

目录

写在前面

速通:做了什么:

分析I:分析2011年的startup文件所作

分析II:分析2017年的startup文件所作

Helps

2011

2017

Reference


写在前面

请各位看官看本篇笔记的时候首先了解一下计算机体系架构,了解基本的arm汇编后再来阅读此教程。当然不必深入,了解即可。

对于一些弱符号含义,笔者已经放到Help当中,请酌情参考(笔者不是特别熟悉ARM汇编)!

速通:做了什么:

这个是ST公司在startup_stm32f103xe.s文件的开头所写。

  1. 初始化堆栈指针 SP = _initial_sp

  2. 初始化程序计数器指针 PC = Reset_Handler

  3. 设置堆和栈的大小

  4. 初始化中断向量表

  5. 配置外部SRAM 作为数据存储器(可选)

  6. 配置系统时钟,通过调用SystemInit 函数(可选)

  7. 调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数

分析I:分析2011年的startup文件所作

老一部分的分析,笔者这里推介的是自己写的:

STM32启动流程简述_defined(stm32f103xe)-CSDN博客

现在看看有点太随意了,重新阐述一下:

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size      EQU     0x00000400
​
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

先说栈多大!熟悉操作系统的人都知道必须要首先定义栈的大小!这样的话才方便分配空间,同时这个栈就是我们操作数据保存数据的一个重要的中转点!

下一部分我们讨论的是对我们知道堆是程序运行中的一个重要的部分。(malloc在这里申请!)

; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
​
Heap_Size       EQU     0x00000200
​
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
​
                PRESERVE8
                THUMB

下面这里我们导出了一些符号,这些符号如果各位仔细看的话就是中断处理函数!也就是说STM32在发生中断时就会根据对应的中断类型跳转进入对应的中断处理子程序。 在这段程序的结尾定义了大小!

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
​
__Vectors       DCD     __initial_sp               ; Top of Stack
...
__Vectors_End
__Vectors_Size  EQU  __Vectors_End - __Vectors
​
                AREA    |.text|, CODE, READONLY
​

下面这个片段非常的重要因为它定义了我们STM32从上电到执行我们程序中最重要的几个部分:即首先执行了:SystemInit,然后跳转道__main函数,最终程序进入我们的main进行代码执行!

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 END

中间更大一部分定义了一些默认的中断处理子程序如果我们修改了这些子程序入口地址子,它也就会调用我们修改的而不是默认的!(当然不要直接汇编改,注册中断更为好!)

最后是:

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB           
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap
​
                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR
​
                 ALIGN
​
                 ENDIF
​
                 END
​
;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****

最后这一段无非就是在问是否定义了MICROLIB宏。如果使用了MICROLIB,那么程序的启动就使用St公司提供的微库!如果不是就,使用用户提供的初始化函数。

对比2017年St公司提供的汇编启动文件,11年的启动文件就显得相对的简单。

分析II:分析2017年的startup文件所作

对比来看,2017年的汇编文件使用的arm汇编更为现代(至少nasm味道很冲)。在开头定义和初始化了一些程序启动必备的段: .data 和 BSS 段。.data 段用于存放已初始化的全局和静态变量,而 BSS 段用于存放未初始化的全局和静态变量。

下面就是经典的初始化Reset处理程序以及告知到哪里跳转到main函数:

/**
 * @brief  This is the code that gets called when the processor first
 *          starts execution following a reset event. Only the absolutely
 *          necessary set is performed, after which the application
 *          supplied main() routine is called.
 * @param  None
 * @retval : None
*/
​
  .section .text.Reset_Handler
  .weak Reset_Handler
  .type Reset_Handler, %function
Reset_Handler:
​
/* 给时钟做初始化 */
/* Call the clock system initialization function.*/
    bl  SystemInit
​
/* Copy the data segment initializers from flash to SRAM */
  ldr r0, =_sdata
  ldr r1, =_edata
  ldr r2, =_sidata
  movs r3, #0
  b LoopCopyDataInit
​
/* 设置寄存器,准备好源地址和目的地址 */
CopyDataInit:
  ldr r4, [r2, r3]
  str r4, [r0, r3]
  adds r3, r3, #4
​
/* 循环体! */
LoopCopyDataInit:
  adds r4, r0, r3
  cmp r4, r1
  bcc CopyDataInit
  
/* Zero fill the bss segment. */
  ldr r2, =_sbss
  ldr r4, =_ebss
  movs r3, #0
  b LoopFillZerobss
​
FillZerobss:
  str  r3, [r2]
  adds r2, r2, #4
​
LoopFillZerobss:
  cmp r2, r4
  bcc FillZerobss
​
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
  bl main
  bx lr
.size Reset_Handler, .-Reset_Handler

在下面就比2011年的文件更加干净了,就是定义了tables和默认的处理子程序。而且没有废话。具体参考最下面我贴出来的文件。

Helps

2011

指令详细说明
EQUEQU 指令用于为一个数字常量取一个符号名,相当于 C 语言中的 #define。通过这种方式,可以为常量提供一个易于识别的名称,从而提高代码的可读性和可维护性。例如,可以使用 VALUE EQU 10 来定义一个名为 VALUE 的常量,其值为 10。可以联想到nasm的equ,一个意思!
AREAAREA 指令用于定义一个新的代码段或数据段。它可以指定段的名称、类型(如代码段或数据段),以及其他属性。在汇编程序中,代码和数据通常被组织成不同的区域,以便于管理和访问。
ALIGNALIGN 指令用于对齐数据或指令的存放地址。它通常需要跟一个立即数,表示对齐的字节数。默认情况下,缺省值为 4 字节对齐。对齐可以提高内存访问效率,确保数据在合适的地址边界上存放。(大部分架构要求严格的对齐!)
SPACESPACE 指令用于分配指定数量的字节内存空间。这可以用于为数据结构、数组或其他需要在内存中分配空间的元素分配内存。分配的内存不会被初始化。
PRESERVE8PRESERVE8 指令用于指定当前文件的堆栈需要按照 8 字节对齐。这在处理某些数据结构(如 64 位数据类型)时很重要,因为不正确的对齐可能会导致性能下降或硬件故障。
THUMBTHUMB 指令用于指示后续指令使用 THUMB 指令集,这是一种用于 ARM 处理器的指令集架构。Cortex-M 系列微控制器使用 THUMB-2 指令集,它支持 16 位和 32 位指令,旨在提高代码密度并减少内存占用。
EXPORTEXPORT 指令用于声明一个标号具有全局属性,这意味着该标号可以被其他外部文件访问。它用于模块化编程,使得不同模块之间可以共享函数或数据。
DCDDCD 指令用于以字节为单位分配内存,并要求内存按照 4 字节对齐,同时初始化这些内存。可以在指令后面跟随初始化值,通常用于定义常量数组或数据结构。
PROCPROC 指令用于定义一个子程序,与 ENDP 指令配对使用。它标志着一个子程序的开始和结束,允许代码的重用和结构化,提高程序的可读性和可维护性。
WEAKWEAK 指令用于声明一个弱定义的标号。如果外部文件中存在同名的标号,则优先使用外部文件定义的标号;如果没有定义,则使用当前文件中的定义。这在实现库时很有用,可以允许用户自定义某些功能,而不会导致链接错误。
IMPORTIMPORT 指令用于声明一个标号来自外部文件,类似于 C 语言中的 extern 关键字。这使得可以在当前汇编文件中引用其他模块或库中的标号。
LDRLDR 指令用于从存储器中加载一个字到指定的寄存器。它用于读取数据并将其存储在处理器的寄存器中,以便进行后续操作。这是 ARM 汇编语言中非常重要的一个指令,用于内存访问。
BLXBLX 指令用于跳转到由寄存器给出的地址,同时保存跳转前的下一条指令地址到链接寄存器(LR)。此指令还根据寄存器的最低有效位(LSE)确定处理器的状态,以支持 THUMB 指令集和 ARM 指令集之间的切换。
BXBX 指令用于跳转到由寄存器或标号给出的地址,并不保存返回地址。这在函数调用或中断处理时常用,以直接跳转到新的执行位置。
BB 指令用于无条件地跳转到一个标号,常用于控制程序的流程。这是实现循环和条件执行的基础。
IF, ELSE, ENDIF这些指令用于实现汇编条件分支语句,类似于 C 语言中的 ifelseendif 结构。它们允许在汇编代码中根据条件选择执行不同的代码块。
ENDEND 指令用于标记汇编文件的末尾,表示编译器可以停止处理该文件。这是每个汇编源文件的结束标志。

2017

伪指令含义
.syntax unified指定使用统一汇编语法,适用于 ARM 和 THUMB 模式。
.cpu cortex-m3指定目标 CPU 为 Cortex-M3。
.fpu softvfp指定使用软件浮点支持。
.thumb指定后续代码使用 THUMB 指令集。
.global声明全局符号,使得该符号在其他模块或文件中可被引用。
.word定义一个或多个字(4 字节)数据,通常用于定义内存地址或数据常量。
.equ定义常量,用于在代码中使用易读的符号名代替数值。
.section指定代码或数据的段(section),以组织代码和数据。
.weak声明弱符号,允许其他具有相同名称的符号覆盖该符号。
.type指定符号的类型,如函数或对象。
.size指定符号的大小,通常用于描述函数或数据段的长度。
.bss表示未初始化的数据段,通常用于分配内存。
.text指定代码段,用于放置程序的指令。
.data指定已初始化的数据段,用于存放已初始化的变量。
.isr_vector指定中断向量表段,通常用于定义中断处理程序的地址。
指令含义
bl分支到指定地址的函数,同时将返回地址存储到链接寄存器(LR),用于函数调用。
ldr从内存中加载一个字(4 字节)到指定的寄存器中。
str将寄存器中的值存储到内存中指定的地址。
movs将一个立即数移动到寄存器中,并更新状态寄存器的条件标志。
adds将两个寄存器的值相加,并将结果存储在第一个寄存器中,同时更新状态寄存器的条件标志。
cmp比较两个寄存器的值,并更新状态寄存器,以便进行条件跳转。
bcc如果前一次比较的结果小于,则进行条件跳转(无符号比较)。
b无条件跳转到指定的标签或地址。
bx跳转到寄存器中指定的地址,并返回到调用点。

Reference

;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name          : startup_stm32f10x_md.s
;* Author             : MCD Application Team
;* Version            : V3.5.0
;* Date               : 11-March-2011
;* Description        : STM32F10x Medium Density Devices vector table for MDK-ARM 
;*                      toolchain.  
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Set the initial PC == Reset_Handler
;*                      - Set the vector table entries with the exceptions ISR address
;*                      - Configure the clock system
;*                      - Branches to __main in the C library (which eventually
;*                        calls main()).
;*                      After Reset the CortexM3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>   
;*******************************************************************************
; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************
​
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
​
Stack_Size      EQU     0x00000400
​
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
​
​
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
​
Heap_Size       EQU     0x00000200
​
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
​
                PRESERVE8
                THUMB
​
​
; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
​
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler
​
                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
__Vectors_End
​
__Vectors_Size  EQU  __Vectors_End - __Vectors
​
                AREA    |.text|, CODE, READONLY
​
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
​
; Dummy Exception Handlers (infinite loops which can be modified)
​
NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP
​
Default_Handler PROC
​
                EXPORT  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]
​
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
​
                B       .
​
                ENDP
​
                ALIGN
​
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB           
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap
​
                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR
​
                 ALIGN
​
                 ENDIF
​
                 END
​
;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****
​

startup_stm32f103xe.s(2017)

/**
  *************** (C) COPYRIGHT 2017 STMicroelectronics ************************
  * @file      startup_stm32f103xe.s
  * @author    MCD Application Team
  * @brief     STM32F103xE Devices vector table for Atollic toolchain.
  *            This module performs:
  *                - Set the initial SP
  *                - Set the initial PC == Reset_Handler,
  *                - Set the vector table entries with the exceptions ISR address
  *                - Configure the clock system   
  *                - Configure external SRAM mounted on STM3210E-EVAL board
  *                  to be used as data memory (optional, to be enabled by user)
  *                - Branches to main in the C library (which eventually
  *                  calls main()).
  *            After Reset the Cortex-M3 processor is in Thread mode,
  *            priority is Privileged, and the Stack is set to Main.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2017-2021 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
​
  .syntax unified
  .cpu cortex-m3
  .fpu softvfp
  .thumb
​
.global g_pfnVectors
.global Default_Handler
​
/* start address for the initialization values of the .data section.
defined in linker script */
.word _sidata
/* start address for the .data section. defined in linker script */
.word _sdata
/* end address for the .data section. defined in linker script */
.word _edata
/* start address for the .bss section. defined in linker script */
.word _sbss
/* end address for the .bss section. defined in linker script */
.word _ebss
​
.equ  BootRAM,        0xF1E0F85F
/**
 * @brief  This is the code that gets called when the processor first
 *          starts execution following a reset event. Only the absolutely
 *          necessary set is performed, after which the application
 *          supplied main() routine is called.
 * @param  None
 * @retval : None
*/
​
  .section .text.Reset_Handler
  .weak Reset_Handler
  .type Reset_Handler, %function
Reset_Handler:
​
/* Call the clock system initialization function.*/
    bl  SystemInit
​
/* Copy the data segment initializers from flash to SRAM */
  ldr r0, =_sdata
  ldr r1, =_edata
  ldr r2, =_sidata
  movs r3, #0
  b LoopCopyDataInit
​
CopyDataInit:
  ldr r4, [r2, r3]
  str r4, [r0, r3]
  adds r3, r3, #4
​
LoopCopyDataInit:
  adds r4, r0, r3
  cmp r4, r1
  bcc CopyDataInit
  
/* Zero fill the bss segment. */
  ldr r2, =_sbss
  ldr r4, =_ebss
  movs r3, #0
  b LoopFillZerobss
​
FillZerobss:
  str  r3, [r2]
  adds r2, r2, #4
​
LoopFillZerobss:
  cmp r2, r4
  bcc FillZerobss
​
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
  bl main
  bx lr
.size Reset_Handler, .-Reset_Handler
​
/**
 * @brief  This is the code that gets called when the processor receives an
 *         unexpected interrupt.  This simply enters an infinite loop, preserving
 *         the system state for examination by a debugger.
 *
 * @param  None
 * @retval : None
*/
    .section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
  b Infinite_Loop
  .size Default_Handler, .-Default_Handler
/******************************************************************************
*
* The minimal vector table for a Cortex M3.  Note that the proper constructs
* must be placed on this to ensure that it ends up at physical address
* 0x0000.0000.
*
******************************************************************************/
  .section .isr_vector,"a",%progbits
  .type g_pfnVectors, %object
  .size g_pfnVectors, .-g_pfnVectors
​
​
g_pfnVectors:
​
  .word _estack
  .word Reset_Handler
  .word NMI_Handler
  .word HardFault_Handler
  .word MemManage_Handler
  .word BusFault_Handler
  .word UsageFault_Handler
  .word 0
  .word 0
  .word 0
  .word 0
  .word SVC_Handler
  .word DebugMon_Handler
  .word 0
  .word PendSV_Handler
  .word SysTick_Handler
  .word WWDG_IRQHandler
  .word PVD_IRQHandler
  .word TAMPER_IRQHandler
  .word RTC_IRQHandler
  .word FLASH_IRQHandler
  .word RCC_IRQHandler
  .word EXTI0_IRQHandler
  .word EXTI1_IRQHandler
  .word EXTI2_IRQHandler
  .word EXTI3_IRQHandler
  .word EXTI4_IRQHandler
  .word DMA1_Channel1_IRQHandler
  .word DMA1_Channel2_IRQHandler
  .word DMA1_Channel3_IRQHandler
  .word DMA1_Channel4_IRQHandler
  .word DMA1_Channel5_IRQHandler
  .word DMA1_Channel6_IRQHandler
  .word DMA1_Channel7_IRQHandler
  .word ADC1_2_IRQHandler
  .word USB_HP_CAN1_TX_IRQHandler
  .word USB_LP_CAN1_RX0_IRQHandler
  .word CAN1_RX1_IRQHandler
  .word CAN1_SCE_IRQHandler
  .word EXTI9_5_IRQHandler
  .word TIM1_BRK_IRQHandler
  .word TIM1_UP_IRQHandler
  .word TIM1_TRG_COM_IRQHandler
  .word TIM1_CC_IRQHandler
  .word TIM2_IRQHandler
  .word TIM3_IRQHandler
  .word TIM4_IRQHandler
  .word I2C1_EV_IRQHandler
  .word I2C1_ER_IRQHandler
  .word I2C2_EV_IRQHandler
  .word I2C2_ER_IRQHandler
  .word SPI1_IRQHandler
  .word SPI2_IRQHandler
  .word USART1_IRQHandler
  .word USART2_IRQHandler
  .word USART3_IRQHandler
  .word EXTI15_10_IRQHandler
  .word RTC_Alarm_IRQHandler
  .word USBWakeUp_IRQHandler
  .word TIM8_BRK_IRQHandler
  .word TIM8_UP_IRQHandler
  .word TIM8_TRG_COM_IRQHandler
  .word TIM8_CC_IRQHandler
  .word ADC3_IRQHandler
  .word FSMC_IRQHandler
  .word SDIO_IRQHandler
  .word TIM5_IRQHandler
  .word SPI3_IRQHandler
  .word UART4_IRQHandler
  .word UART5_IRQHandler
  .word TIM6_IRQHandler
  .word TIM7_IRQHandler
  .word DMA2_Channel1_IRQHandler
  .word DMA2_Channel2_IRQHandler
  .word DMA2_Channel3_IRQHandler
  .word DMA2_Channel4_5_IRQHandler
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word BootRAM       /* @0x1E0. This is for boot in RAM mode for
                         STM32F10x High Density devices. */
​
/*******************************************************************************
*
* Provide weak aliases for each Exception handler to the Default_Handler.
* As they are weak aliases, any function with the same name will override
* this definition.
*
*******************************************************************************/
​
  .weak NMI_Handler
  .thumb_set NMI_Handler,Default_Handler
​
  .weak HardFault_Handler
  .thumb_set HardFault_Handler,Default_Handler
​
  .weak MemManage_Handler
  .thumb_set MemManage_Handler,Default_Handler
​
  .weak BusFault_Handler
  .thumb_set BusFault_Handler,Default_Handler
​
  .weak UsageFault_Handler
  .thumb_set UsageFault_Handler,Default_Handler
​
  .weak SVC_Handler
  .thumb_set SVC_Handler,Default_Handler
​
  .weak DebugMon_Handler
  .thumb_set DebugMon_Handler,Default_Handler
​
  .weak PendSV_Handler
  .thumb_set PendSV_Handler,Default_Handler
​
  .weak SysTick_Handler
  .thumb_set SysTick_Handler,Default_Handler
​
  .weak WWDG_IRQHandler
  .thumb_set WWDG_IRQHandler,Default_Handler
​
  .weak PVD_IRQHandler
  .thumb_set PVD_IRQHandler,Default_Handler
​
  .weak TAMPER_IRQHandler
  .thumb_set TAMPER_IRQHandler,Default_Handler
​
  .weak RTC_IRQHandler
  .thumb_set RTC_IRQHandler,Default_Handler
​
  .weak FLASH_IRQHandler
  .thumb_set FLASH_IRQHandler,Default_Handler
​
  .weak RCC_IRQHandler
  .thumb_set RCC_IRQHandler,Default_Handler
​
  .weak EXTI0_IRQHandler
  .thumb_set EXTI0_IRQHandler,Default_Handler
​
  .weak EXTI1_IRQHandler
  .thumb_set EXTI1_IRQHandler,Default_Handler
​
  .weak EXTI2_IRQHandler
  .thumb_set EXTI2_IRQHandler,Default_Handler
​
  .weak EXTI3_IRQHandler
  .thumb_set EXTI3_IRQHandler,Default_Handler
​
  .weak EXTI4_IRQHandler
  .thumb_set EXTI4_IRQHandler,Default_Handler
​
  .weak DMA1_Channel1_IRQHandler
  .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
​
  .weak DMA1_Channel2_IRQHandler
  .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
​
  .weak DMA1_Channel3_IRQHandler
  .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
​
  .weak DMA1_Channel4_IRQHandler
  .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
​
  .weak DMA1_Channel5_IRQHandler
  .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
​
  .weak DMA1_Channel6_IRQHandler
  .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
​
  .weak DMA1_Channel7_IRQHandler
  .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
​
  .weak ADC1_2_IRQHandler
  .thumb_set ADC1_2_IRQHandler,Default_Handler
​
  .weak USB_HP_CAN1_TX_IRQHandler
  .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler
​
  .weak USB_LP_CAN1_RX0_IRQHandler
  .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler
​
  .weak CAN1_RX1_IRQHandler
  .thumb_set CAN1_RX1_IRQHandler,Default_Handler
​
  .weak CAN1_SCE_IRQHandler
  .thumb_set CAN1_SCE_IRQHandler,Default_Handler
​
  .weak EXTI9_5_IRQHandler
  .thumb_set EXTI9_5_IRQHandler,Default_Handler
​
  .weak TIM1_BRK_IRQHandler
  .thumb_set TIM1_BRK_IRQHandler,Default_Handler
​
  .weak TIM1_UP_IRQHandler
  .thumb_set TIM1_UP_IRQHandler,Default_Handler
​
  .weak TIM1_TRG_COM_IRQHandler
  .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler
​
  .weak TIM1_CC_IRQHandler
  .thumb_set TIM1_CC_IRQHandler,Default_Handler
​
  .weak TIM2_IRQHandler
  .thumb_set TIM2_IRQHandler,Default_Handler
​
  .weak TIM3_IRQHandler
  .thumb_set TIM3_IRQHandler,Default_Handler
​
  .weak TIM4_IRQHandler
  .thumb_set TIM4_IRQHandler,Default_Handler
​
  .weak I2C1_EV_IRQHandler
  .thumb_set I2C1_EV_IRQHandler,Default_Handler
​
  .weak I2C1_ER_IRQHandler
  .thumb_set I2C1_ER_IRQHandler,Default_Handler
​
  .weak I2C2_EV_IRQHandler
  .thumb_set I2C2_EV_IRQHandler,Default_Handler
​
  .weak I2C2_ER_IRQHandler
  .thumb_set I2C2_ER_IRQHandler,Default_Handler
​
  .weak SPI1_IRQHandler
  .thumb_set SPI1_IRQHandler,Default_Handler
​
  .weak SPI2_IRQHandler
  .thumb_set SPI2_IRQHandler,Default_Handler
​
  .weak USART1_IRQHandler
  .thumb_set USART1_IRQHandler,Default_Handler
​
  .weak USART2_IRQHandler
  .thumb_set USART2_IRQHandler,Default_Handler
​
  .weak USART3_IRQHandler
  .thumb_set USART3_IRQHandler,Default_Handler
​
  .weak EXTI15_10_IRQHandler
  .thumb_set EXTI15_10_IRQHandler,Default_Handler
​
  .weak RTC_Alarm_IRQHandler
  .thumb_set RTC_Alarm_IRQHandler,Default_Handler
​
  .weak USBWakeUp_IRQHandler
  .thumb_set USBWakeUp_IRQHandler,Default_Handler
​
  .weak TIM8_BRK_IRQHandler
  .thumb_set TIM8_BRK_IRQHandler,Default_Handler
​
  .weak TIM8_UP_IRQHandler
  .thumb_set TIM8_UP_IRQHandler,Default_Handler
​
  .weak TIM8_TRG_COM_IRQHandler
  .thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler
​
  .weak TIM8_CC_IRQHandler
  .thumb_set TIM8_CC_IRQHandler,Default_Handler
​
  .weak ADC3_IRQHandler
  .thumb_set ADC3_IRQHandler,Default_Handler
​
  .weak FSMC_IRQHandler
  .thumb_set FSMC_IRQHandler,Default_Handler
​
  .weak SDIO_IRQHandler
  .thumb_set SDIO_IRQHandler,Default_Handler
​
  .weak TIM5_IRQHandler
  .thumb_set TIM5_IRQHandler,Default_Handler
​
  .weak SPI3_IRQHandler
  .thumb_set SPI3_IRQHandler,Default_Handler
​
  .weak UART4_IRQHandler
  .thumb_set UART4_IRQHandler,Default_Handler
​
  .weak UART5_IRQHandler
  .thumb_set UART5_IRQHandler,Default_Handler
​
  .weak TIM6_IRQHandler
  .thumb_set TIM6_IRQHandler,Default_Handler
​
  .weak TIM7_IRQHandler
  .thumb_set TIM7_IRQHandler,Default_Handler
​
  .weak DMA2_Channel1_IRQHandler
  .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
​
  .weak DMA2_Channel2_IRQHandler
  .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
​
  .weak DMA2_Channel3_IRQHandler
  .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
​
  .weak DMA2_Channel4_5_IRQHandler
  .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler

http://www.kler.cn/a/374841.html

相关文章:

  • 【day14】异常处理与Object类深入解析
  • shardingsphere分库分表项目实践1-让shardingsphere运行起来
  • 【QSS样式表 - ⑥】:QPushButton控件样式
  • Java - 日志体系_Apache Commons Logging(JCL)日志接口库
  • Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器
  • Go怎么做性能优化工具篇之基准测试
  • redis为什么快
  • 什么是React.js,有什么特点
  • 常见生成式模型汇总
  • Spark的集群环境部署
  • 自动化测试工具Ranorex Studio(十八)-调用用户定义的action
  • day-77 超级饮料的最大强化能量
  • .net Core 使用Panda.DynamicWebApi动态构造路由
  • qt QDoubleSpinBox详解
  • 第15课 算法(下)
  • 使用 Cloudreve 搭建你的专属个人网盘
  • 分布式 ID 生成策略(一)
  • 如何提高社媒品牌知名度,3个增加曝光的实操方法
  • 微信小程序服务通知
  • 【HarmonyOS NEXT】在 HarmonyOS NEXT 中实现优雅的加载动画
  • python 五子棋小游戏
  • GIN 反向代理功能
  • C/C++ 每日一练:二叉树的先序遍历
  • Webserver(2.6)信号
  • 信号完整性SI总结【小登培训】
  • OpenCV基础知识