STM32 keil mdk启动代码分析

;// <h> Stack Configuration
;//   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>
Stack_Size      EQU     0x00000200                           ;//定义堆栈大小
AREA    STACK, NOINIT, READWRITE, ALIGN=3    ;//定义一个数据段 按8字节对齐
    ;//AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0Stack_Mem       SPACE   Stack_Size                           ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0

__initial_sp                                                 ;//标号,代表堆栈顶部地址,后面有用

;// <h> Heap Configuration
;//   <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>
Heap_Size       EQU     0x00000020                            ;//定义堆空间大小
AREA    HEAP, NOINIT, READWRITE, ALIGN=3      ;//定义一个数据段,8字节对齐
__heap_base
Heap_Mem        SPACE   Heap_Size                             ;//保留Heap_Size的堆空间
__heap_limit                                                  ;//标号,代表堆末尾地址,后面有用

PRESERVE8                                     ;//指示编译器8字节对齐
THUMB                                         ;//指示编译器为THUMB指令

; Vector Table Mapped to Address 0 at Reset
AREA    RESET, DATA, READONLY                  ;//定义只读数据段,其实放在CODE区,位于0地址

EXTERN NMIException
EXTERN HardFaultException
EXTERN MemManageException
EXTERN BusFaultException
EXTERN UsageFaultException
EXTERN SVCHandler
EXTERN DebugMonitor
EXTERN PendSVC
EXTERN SysTickHandler               ;//声明这些符号在外部定义,同C
;//在××it.c中实现这些函数 ,中断就能自动调用了
EXPORT __Vectors
EXPORT __initial_sp                     ;//EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用
;//IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义,
;//但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中

__Vectors       DCD     __initial_sp              ;// Top of Stack         //Cotex-M 要求此处为堆栈顶部地址
DCD     Reset_Handler                ;// Reset Handler
DCD     NMIException                   ;// NMI Handler
DCD     HardFaultException        ;// Hard Fault Handler
DCD     MemManageException        ;// MPU Fault Handler
DCD     BusFaultException         ;// Bus Fault Handler
DCD     UsageFaultException       ;// Usage Fault Handler
DCD     0                         ;// Reserved
DCD     0                         ;// Reserved
DCD     0                         ;// Reserved
DCD     0                         ;// Reserved
DCD     SVCHandler                ;// SVCall Handler
DCD     DebugMonitor              ;// Debug Monitor Handler
DCD     0                         ;// Reserved
DCD     PendSVC                   ;// PendSV Handler
DCD     SysTickHandler            ;// SysTick Handler      //一大堆的异常处理函数地址
;// External Interrupts
EXTERN WWDG_IRQHandler
EXTERN PVD_IRQHandler
EXTERN TAMPER_IRQHandler
EXTERN RTC_IRQHandler
EXTERN FLASH_IRQHandler
EXTERN RCC_IRQHandler
EXTERN EXTI0_IRQHandler
EXTERN EXTI1_IRQHandler
EXTERN EXTI2_IRQHandler
EXTERN EXTI3_IRQHandler
EXTERN EXTI4_IRQHandler
EXTERN DMAChannel1_IRQHandler
EXTERN DMAChannel2_IRQHandler
EXTERN DMAChannel3_IRQHandler
EXTERN DMAChannel4_IRQHandler
EXTERN DMAChannel5_IRQHandler
EXTERN DMAChannel6_IRQHandler
EXTERN DMAChannel7_IRQHandler
EXTERN ADC_IRQHandler
EXTERN USB_HP_CAN_TX_IRQHandler
EXTERN USB_LP_CAN_RX0_IRQHandler
EXTERN CAN_RX1_IRQHandler
EXTERN CAN_SCE_IRQHandler
EXTERN EXTI9_5_IRQHandler
EXTERN TIM1_BRK_IRQHandler
EXTERN TIM1_UP_IRQHandler
EXTERN TIM1_TRG_COM_IRQHandler
EXTERN TIM1_CC_IRQHandler
EXTERN TIM2_IRQHandler
EXTERN TIM3_IRQHandler
EXTERN TIM4_IRQHandler
EXTERN I2C1_EV_IRQHandler
EXTERN I2C1_ER_IRQHandler
EXTERN I2C2_EV_IRQHandler
EXTERN I2C2_ER_IRQHandler
EXTERN SPI1_IRQHandler
EXTERN SPI2_IRQHandler
EXTERN USART1_IRQHandler
EXTERN USART2_IRQHandler
EXTERN USART3_IRQHandler
EXTERN EXTI15_10_IRQHandler
EXTERN RTCAlarm_IRQHandler
EXTERN USBWakeUp_IRQHandler                    ;//同上,

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     DMAChannel1_IRQHandler    ;// DMA Channel 1
DCD     DMAChannel2_IRQHandler    ;// DMA Channel 2
DCD     DMAChannel3_IRQHandler    ;// DMA Channel 3
DCD     DMAChannel4_IRQHandler    ;// DMA Channel 4
DCD     DMAChannel5_IRQHandler    ;// DMA Channel 5
DCD     DMAChannel6_IRQHandler    ;// DMA Channel 6
DCD     DMAChannel7_IRQHandler    ;// DMA Channel 7
DCD     ADC_IRQHandler            ;// ADC
DCD     USB_HP_CAN_TX_IRQHandler ;// USB High Priority or CAN TX
DCD     USB_LP_CAN_RX0_IRQHandler ;// USB Low Priority or CAN RX0
DCD     CAN_RX1_IRQHandler        ;// CAN RX1
DCD     CAN_SCE_IRQHandler        ;// CAN 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   ;//同上

AREA    |.text|, CODE, READONLY        ;//定义代码段

; Reset Handler
Reset_Handler   PROC                              ;//过程的开始
;//Rset_Handler的实现   利用PROC、ENDP这一对伪指令把程序段分为若干个过程,使程序的结构加清晰

EXPORT Reset_Handler             [WEAK]    ;//在外部没有定义该符号时导出该符号,见HELP中[WEAK]
IMPORT __main                              ;//导入符号,__main为 运行时库提供的函数;完成堆栈,堆的初始话
LDR     R0, =__main                         ;//等工作,会调用下面定义的__user_initial_stackheap;
BX      R0                                  ;//跳到__main,进入C的世界
ENDP                                      ;过程的结束

ALIGN

; User Initial Stack & Heap
IF      :DEF:__MICROLIB                     ;//如果使用micro lib,micro lib 描述见armlib.chm

EXPORT __heap_base
EXPORT __heap_limit                        ;//只导出几个定义

ELSE                                        ;//如果使用默认C运行时库

IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap                                    ;//则进行堆栈和堆的赋值,在__main函数执行过程中调用。
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                                         ;//OK ,完了

 

发表评论

电子邮件地址不会被公开。