238 lines
7.0 KiB
ArmAsm
238 lines
7.0 KiB
ArmAsm
|
.syntax unified
|
||
|
.arch armv7-m
|
||
|
/* define stack size */
|
||
|
.section .stack
|
||
|
.align 3
|
||
|
.equ Stack_Size, 0x400
|
||
|
.equ BootRAM, 0xF1E0F85F
|
||
|
.globl __StackTop
|
||
|
.globl __StackLimit
|
||
|
__StackLimit:
|
||
|
.space Stack_Size
|
||
|
.size __StackLimit, . - __StackLimit
|
||
|
__StackTop:
|
||
|
.size __StackTop, . - __StackTop
|
||
|
/* define heap size */
|
||
|
.section .heap
|
||
|
.align 3
|
||
|
.equ Heap_Size, 0x200
|
||
|
.globl __HeapBase
|
||
|
.globl __HeapLimit
|
||
|
__HeapBase:
|
||
|
.space Heap_Size
|
||
|
.size __HeapBase, . - __HeapBase
|
||
|
__HeapLimit:
|
||
|
.size __HeapLimit, . - __HeapLimit
|
||
|
|
||
|
.section .isr_vector
|
||
|
.align 2
|
||
|
.globl __isr_vector
|
||
|
__isr_vector:
|
||
|
.word __StackTop
|
||
|
.word Reset_Handler
|
||
|
.word NMI_Handler
|
||
|
.word hal_default_exception_vsr
|
||
|
.word hal_default_exception_vsr
|
||
|
.word hal_default_exception_vsr
|
||
|
.word UsageFault_Handler
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word SVC_Handler
|
||
|
.word DebugMon_Handler
|
||
|
.word 0
|
||
|
.word PendSV_Handler
|
||
|
.word SysTick_Handler
|
||
|
|
||
|
/* external interrupts */
|
||
|
.word WWDG_IRQHandler
|
||
|
.word PVD_IRQHandler
|
||
|
.word TAMPER_IRQHandler
|
||
|
.word RTC_IRQHandler
|
||
|
.word FLASH_IRQHandler
|
||
|
.word RCC_IRQHandler
|
||
|
.word EXTI0_IRQHandler
|
||
|
.word EXTI1_IRQHandler
|
||
|
.word intc_handler
|
||
|
.word EXTI3_IRQHandler
|
||
|
.word EXTI4_IRQHandler
|
||
|
.word DMA1_Channel1_IRQHandler
|
||
|
.word DMA1_Channel2_IRQHandler
|
||
|
.word DMA1_Channel3_IRQHandler
|
||
|
.word DMA1_Channel4_IRQHandler
|
||
|
.word DMA1_Channel5_IRQHandler
|
||
|
.word DMA1_Channel6_IRQHandler
|
||
|
.word DMA1_Channel7_IRQHandler
|
||
|
.word ADC1_2_IRQHandler
|
||
|
.word USB_HP_CAN1_TX_IRQHandler
|
||
|
.word USB_LP_CAN1_RX0_IRQHandler
|
||
|
.word CAN1_RX1_IRQHandler
|
||
|
.word CAN1_SCE_IRQHandler
|
||
|
.word EXTI9_5_IRQHandler
|
||
|
.word TIM1_BRK_IRQHandler
|
||
|
.word TIM1_UP_IRQHandler
|
||
|
.word TIM1_TRG_COM_IRQHandler
|
||
|
.word TIM1_CC_IRQHandler
|
||
|
.word TIM2_IRQHandler
|
||
|
.word TIM3_IRQHandler
|
||
|
.word TIM4_IRQHandler
|
||
|
.word I2C1_EV_IRQHandler
|
||
|
.word I2C1_ER_IRQHandler
|
||
|
.word I2C2_EV_IRQHandler
|
||
|
.word I2C2_ER_IRQHandler
|
||
|
.word SPI1_IRQHandler
|
||
|
.word SPI2_IRQHandler
|
||
|
.word USART1_IRQHandler
|
||
|
.word USART2_IRQHandler
|
||
|
.word USART3_IRQHandler
|
||
|
.word EXTI15_10_IRQHandler
|
||
|
.word RTCAlarm_IRQHandler
|
||
|
.word USBWakeUp_IRQHandler
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
|
||
|
/* vector size */
|
||
|
.size __isr_vector, . - __isr_vector
|
||
|
|
||
|
.text
|
||
|
.thumb
|
||
|
.thumb_func
|
||
|
.align 2
|
||
|
.globl Reset_Handler
|
||
|
.type Reset_Handler, %function
|
||
|
Reset_Handler:
|
||
|
ldr sp, =__StackTop
|
||
|
ldr r0, =__stext
|
||
|
ldr r1, =__etext
|
||
|
ldr r2, =__data_start__
|
||
|
ldr r3, =__data_end__
|
||
|
|
||
|
.flash_to_ram_loop:
|
||
|
cmp r2, r3
|
||
|
ittt lt
|
||
|
ldrlt r0, [r1], #4
|
||
|
strlt r0, [r2], #4
|
||
|
blt .flash_to_ram_loop
|
||
|
/* clear bss */
|
||
|
ldr r0, =0
|
||
|
ldr r1, =__bss_start__
|
||
|
ldr r2, =__bss_end__
|
||
|
|
||
|
clear_bss_loop:
|
||
|
cmp r1, r2
|
||
|
beq clear_bss_loop_end
|
||
|
str r0, [r1], #4
|
||
|
b clear_bss_loop
|
||
|
clear_bss_loop_end:
|
||
|
|
||
|
/* jump to main */
|
||
|
ldr r0, =SystemInit
|
||
|
blx r0
|
||
|
ldr r0, =main
|
||
|
bx r0
|
||
|
|
||
|
exit_loop:
|
||
|
nop
|
||
|
b exit_loop
|
||
|
|
||
|
.global hal_default_exception_vsr
|
||
|
.thumb
|
||
|
.thumb_func
|
||
|
.type hal_default_exception_vsr, %function
|
||
|
hal_default_exception_vsr:
|
||
|
|
||
|
mrs r0,psp // Get process stack
|
||
|
sub r1,r0,#(4*12) // Make space for saved state
|
||
|
msr psp,r1 // Ensure PSP is up to date
|
||
|
|
||
|
mov r1,#1 // R1 = exception state type
|
||
|
mrs r2,ipsr // R2 = vector number
|
||
|
mrs r3,basepri // R3 = basepri
|
||
|
stmfd r0!,{r1-r11,lr} // Push type, vector, basepri, r4-11
|
||
|
|
||
|
mov r4,r0 // R4 = saved state pointer
|
||
|
|
||
|
bl hal_deliver_exception
|
||
|
|
||
|
mov r0,r4 // R0 = state saved across call
|
||
|
ldmfd r0!,{r1-r11,lr} // Pop type, vec, basepri, registers and LR
|
||
|
msr psp,r0 // Restore PSP
|
||
|
msr basepri,r3 // Restore basepri
|
||
|
|
||
|
bx lr // Return
|
||
|
|
||
|
.pool
|
||
|
.size Reset_Handler, . - Reset_Handler
|
||
|
|
||
|
.macro def_default_handler handler_name
|
||
|
.align 1
|
||
|
.thumb_func
|
||
|
.weak \handler_name
|
||
|
.type \handler_name, %function
|
||
|
\handler_name :
|
||
|
b .
|
||
|
.size \handler_name, . - \handler_name
|
||
|
.endm
|
||
|
|
||
|
def_default_handler NMI_Handler
|
||
|
# def_default_handler HardFault_Handler
|
||
|
# def_default_handler MemManage_Handler
|
||
|
# def_default_handler BusFault_Handler
|
||
|
def_default_handler UsageFault_Handler
|
||
|
def_default_handler SVC_Handler
|
||
|
def_default_handler DebugMon_Handler
|
||
|
def_default_handler PendSV_Handler
|
||
|
def_default_handler SysTick_Handler
|
||
|
|
||
|
def_default_handler WWDG_IRQHandler
|
||
|
def_default_handler PVD_IRQHandler
|
||
|
def_default_handler TAMPER_IRQHandler
|
||
|
def_default_handler RTC_IRQHandler
|
||
|
def_default_handler FLASH_IRQHandler
|
||
|
def_default_handler RCC_IRQHandler
|
||
|
def_default_handler EXTI0_IRQHandler
|
||
|
def_default_handler EXTI1_IRQHandler
|
||
|
def_default_handler intc_handler
|
||
|
def_default_handler EXTI3_IRQHandler
|
||
|
def_default_handler EXTI4_IRQHandler
|
||
|
def_default_handler DMA1_Channel1_IRQHandler
|
||
|
def_default_handler DMA1_Channel2_IRQHandler
|
||
|
def_default_handler DMA1_Channel3_IRQHandler
|
||
|
def_default_handler DMA1_Channel4_IRQHandler
|
||
|
def_default_handler DMA1_Channel5_IRQHandler
|
||
|
def_default_handler DMA1_Channel6_IRQHandler
|
||
|
def_default_handler DMA1_Channel7_IRQHandler
|
||
|
def_default_handler ADC1_2_IRQHandler
|
||
|
def_default_handler USB_HP_CAN1_TX_IRQHandler
|
||
|
def_default_handler USB_LP_CAN1_RX0_IRQHandler
|
||
|
def_default_handler CAN1_RX1_IRQHandler
|
||
|
def_default_handler CAN1_SCE_IRQHandler
|
||
|
def_default_handler EXTI9_5_IRQHandler
|
||
|
def_default_handler TIM1_BRK_IRQHandler
|
||
|
def_default_handler TIM1_UP_IRQHandler
|
||
|
def_default_handler TIM1_TRG_COM_IRQHandler
|
||
|
def_default_handler TIM1_CC_IRQHandler
|
||
|
def_default_handler TIM2_IRQHandler
|
||
|
def_default_handler TIM3_IRQHandler
|
||
|
def_default_handler TIM4_IRQHandler
|
||
|
def_default_handler I2C1_EV_IRQHandler
|
||
|
def_default_handler I2C1_ER_IRQHandler
|
||
|
def_default_handler I2C2_EV_IRQHandler
|
||
|
def_default_handler I2C2_ER_IRQHandler
|
||
|
def_default_handler SPI1_IRQHandler
|
||
|
def_default_handler SPI2_IRQHandler
|
||
|
def_default_handler USART1_IRQHandler
|
||
|
def_default_handler USART2_IRQHandler
|
||
|
def_default_handler USART3_IRQHandler
|
||
|
def_default_handler EXTI15_10_IRQHandler
|
||
|
def_default_handler RTCAlarm_IRQHandler
|
||
|
def_default_handler USBWakeUp_IRQHandler
|
||
|
|
||
|
.end
|