配置栈
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