227 lines
9.8 KiB
ArmAsm
227 lines
9.8 KiB
ArmAsm
;/**************************************************************************//**
|
||
; * @file startup_ARMCM0.s
|
||
; * @brief CMSIS Core Device Startup File for
|
||
; * ARMCM0 Device
|
||
; * @version V5.4.0
|
||
; * @date 12. December 2018
|
||
; ******************************************************************************/
|
||
;/*
|
||
; * Copyright (c) 2009-2018 Arm Limited. All rights reserved.
|
||
; *
|
||
; * SPDX-License-Identifier: Apache-2.0
|
||
; *
|
||
; * Licensed under the Apache License, Version 2.0 (the License); you may
|
||
; * not use this file except in compliance with the License.
|
||
; * You may obtain a copy of the License at
|
||
; *
|
||
; * www.apache.org/licenses/LICENSE-2.0
|
||
; *
|
||
; * Unless required by applicable law or agreed to in writing, software
|
||
; * distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||
; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
; * See the License for the specific language governing permissions and
|
||
; * limitations under the License.
|
||
; */
|
||
|
||
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
|
||
|
||
|
||
;<h> Stack Configuration
|
||
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||
;</h>
|
||
|
||
Stack_Size EQU 0x00001000
|
||
|
||
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
||
__stack_limit
|
||
Stack_Mem SPACE Stack_Size
|
||
__initial_sp
|
||
|
||
|
||
;<h> Heap Configuration
|
||
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||
;</h>
|
||
|
||
Heap_Size EQU 0x00000C00
|
||
|
||
IF Heap_Size != 0 ; Heap is provided
|
||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||
__heap_base
|
||
Heap_Mem SPACE Heap_Size
|
||
__heap_limit
|
||
ENDIF
|
||
|
||
|
||
PRESERVE8
|
||
THUMB
|
||
|
||
|
||
; Vector Table Mapped to Address 0 at Reset
|
||
|
||
AREA RESET, DATA, READONLY
|
||
EXPORT __Vectors
|
||
EXPORT __Vectors_End
|
||
EXPORT __Vectors_Size
|
||
|
||
__Vectors DCD __initial_sp ; Top of Stack
|
||
DCD Reset_Handler ; Reset Handler
|
||
DCD NMI_Handler ; -14 NMI Handler
|
||
DCD HardFault_Handler ; -13 Hard Fault Handler
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD SVC_Handler ; -5 SVCall Handler
|
||
DCD 0 ; Reserved
|
||
DCD 0 ; Reserved
|
||
DCD PendSV_Handler ; -2 PendSV Handler
|
||
DCD SysTick_Handler ; -1 SysTick Handler
|
||
|
||
|
||
; Interrupts
|
||
DCD VIDC_IRQn_Handler ; 0 Interrupt 0
|
||
DCD LCDC_IRQn_Handler ; 1 Interrupt 1
|
||
DCD MIPI_RX_IRQn_Handler ; 2 Interrupt 2
|
||
DCD MIPI_TX_IRQn_Handler ; 3 Interrupt 3
|
||
DCD MEMC_IRQn_Handler ; 4 Interrupt 4
|
||
DCD VPRE_IRQn_Handler ; 5 Interrupt 5
|
||
DCD FLSCTRL_IRQn_Handler ; 6 Interrupt 6
|
||
DCD DMA_IRQn_Handler ; 7 Interrupt 7
|
||
DCD TIMER0_IRQn_Handler ; 8 Interrupt 8
|
||
DCD TIMER1_IRQn_Handler ; 9 Interrupt 9
|
||
DCD TIMER2_IRQn_Handler ; 10 Interrupt 10
|
||
DCD TIMER3_IRQn_Handler ; 11 Interrupt 11
|
||
DCD WDG_IRQn_Handler ; 12 Interrupt 12
|
||
DCD UART_IRQn_Handler ; 13 Interrupt 13
|
||
DCD I2C0_IRQn_Handler ; 14 Interrupt 14
|
||
DCD I2C1_IRQn_Handler ; 15 Interrupt 15
|
||
DCD SPIS_IRQn_Handler ; 16 Interrupt 16
|
||
DCD SPIM_IRQn_Handler ; 17 Interrupt 17
|
||
DCD ADC_IRQn_Handler ; 18 Interrupt 18
|
||
DCD PWMDET_IRQn_Handler ; 19 Interrupt 19
|
||
DCD OTP_IRQn_Handler ; 20 Interrupt 20
|
||
DCD SWIRE_IRQn_Handler ; 21 Interrupt 21
|
||
DCD PVD_IRQn_Handler ; 22 Interrupt 22
|
||
DCD AP_NRESET_IRQn_Handler ; 23 Interrupt 23
|
||
DCD EXTI_INT0_IRQn_Handler ; 24 Interrupt 24
|
||
DCD EXTI_INT1_IRQn_Handler ; 25 Interrupt 25
|
||
DCD EXTI_INT2_IRQn_Handler ; 26 Interrupt 26
|
||
DCD EXTI_INT3_IRQn_Handler ; 27 Interrupt 27
|
||
DCD EXTI_INT4_IRQn_Handler ; 28 Interrupt 28
|
||
DCD EXTI_INT5_IRQn_Handler ; 29 Interrupt 29
|
||
DCD EXTI_INT6_IRQn_Handler ; 30 Interrupt 30
|
||
DCD EXTI_INT7_IRQn_Handler ; 31 Interrupt 31
|
||
|
||
SPACE ( 0 * 4) ; Interrupts 10 .. 31 are left out
|
||
|
||
__Vectors_End
|
||
__Vectors_Size EQU __Vectors_End - __Vectors
|
||
_NVIC_ICER0 EQU 0xE000E180 ;清中断使能寄存器地址
|
||
_NVIC_ICPR0 EQU 0xE000E280 ;清中断pending寄存器地址
|
||
|
||
AREA |.text|, CODE, READONLY
|
||
|
||
; Reset Handler
|
||
|
||
Reset_Handler PROC
|
||
EXPORT Reset_Handler [WEAK]
|
||
IMPORT __main
|
||
|
||
;清中断使能和pending ——开始——
|
||
CPSID I ; 屏蔽中断
|
||
LDR R0, =_NVIC_ICER0
|
||
LDR R1, =_NVIC_ICPR0
|
||
LDR R2, =0xFFFFFFFF
|
||
MOVS R3, #1 ; 设置循环次数 M0只有1组(32个)中断,故只需要循环1次
|
||
_irq_clear
|
||
;CBZ R3, _irq_clear_end
|
||
CMP R3,#0 ; 循环次数等于0,跳转到_irq_clear_end
|
||
BEQ _irq_clear_end
|
||
STR R2, [R0] ;,#4 ; NVIC_ICER0 - 清 enable IRQ 寄存器
|
||
STR R2, [R1] ;,#4 ; NVIC_ICPR0 - 清 pending IRQ 寄存器
|
||
SUBS R3, #1 ; 循环数自减1
|
||
B _irq_clear
|
||
_irq_clear_end
|
||
;清中断使能和pending ——结束——
|
||
CPSIE I ; 开启中断
|
||
LDR R0, =__main
|
||
BX R0
|
||
ENDP
|
||
|
||
|
||
; Macro to define default exception/interrupt handlers.
|
||
; Default handler are weak symbols with an endless loop.
|
||
; They can be overwritten by real handlers.
|
||
MACRO
|
||
Set_Default_Handler $Handler_Name
|
||
$Handler_Name PROC
|
||
EXPORT $Handler_Name [WEAK]
|
||
B .
|
||
ENDP
|
||
MEND
|
||
|
||
|
||
; Default exception/interrupt handler
|
||
|
||
Set_Default_Handler NMI_Handler
|
||
Set_Default_Handler HardFault_Handler
|
||
Set_Default_Handler SVC_Handler
|
||
Set_Default_Handler PendSV_Handler
|
||
Set_Default_Handler SysTick_Handler
|
||
|
||
Set_Default_Handler VIDC_IRQn_Handler
|
||
Set_Default_Handler LCDC_IRQn_Handler
|
||
Set_Default_Handler MIPI_RX_IRQn_Handler
|
||
Set_Default_Handler MIPI_TX_IRQn_Handler
|
||
Set_Default_Handler MEMC_IRQn_Handler
|
||
Set_Default_Handler VPRE_IRQn_Handler
|
||
Set_Default_Handler FLSCTRL_IRQn_Handler
|
||
Set_Default_Handler DMA_IRQn_Handler
|
||
Set_Default_Handler TIMER0_IRQn_Handler
|
||
Set_Default_Handler TIMER1_IRQn_Handler
|
||
|
||
Set_Default_Handler TIMER2_IRQn_Handler
|
||
Set_Default_Handler TIMER3_IRQn_Handler
|
||
Set_Default_Handler WDG_IRQn_Handler
|
||
Set_Default_Handler UART_IRQn_Handler
|
||
Set_Default_Handler I2C0_IRQn_Handler
|
||
Set_Default_Handler I2C1_IRQn_Handler
|
||
Set_Default_Handler SPIS_IRQn_Handler
|
||
Set_Default_Handler SPIM_IRQn_Handler
|
||
Set_Default_Handler ADC_IRQn_Handler
|
||
Set_Default_Handler PWMDET_IRQn_Handler
|
||
|
||
Set_Default_Handler OTP_IRQn_Handler
|
||
Set_Default_Handler SWIRE_IRQn_Handler
|
||
Set_Default_Handler PVD_IRQn_Handler
|
||
Set_Default_Handler AP_NRESET_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT0_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT1_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT2_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT3_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT4_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT5_IRQn_Handler
|
||
|
||
Set_Default_Handler EXTI_INT6_IRQn_Handler
|
||
Set_Default_Handler EXTI_INT7_IRQn_Handler
|
||
ALIGN
|
||
|
||
|
||
; User setup Stack & Heap
|
||
|
||
IF :LNOT::DEF:__MICROLIB
|
||
IMPORT __use_two_region_memory
|
||
ENDIF
|
||
|
||
EXPORT __stack_limit
|
||
EXPORT __initial_sp
|
||
IF Heap_Size != 0 ; Heap is provided
|
||
EXPORT __heap_base
|
||
EXPORT __heap_limit
|
||
ENDIF
|
||
|
||
END
|