1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

分析启动文件(stm32里面的)

启动文件由汇编编写,是系统上电复位后第一个执行的程序

主要做以下工作:

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

  2. 初始化pc指针=Reset_Handler

  3. 初始化中断向量表

  4. 配置系统时钟

  5. 调用c库函数main初始化用户堆栈,从而最终调用main函数去到c的世界

接下来分析启动文件:

  1. ;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************  ;* File Name          : startup_stm32f10x_hd.s  ;* Author             : MCD Application Team  ;* Version            : V3.5.0  ;* Date               : 11-March-2011  ;* Description        : STM32F10x High Density Devices vector table for MDK-ARM   ;*                      toolchain.   ;*                      This module performs:  ;*               初始化堆栈指针   - Set the initial SP,  ;*              初始化pc指针=Reset_Handler   - Set the initial PC == Reset_Handler  ;*             初始化中断向量表  - Set the vector table entries with the exceptions ISR address  ;*      配置系统时钟  - Configure the clock system and also configure the external   ;*                 SRAM mounted on STM3210E-EVAL board to be used as data   ;*                        memory (optional, to be enabled by user)  ;*                    调用c库函数main初始化用户堆栈,从而最终调用main函数去到c的世界  - 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配置栈,(栈是一片内存,是用来放是存放变量,函数调用)
  2. ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>  ; </h>    Stack_Size      EQU     0x00000400;EQU类似c中的define                    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;当前堆栈以8字节对齐                  THUMB    ;3-初始化中断向量表  ; Vector Table Mapped to Address 0 at Reset                  AREA    RESET, DATA, READONLY                  EXPORT  __Vectors  ;EXPORT定义的变量具有全局性,可供外部使用                  EXPORT  __Vectors_End                  EXPORT  __Vectors_Size                  ;DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存    __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 & ADC2                  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                  DCD     TIM8_BRK_IRQHandler        ; TIM8 Break                  DCD     TIM8_UP_IRQHandler         ; TIM8 Update                  DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation                  DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare                  DCD     ADC3_IRQHandler            ; ADC3                  DCD     FSMC_IRQHandler            ; FSMC                  DCD     SDIO_IRQHandler            ; SDIO                  DCD     TIM5_IRQHandler            ; TIM5                  DCD     SPI3_IRQHandler            ; SPI3                  DCD     UART4_IRQHandler           ; UART4                  DCD     UART5_IRQHandler           ; UART5                  DCD     TIM6_IRQHandler            ; TIM6                  DCD     TIM7_IRQHandler            ; TIM7                  DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1                  DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2                  DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3                  DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5  __Vectors_End    __Vectors_Size  EQU  __Vectors_End - __Vectors                    AREA    |.text|, CODE, READONLY    ;4-复位程序                ; Reset handler  Reset_Handler   PROC;定义子程序                  EXPORT  Reset_Handler             [WEAK]  ;weak叫弱定义,就是说可以由其他文件来实现,如果其他文件定义了,在启动的时候就调用自己定义的,如果没有就执行汇编定义的
  3.                 IMPORT  __main;相当c语言当中的extern                  IMPORT  SystemInit;系统时钟配置函数                  LDR     R0, =SystemInit                  BLX     R0                                 LDR     R0, =__main                  BX      R0                  ENDP  ;5-中断服务函数                  ; 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]                  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_IRQHandler                  B       .                    ENDP                    ALIGN  ;6-堆栈的初始化,这个是由c库函数_main函数来实现  ;*******************************************************************************  ; User Stack and Heap initialization  ;*******************************************************************************                   IF      :DEF:__MICROLIB    ;在ide(开发环境)里面定义                                     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*****

微信扫码关注

更新实时通知

作者:xiao 分类:硬件笔记 浏览: