qpc/3rd_party/efm32pg1b/arm/startup_efm32pg1b.s
2020-07-18 17:56:40 -04:00

415 lines
16 KiB
ArmAsm

;/***************************************************************************/
; * @file startup_efm32pg1b.s for ARM-KEIL ARM assembler
; * @brief CMSIS Cortex-M4F Core Device Startup File for EFM32-SLSTK3401A
; * @version CMSIS 4.3.0
; * @date 02 May 2016
; *
; * @description
; * Created from the CMSIS template for the specified device
; * Quantum Leaps, www.state-machine.com
; *
; * @note
; * The symbols Stack_Size and Heap_Size should be provided on the command-
; * line options to the assembler, for example as:
; * --pd "Stack_Size SETA 512" --pd "Heap_Size SETA 0"
; *
; * @note
; * The function assert_failed defined at the end of this file defines
; * the error/assertion handling policy for the application and might
; * need to be customized for each project. This function is defined in
; * assembly to re-set the stack pointer, in case it is corrupted by the
; * time assert_failed is called.
; *
; ***************************************************************************/
;/* Copyright (c) 2012 ARM LIMITED
;
; All rights reserved.
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
; - Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; - Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; - Neither the name of ARM nor the names of its contributors may be used
; to endorse or promote products derived from this software without
; specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
; POSSIBILITY OF SUCH DAMAGE.
;---------------------------------------------------------------------------*/
;******************************************************************************
;
; Allocate space for the stack.
;
;******************************************************************************
AREA STACK, NOINIT, READWRITE, ALIGN=3
__stack_base
StackMem
SPACE Stack_Size ; provided in command-line option, for example:
; --pd "Stack_Size SETA 512"
__stack_limit
__initial_sp
;******************************************************************************
;
; Allocate space for the heap.
;
;******************************************************************************
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
HeapMem
SPACE Heap_Size ; provided in command-line option, for example:
; --pd "Heap_Size SETA 0"
__heap_limit
;******************************************************************************
;
; Indicate that the code in this file preserves 8-byte alignment of the stack.
;
;******************************************************************************
PRESERVE8
;******************************************************************************
;
; Place code into the reset code section.
;
;******************************************************************************
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
;******************************************************************************
;
; The vector table.
;
;******************************************************************************
__Vectors
DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; The MPU fault handler
DCD BusFault_Handler ; The bus fault handler
DCD UsageFault_Handler ; The 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 ; The PendSV handler
DCD SysTick_Handler ; The SysTick handler
; IRQ handlers...
DCD EMU_IRQHandler ; 0 - EMU
DCD Default_Handler ; 1 - Reserved
DCD WDOG0_IRQHandler ; 2 - WDOG0
DCD Default_Handler ; 3 - Reserved
DCD Default_Handler ; 4 - Reserved
DCD Default_Handler ; 5 - Reserved
DCD Default_Handler ; 6 - Reserved
DCD Default_Handler ; 7 - Reserved
DCD LDMA_IRQHandler ; 8 - LDMA
DCD GPIO_EVEN_IRQHandler ; 9 - GPIO_EVEN
DCD TIMER0_IRQHandler ; 10 - TIMER0
DCD USART0_RX_IRQHandler ; 11 - USART0_RX
DCD USART0_TX_IRQHandler ; 12 - USART0_TX
DCD ACMP0_IRQHandler ; 13 - ACMP0
DCD ADC0_IRQHandler ; 14 - ADC0
DCD IDAC0_IRQHandler ; 15 - IDAC0
DCD I2C0_IRQHandler ; 16 - I2C0
DCD GPIO_ODD_IRQHandler ; 17 - GPIO_ODD
DCD TIMER1_IRQHandler ; 18 - TIMER1
DCD USART1_RX_IRQHandler ; 19 - USART1_RX
DCD USART1_TX_IRQHandler ; 20 - USART1_TX
DCD LEUART0_IRQHandler ; 21 - LEUART0
DCD PCNT0_IRQHandler ; 22 - PCNT0
DCD CMU_IRQHandler ; 23 - CMU
DCD MSC_IRQHandler ; 24 - MSC
DCD CRYPTO_IRQHandler ; 25 - CRYPTO
DCD LETIMER0_IRQHandler ; 26 - LETIMER0
DCD Default_Handler ; 27 - Reserved
DCD Default_Handler ; 28 - Reserved
DCD RTCC_IRQHandler ; 29 - RTCC
DCD Default_Handler ; 30 - Reserved
DCD CRYOTIMER_IRQHandler ; 31 - CRYOTIMER
DCD Default_Handler ; 32 - Reserved
DCD FPUEH_IRQHandler ; 33 - FPUEH
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
;******************************************************************************
;
; This is the code for exception handlers.
;
;******************************************************************************
AREA |.text|, CODE, READONLY
;******************************************************************************
;
; This is the code that gets called when the processor first starts execution
; following a reset event.
;
;******************************************************************************
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR r0, =SystemInit ; CMSIS system initialization
BLX r0
; Call the C library enty point that handles startup. This will copy
; the .data section initializers from flash to SRAM and zero fill the
; .bss section.
LDR r0, =__main
BX r0
; __main calls the main() function, which should not return,
; but just in case jump to assert_failed() if main returns.
MOVS r0,#0
MOVS r1,#0 ; error number
B assert_failed
ENDP
;******************************************************************************
;
; The NMI handler
;
;******************************************************************************
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
MOVS r0,#0
MOVS r1,#2 ; NMI exception number
B assert_failed
ENDP
;******************************************************************************
;
; The Hard Fault handler
;
;******************************************************************************
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
MOVS r0,#0
MOVS r1,#3 ; HardFault exception number
B assert_failed
ENDP
;******************************************************************************
;
; The MPU fault handler
;
;******************************************************************************
MemManage_Handler PROC
EXPORT MemManage_Handler [WEAK]
MOVS r0,#0
MOVS r1,#4 ; MemManage exception number
B assert_failed
ENDP
;******************************************************************************
;
; The Bus Fault handler
;
;******************************************************************************
BusFault_Handler PROC
EXPORT BusFault_Handler [WEAK]
MOVS r0,#0
MOVS r1,#5 ; BusFault exception number
B assert_failed
ENDP
;******************************************************************************
;
; The Usage Fault handler
;
;******************************************************************************
UsageFault_Handler PROC
EXPORT UsageFault_Handler [WEAK]
MOVS r0,#0
MOVS r1,#6 ; UsageFault exception number
B assert_failed
ENDP
;******************************************************************************
;
; The SVC handler
;
;******************************************************************************
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
MOVS r0,#0
MOVS r1,#11 ; SVCall exception number
B assert_failed
ENDP
;******************************************************************************
;
; The Debug Monitor handler
;
;******************************************************************************
DebugMon_Handler PROC
EXPORT DebugMon_Handler [WEAK]
MOVS r0,#0
MOVS r1,#12 ; DebugMon exception number
B assert_failed
ENDP
;******************************************************************************
;
; The PendSV handler
;
;******************************************************************************
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
MOVS r0,#0
MOVS r1,#14 ; PendSV exception number
B assert_failed
ENDP
;******************************************************************************
;
; The SysTick handler
;
;******************************************************************************
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
MOVS r0,#0
MOVS r1,#15 ; SysTick exception number
B assert_failed
ENDP
;******************************************************************************
;
; Define Default_Handledr as dummy for all IRQ handlers
;
;******************************************************************************
Default_Handler PROC
EXPORT EMU_IRQHandler [WEAK]
EXPORT WDOG0_IRQHandler [WEAK]
EXPORT LDMA_IRQHandler [WEAK]
EXPORT GPIO_EVEN_IRQHandler [WEAK]
EXPORT TIMER0_IRQHandler [WEAK]
EXPORT USART0_RX_IRQHandler [WEAK]
EXPORT USART0_TX_IRQHandler [WEAK]
EXPORT ACMP0_IRQHandler [WEAK]
EXPORT ADC0_IRQHandler [WEAK]
EXPORT IDAC0_IRQHandler [WEAK]
EXPORT I2C0_IRQHandler [WEAK]
EXPORT GPIO_ODD_IRQHandler [WEAK]
EXPORT TIMER1_IRQHandler [WEAK]
EXPORT USART1_RX_IRQHandler [WEAK]
EXPORT USART1_TX_IRQHandler [WEAK]
EXPORT LEUART0_IRQHandler [WEAK]
EXPORT PCNT0_IRQHandler [WEAK]
EXPORT CMU_IRQHandler [WEAK]
EXPORT MSC_IRQHandler [WEAK]
EXPORT CRYPTO_IRQHandler [WEAK]
EXPORT LETIMER0_IRQHandler [WEAK]
EXPORT RTCC_IRQHandler [WEAK]
EXPORT CRYOTIMER_IRQHandler [WEAK]
EXPORT FPUEH_IRQHandler [WEAK]
EMU_IRQHandler
WDOG0_IRQHandler
LDMA_IRQHandler
GPIO_EVEN_IRQHandler
TIMER0_IRQHandler
USART0_RX_IRQHandler
USART0_TX_IRQHandler
ACMP0_IRQHandler
ADC0_IRQHandler
IDAC0_IRQHandler
I2C0_IRQHandler
GPIO_ODD_IRQHandler
TIMER1_IRQHandler
USART1_RX_IRQHandler
USART1_TX_IRQHandler
LEUART0_IRQHandler
PCNT0_IRQHandler
CMU_IRQHandler
MSC_IRQHandler
CRYPTO_IRQHandler
LETIMER0_IRQHandler
RTCC_IRQHandler
CRYOTIMER_IRQHandler
FPUEH_IRQHandler
MOVS r0,#0
MOVS r1,#-1 ; 0xFFFFFFF
B assert_failed
ENDP
ALIGN ; make sure the end of this section is aligned
;******************************************************************************
;
; The function expected of the C library startup code for defining the stack
; and heap memory locations. For the C library version of the startup code,
; provide this function so that the C library initialization code can find out
; the location of the stack and heap.
;
;******************************************************************************
IF :DEF: __MICROLIB
EXPORT __initial_sp
EXPORT __stack_limit
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap PROC
LDR R0, =__heap_base
LDR R1, =__stack_limit
LDR R2, =__heap_limit
LDR R3, =__stack_base
BX LR
ENDP
ENDIF
;******************************************************************************
;
; The function assert_failed defines the error/assertion handling policy
; for the application. After making sure that the stack is OK, this function
; calls Q_onAssert, which should NOT return (typically reset the CPU).
;
; NOTE: the function Q_onAssert should NOT return.
;
; The C proptotype of the assert_failed() and Q_onAssert() functions are:
; void assert_failed(char const *file, int line);
; void Q_onAssert (char const *file, int line);
;******************************************************************************
EXPORT assert_failed
IMPORT Q_onAssert
assert_failed PROC
LDR sp,=__initial_sp ; re-set the SP in case of stack overflow
BL Q_onAssert ; call the application-specific handler
B . ; should not be reached, but just in case...
ENDP
ALIGN ; make sure the end of this section is aligned
END ; end of module