汇编指令集
http://infocenter.arm.com/help/topic/com.arm.doc.dui0204ic/DUI0204IC_rvct_assembler_guide.pdf
ARM 和 Thumb-2 指令集
http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001mc/QRC0001_UAL.pdf
thumb指令集
http://infocenter.arm.com/help/topic/com.arm.doc.qrc0006ec/QRC0006_UAL16.pdf
arm寄存器
https://blog.csdn.net/Sandeldeng/article/details/52954781
https://blog.csdn.net/beyond702/article/details/50899196
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/index.html
ARM架构
cm4启动过程
https://blog.csdn.net/wzw71734/article/details/53149809
中断向量表的作用
https://blog.csdn.net/hudieping/article/details/5202243
ARM中0地址是要初始化sp,之后就是中断向量表。arm的启动代码一般是用汇编写的,在堆栈建立以后才可以运行C代码,因为C函数调用需要把参数,函数返回地址入栈,堆栈没有建立是不能运行C代码的。
以下文字摘录自如下链接,感谢作者。
https://my.oschina.net/fileoptions/blog/3005821
主要完成的工作包括
Stack_Size EQU 0x00000400
;栈大小Stack_Size为0x00000400,即1KB。
AREA STACK, NOINIT, READWRITE, ALIGN=3
;AREA伪指令新建代码段或数据段,STACK表示可变的段名,未初始化,可读可写,2^3=8字节(双字)边界对齐。
Stack_Mem SPACE Stack_Size
;Stack_Mem为标号,SPACE伪指令分配了一片连续的大小为Stack_Size字节的存储区域并初始化为0。
__initial_sp
;__initial_sp是个标号,代表当前指令的地址,即栈顶地址。
Heap_Size EQU 0x00000200
;堆大小Heap_Size为0x00000200,即512B。
AREA HEAP, NOINIT, READWRITE, ALIGN=3
;新建堆段,未初始化,可读可写,8字节对齐。
__heap_base
;标号,堆的起始地址。
Heap_Mem SPACE Heap_Size
;分配并初始化一片连续的存储空间。
__heap_limit
;标号,堆的结束地址。堆是由低向高生长的,跟栈相反。
PRESERVE8
;等于PRESERVE8 {TRUE},设置文件的PRSE8编译属性,使代码保持堆栈8字节对齐。
THUMB
;THUMB必须位于使用新语法的任何Thumb代码之前,后面指令兼容THUMB指令。
AREA |.text|, CODE, READONLY
;|.text|表示由 C 编译程序产生的代码段,或用于以某种方式与 C 库关联的代码段。
定义一个名称为.text 的代码段,可读。
; Reset handler
Reset_Handler PROC
;PROC、ENDP为过程定义伪指令,一个过程可以被其他程序所调用(用CALL指令)。
EXPORT Reset_Handler [WEAK]
;EXPORT伪指令声明一个全局标号,[WEAK]声明其他的同名标号优先于该标号被引用。
IMPORT SystemInit
;IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,
;而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
IMPORT __main
LDR R0, =SystemInit
;LDR将跳转地址放入寄存器R0,准备调用SystemInit
BLX R0
;带链接和状态切换的跳转,根据最低位切换指令集,调用完子程序后返回。
LDR R0, =__main
BX R0
;带状态切换的跳转,根据最低位切换指令集,不返回。
ENDP
; 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
;栈大小Stack_Size为0x00000400,即1KB。10进制1024
AREA STACK, NOINIT, READWRITE, ALIGN=3
;AREA伪指令新建代码段或数据段,STACK表示可变的段名,未初始化,可读可写,2^3=8字节(双字)边界对齐。
Stack_Mem SPACE Stack_Size
;Stack_Mem为标号,SPACE伪指令分配了一片连续的大小为Stack_Size字节的存储区域并初始化为0。
__initial_sp
;__initial_sp是个标号,代表当前指令的地址,即栈顶地址。
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
;堆大小Heap_Size为0x00000200,即512B。
AREA HEAP, NOINIT, READWRITE, ALIGN=3
;新建堆段,未初始化,可读可写,8字节对齐。
__heap_base
;标号,堆的起始地址。
Heap_Mem SPACE Heap_Size
;分配并初始化一片连续的存储空间。
__heap_limit
;标号,堆的结束地址。堆是由低向高生长的,跟栈相反。
PRESERVE8
;等于PRESERVE8 {TRUE},设置文件的PRSE8编译属性,使代码保持堆栈8字节对齐。
THUMB
;THUMB必须位于使用新语法的任何Thumb代码之前,后面指令兼容THUMB指令。
; Vector Table Mapped to Address 0 at Reset
;向量表在复位时映射到地址0
AREA RESET, DATA, READONLY
;定义一个数据段RESET,只读。
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
;声明三个全局标号,该标号可在其他的文件中被引用。
__Vectors DCD __initial_sp ; Top of Stack 栈顶
;中断向量表起始地址,DCD伪指令用于分配一篇连续的字存储单元并用伪指令中制定的表达式初始化。
;用DCD分配的字存储单元是字(4字节)对齐的。
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 总线错误中断
;一般发生在数据访问异常,比如fsmc访问不当
DCD UsageFault_Handler ; Usage Fault Handler 用法错误中断
;一般是预取值、位置指令或者数据处理错误
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler 系统调用异常
;SVC是用户模式代码中的主进程
;用于创造对特权操作系统代码的调用
DCD DebugMon_Handler ; Debug Monitor Handler ???
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler 挂起异常
;用作上下文切换异常。
DCD SysTick_Handler ; SysTick Handler 系统滴答定时器
;操作系统内核时钟
; External Interrupts 以上都是Coretex M3内核自带的,以下为外部中断向量表
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
;PVD = Programmable Voltage Detector
;可编程电压监测器(Vdd和Vdda都要参与比较)
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line ???
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0
DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1
DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2
DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3
DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4
DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5
DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6
DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s
DCD CAN1_TX_IRQHandler ; CAN1 TX
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9
DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10
DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11
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 ; External Line[15:10]s
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line
;OTG = On-The-Go
;主要应用于各种不同的设备或移动设备间的联接和数据交换
DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
DCD FMC_IRQHandler ; FMC ???
DCD SDIO_IRQHandler ; SDIO
;SDIO = Secure Digital Input and Output
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0
DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1
DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2
DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3
DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4
DCD ETH_IRQHandler ; Ethernet
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
DCD CAN2_TX_IRQHandler ; CAN2 TX
DCD CAN2_RX0_IRQHandler ; CAN2 RX0
DCD CAN2_RX1_IRQHandler ; CAN2 RX1
DCD CAN2_SCE_IRQHandler ; CAN2 SCE
DCD OTG_FS_IRQHandler ; USB OTG FS
DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5
DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6
DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7
DCD USART6_IRQHandler ; USART6
DCD I2C3_EV_IRQHandler ; I2C3 event
DCD I2C3_ER_IRQHandler ; I2C3 error
DCD OTG_HS_EP1_OUT_IRQHandler ; USB OTG HS End Point 1 Out
DCD OTG_HS_EP1_IN_IRQHandler ; USB OTG HS End Point 1 In
DCD OTG_HS_WKUP_IRQHandler ; USB OTG HS Wakeup through EXTI
DCD OTG_HS_IRQHandler ; USB OTG HS
DCD DCMI_IRQHandler ; DCMI
;DCMI = Digital Camera Interface
;快速摄像头接口
DCD CRYP_IRQHandler ; CRYP crypto
;CRYP = Cryptographic Processor
;加密处理器
DCD HASH_RNG_IRQHandler ; Hash and Rng
;Hash Processor 哈希处理器
;RNG = Random Number Generator
;随机数发生器
DCD FPU_IRQHandler ; FPU
;FPU = Float Point Unit
;浮点运算单元
DCD UART7_IRQHandler ; UART7
DCD UART8_IRQHandler ; UART8
DCD SPI4_IRQHandler ; SPI4
DCD SPI5_IRQHandler ; SPI5
DCD SPI6_IRQHandler ; SPI6
DCD SAI1_IRQHandler ; SAI1
;SAI = Serial Audio Interface
;串行音频接口
DCD LTDC_IRQHandler ; LTDC 液晶分层显示功能
DCD LTDC_ER_IRQHandler ; LTDC error
DCD DMA2D_IRQHandler ; DMA2D 2D图形加速器
__Vectors_End
;中断向量表结束地址
__Vectors_Size EQU __Vectors_End - __Vectors
;计算中断向量表地址空间大小
AREA |.text|, CODE, READONLY
;|.text|表示由 C 编译程序产生的代码段,或用于以某种方式与 C 库关联的代码段。
; Reset handler
Reset_Handler PROC
;PROC、ENDP为过程定义伪指令,一个过程可以被其他程序所调用(用CALL指令)。
EXPORT Reset_Handler [WEAK]
;EXPORT伪指令声明一个全局标号,[WEAK]声明其他的同名标号优先于该标号被引用。
IMPORT SystemInit
;IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,
;而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
IMPORT __main
LDR R0, =SystemInit
;LDR将跳转地址放入寄存器R0,准备调用SystemInit
BLX R0
;带链接和状态切换的跳转,根据最低位切换指令集,调用完子程序后返回。
LDR R0, =__main
BX R0
;带状态切换的跳转,根据最低位切换指令集,不返回。
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
;虚拟的中断处理程序(可被修改的无限循环)
;这些中断服务程序都是死循环,真正的中断服务函数需要我们在外部C文件里重新实现。
;如果开了某个中断但没有重新实现中断服务函数,或者写错函数名,
;则当中断到来时程序将跳转到这里进入死循环。
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 TAMP_STAMP_IRQHandler [WEAK]
EXPORT RTC_WKUP_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_Stream0_IRQHandler [WEAK]
EXPORT DMA1_Stream1_IRQHandler [WEAK]
EXPORT DMA1_Stream2_IRQHandler [WEAK]
EXPORT DMA1_Stream3_IRQHandler [WEAK]
EXPORT DMA1_Stream4_IRQHandler [WEAK]
EXPORT DMA1_Stream5_IRQHandler [WEAK]
EXPORT DMA1_Stream6_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT CAN1_TX_IRQHandler [WEAK]
EXPORT CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM10_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM11_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 RTC_Alarm_IRQHandler [WEAK]
EXPORT OTG_FS_WKUP_IRQHandler [WEAK]
EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK]
EXPORT TIM8_UP_TIM13_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT DMA1_Stream7_IRQHandler [WEAK]
EXPORT FMC_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Stream0_IRQHandler [WEAK]
EXPORT DMA2_Stream1_IRQHandler [WEAK]
EXPORT DMA2_Stream2_IRQHandler [WEAK]
EXPORT DMA2_Stream3_IRQHandler [WEAK]
EXPORT DMA2_Stream4_IRQHandler [WEAK]
EXPORT ETH_IRQHandler [WEAK]
EXPORT ETH_WKUP_IRQHandler [WEAK]
EXPORT CAN2_TX_IRQHandler [WEAK]
EXPORT CAN2_RX0_IRQHandler [WEAK]
EXPORT CAN2_RX1_IRQHandler [WEAK]
EXPORT CAN2_SCE_IRQHandler [WEAK]
EXPORT OTG_FS_IRQHandler [WEAK]
EXPORT DMA2_Stream5_IRQHandler [WEAK]
EXPORT DMA2_Stream6_IRQHandler [WEAK]
EXPORT DMA2_Stream7_IRQHandler [WEAK]
EXPORT USART6_IRQHandler [WEAK]
EXPORT I2C3_EV_IRQHandler [WEAK]
EXPORT I2C3_ER_IRQHandler [WEAK]
EXPORT OTG_HS_EP1_OUT_IRQHandler [WEAK]
EXPORT OTG_HS_EP1_IN_IRQHandler [WEAK]
EXPORT OTG_HS_WKUP_IRQHandler [WEAK]
EXPORT OTG_HS_IRQHandler [WEAK]
EXPORT DCMI_IRQHandler [WEAK]
EXPORT CRYP_IRQHandler [WEAK]
EXPORT HASH_RNG_IRQHandler [WEAK]
EXPORT FPU_IRQHandler [WEAK]
EXPORT UART7_IRQHandler [WEAK]
EXPORT UART8_IRQHandler [WEAK]
EXPORT SPI4_IRQHandler [WEAK]
EXPORT SPI5_IRQHandler [WEAK]
EXPORT SPI6_IRQHandler [WEAK]
EXPORT SAI1_IRQHandler [WEAK]
EXPORT LTDC_IRQHandler [WEAK]
EXPORT LTDC_ER_IRQHandler [WEAK]
EXPORT DMA2D_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMP_STAMP_IRQHandler
RTC_WKUP_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Stream0_IRQHandler
DMA1_Stream1_IRQHandler
DMA1_Stream2_IRQHandler
DMA1_Stream3_IRQHandler
DMA1_Stream4_IRQHandler
DMA1_Stream5_IRQHandler
DMA1_Stream6_IRQHandler
ADC_IRQHandler
CAN1_TX_IRQHandler
CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM9_IRQHandler
TIM1_UP_TIM10_IRQHandler
TIM1_TRG_COM_TIM11_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
RTC_Alarm_IRQHandler
OTG_FS_WKUP_IRQHandler
TIM8_BRK_TIM12_IRQHandler
TIM8_UP_TIM13_IRQHandler
TIM8_TRG_COM_TIM14_IRQHandler
TIM8_CC_IRQHandler
DMA1_Stream7_IRQHandler
FMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Stream0_IRQHandler
DMA2_Stream1_IRQHandler
DMA2_Stream2_IRQHandler
DMA2_Stream3_IRQHandler
DMA2_Stream4_IRQHandler
ETH_IRQHandler
ETH_WKUP_IRQHandler
CAN2_TX_IRQHandler
CAN2_RX0_IRQHandler
CAN2_RX1_IRQHandler
CAN2_SCE_IRQHandler
OTG_FS_IRQHandler
DMA2_Stream5_IRQHandler
DMA2_Stream6_IRQHandler
DMA2_Stream7_IRQHandler
USART6_IRQHandler
I2C3_EV_IRQHandler
I2C3_ER_IRQHandler
OTG_HS_EP1_OUT_IRQHandler
OTG_HS_EP1_IN_IRQHandler
OTG_HS_WKUP_IRQHandler
OTG_HS_IRQHandler
DCMI_IRQHandler
CRYP_IRQHandler
HASH_RNG_IRQHandler
FPU_IRQHandler
UART7_IRQHandler
UART8_IRQHandler
SPI4_IRQHandler
SPI5_IRQHandler
SPI6_IRQHandler
SAI1_IRQHandler
LTDC_IRQHandler
LTDC_ER_IRQHandler
DMA2D_IRQHandler
B .
ENDP
ALIGN
;ALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对齐方式。
;后面的表达式未指定则将当前位置对齐到下一个字的位置。
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
;如果定义了__MICROLIB,则为以下三个标号赋予全局属性。
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
;否则,则引入在其他源文件中定义的标号__use_two_region_memory,
;声明全局标号__user_initial_stackheap。
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
;堆栈初始化,R0保存堆起始地址,R1保存栈顶地址,R2保存堆的结束地址,R3保存栈底地址。
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
;ENTRY伪指令标识程序的入口点,END指示代码段结束。
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****