STM32F107启动文件分析(startup_stm32f10x_hd.s)

配置栈

Stack_Size      EQU    0x00000400      

;定义栈空间大小0x00000400个字节,即1Kbyte

                AREA    STACK, NOINIT, READWRITE, ALIGN=3

;伪指令AREA,定义一个新的代码段或者数据段

;STACK:段名,可以是任何段名。但是以一个数字开始的名称必须包含在竖杠号内,否则会产生一个缺失段名错误,例如,|1_DataArea|。有些名称是习惯性的名称,例如,|.text|用于表示由C 代码产生的代码段,或用于以某种方式与C 库关联的代码段。

;NOINIT:表示数据段是未初始化的或初始化为零。其只包含零初始化的空间保留命令SPACE 或DCB、DCD、DCDU、DCQ、DCQU、DCW 或DCWU。可以决定在链接时AREA 是未初始化的还是零初始化的。此处还可以为CODE、DATA等。

; READWRITE:表示此段可以读写,这是数据区域的默认情况

; ALIGN=3: ELF (可执行连接文件)的代码段和数据段是按2的多少次方的字节来对齐的,可以是0~31。默认情况下,ELF 在4字节边界上对齐。这里表示以8字节对齐

Stack_Mem       SPACE  Stack_Size

;分配一块Stack_Size大小的内存空间作为栈

__initial_sp

;表示栈空间顶地址

 

配置堆

Heap_Size       EQU    0x00000200

;定义堆空间大小0x00000200个字节,即512byte

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

;同上

__heap_base

;表示堆空间起始地址

Heap_Mem        SPACE  Heap_Size

;分配一块Heap_Size大小的内存空间作为堆

__heap_limit

;表示堆空间的结束地址

 

声明代码对齐方式和指令集

PRESERVE8

;指定了以下代码以8byte对齐

                THUMB

;指定了以下代码为Thumb指令集

 

中断向量表

                AREA    RESET, DATA, READONLY

;同上

                EXPORT  __Vectors        ;中断向量表入口地址

                EXPORT  __Vectors_End        ;中断向量表结束地址

                EXPORT  __Vectors_Size        ;中断向量表大小

;将__Vector、__Vectors_End和__Vectors_Size声明为全局标号,以便外部文件使用该标号

__Vectors       DCD    __initial_sp               ; Topof 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

;以上汇编代码是建立中断向量表,DCD表示分配一段数据区并用其后面的程序标号初始化

__Vectors_Size  EQU __Vectors_End - __Vectors

;获取中断向量表内存空间大小

 

复位中断响应函数

                AREA    |.text|, CODE, READONLY

;声明C代码段(|.text|)

Reset_Handler   PROC

; Reset_Handler复位中断响应函数标号,即复位中断响应函数地址。PROC…ENDP为过程定义伪指令,表示程序的开始和结束,PROC和ENDP必须成对出现。过程就是子程序,一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。这里跳转到main函数后不需跳转回来,因此没有返回指令(RET)

                EXPORT  Reset_Handler             [WEAK]

;声明Reset_Handler为全局变量

                IMPORT  __main   ;声明__main

                IMPORT  SystemInit      ;声明SystemInit

;IMPORT表示其后跟着的标号是在外部文件中定义的,类似于C语言中的exturn

                LDR     R0, =SystemInit

               BLX     R0

;以上2行表示跳转到SystemInit函数执行

                LDR     R0, =__main

                BX      R0

;以上2行表示跳转到__main初始化子函数执行

                ENDP

你可能感兴趣的:(stm32,启动文件)