264 lines
9.6 KiB
ArmAsm
264 lines
9.6 KiB
ArmAsm
/**************************************************************************//**
|
|
* @file startup_CMSDK_CM0.s
|
|
* @brief CMSIS Cortex-M0 Core Device Startup File for
|
|
* Device CMSDK_CM0
|
|
* @version V3.01
|
|
* @date 06. March 2012
|
|
*
|
|
* @note Should use with GCC for ARM Embedded Processors
|
|
* Copyright (C) 2012 ARM Limited. All rights reserved.
|
|
*
|
|
* @par
|
|
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
|
* processor based microcontrollers. This file can be freely distributed
|
|
* within development tools that are supporting such ARM based processors.
|
|
*
|
|
* @par
|
|
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
|
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
|
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
|
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
|
*
|
|
******************************************************************************/
|
|
/*****************************************************************************/
|
|
/* startup_CMSDK_CM3.s: Startup file for CMSDK device series */
|
|
/*****************************************************************************/
|
|
/* Version: GNU Tools for ARM Embedded Processors */
|
|
/*****************************************************************************/
|
|
|
|
|
|
.syntax unified
|
|
.arch armv6-m
|
|
|
|
.section .stack
|
|
.align 3
|
|
|
|
/*
|
|
// <h> Stack Configuration
|
|
// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
// </h>
|
|
*/
|
|
|
|
.section .stack
|
|
.align 3
|
|
#ifdef __STACK_SIZE
|
|
.equ Stack_Size, __STACK_SIZE
|
|
#else
|
|
.equ Stack_Size, 0x200
|
|
#endif
|
|
.globl __StackTop
|
|
.globl __StackLimit
|
|
__StackLimit:
|
|
.space Stack_Size
|
|
.size __StackLimit, . - __StackLimit
|
|
__StackTop:
|
|
.size __StackTop, . - __StackTop
|
|
|
|
|
|
/*
|
|
// <h> Heap Configuration
|
|
// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
// </h>
|
|
*/
|
|
|
|
.section .heap
|
|
.align 3
|
|
#ifdef __HEAP_SIZE
|
|
.equ Heap_Size, __HEAP_SIZE
|
|
#else
|
|
.equ Heap_Size, 0
|
|
#endif
|
|
.globl __HeapBase
|
|
.globl __HeapLimit
|
|
__HeapBase:
|
|
.if Heap_Size
|
|
.space Heap_Size
|
|
.endif
|
|
.size __HeapBase, . - __HeapBase
|
|
__HeapLimit:
|
|
.size __HeapLimit, . - __HeapLimit
|
|
|
|
|
|
/* Vector Table */
|
|
|
|
.section .isr_vector
|
|
.align 2
|
|
.globl __isr_vector
|
|
__isr_vector:
|
|
.long __StackTop /* Top of Stack */
|
|
.long Reset_Handler /* Reset Handler */
|
|
.long NMI_Handler /* NMI Handler */
|
|
.long HardFault_Handler /* Hard Fault Handler */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long SVC_Handler /* SVCall Handler */
|
|
.long 0 /* Debug Monitor Handler */
|
|
.long 0 /* Reserved */
|
|
.long PendSV_Handler /* PendSV Handler */
|
|
.long SysTick_Handler /* SysTick Handler */
|
|
|
|
/* External Interrupts */
|
|
.long LVD_Handler /* 16+ 0: LVD Handler */
|
|
.long RTC_Handler /* 16+ 1: RTC Handler */
|
|
.long COMP0_Handler /* 16+ 2: Comp0 Handle */
|
|
.long COMP1_Handler /* 16+ 3: Comp1 Handler */
|
|
.long GPIO0_7_Handler /* 16+ 4: GPIO0_7 Handler */
|
|
.long GPIO8_15_Handler /* 16+ 5: GPIO8_15 Handler */
|
|
.long GPIO16_23_Handler /* 16+ 6: GPIO16_23 Handler */
|
|
.long MTP_Handler /* 16+ 7: MTP Handler */
|
|
.long CHARGER_OK_Handler /* 16+ 8: Charge ok Handler */
|
|
.long CHARGER_END_Handler /* 16+ 9: Charge end Handler */
|
|
.long ADC_Handler /* 16+10: ADC Handler */
|
|
.long LCD_Handler /* 16+11: LCD Handler */
|
|
.long UART0_Handler /* 16+12: UART0 Handler */
|
|
.long UART1_Handler /* 16+13: UART1 Handler */
|
|
.long SPI0_Handler /* 16+14: SPI0 Handler */
|
|
.long SPI1_Handler /* 16+15: SPI1 Handler */
|
|
.long I2C0_Event_Handler /* 16+16: I2C0 Event Handler */
|
|
.long I2C0_Error_Handler /* 16+17: I2C0 Error Handler */
|
|
.long I2C1_Event_Handler /* 16+18: I2C1 Event Handler */
|
|
.long I2C1_Error_Handler /* 16+19: I2C1 Error Handler */
|
|
.long PWM_Handler /* 16+20: PWM Handler */
|
|
.long TIMER0_Handler /* 16+21: Timer 0 Handler */
|
|
.long TIMER1_Handler /* 16+22: Timer 1 Handler */
|
|
.long DUALTIMER_Handler /* 16+23: Dual-Timer Handler */
|
|
.long OVER_TEMP_Handler /* 16+24: over temp Handler */
|
|
.long WG_DRV_Handler /* 16+25: Reserved Handler */
|
|
.long 0 /* 16+26: Reserved Handler */
|
|
.long 0 /* 16+27: Reserved Handler */
|
|
.long 0 /* 16+28: Reserved Handler */
|
|
.long 0 /* 16+29: Reserved Handler */
|
|
.long 0 /* 16+30: Reserved Handler */
|
|
.long 0 /* 16+31: Reserved Handler */
|
|
|
|
.size __isr_vector, . - __isr_vector
|
|
|
|
/* Reset Handler */
|
|
.text
|
|
.thumb
|
|
.thumb_func
|
|
.align 2
|
|
.globl Reset_Handler
|
|
.type Reset_Handler, %function
|
|
Reset_Handler:
|
|
/* Loop to copy data from read only memory to RAM. The ranges
|
|
* of copy from/to are specified by following symbols evaluated in
|
|
* linker script.
|
|
* __etext: End of code section, i.e., begin of data sections to copy from.
|
|
* __data_start__/__data_end__: RAM address range that data should be
|
|
* copied to. Both must be aligned to 4 bytes boundary. */
|
|
|
|
ldr r1, =__etext
|
|
ldr r2, =__data_start__
|
|
ldr r3, =__data_end__
|
|
|
|
subs r3, r2
|
|
ble .LC1
|
|
.LC0:
|
|
subs r3, #4
|
|
ldr r0, [r1, r3]
|
|
str r0, [r2, r3]
|
|
bgt .LC0
|
|
.LC1:
|
|
|
|
#ifdef __STARTUP_CLEAR_BSS
|
|
/* This part of work usually is done in C library startup code. Otherwise,
|
|
* define this macro to enable it in this startup.
|
|
*
|
|
* Loop to zero out BSS section, which uses following symbols
|
|
* in linker script:
|
|
* __bss_start__: start of BSS section. Must align to 4
|
|
* __bss_end__: end of BSS section. Must align to 4
|
|
*/
|
|
ldr r1, =__bss_start__
|
|
ldr r2, =__bss_end__
|
|
|
|
subs r2, r1
|
|
ble .LC3
|
|
|
|
movs r0, 0
|
|
.LC2:
|
|
str r0, [r1, r2]
|
|
subs r2, 4
|
|
bge .LC2
|
|
.LC3:
|
|
#endif /* __STARTUP_CLEAR_BSS */
|
|
|
|
#ifndef __NO_SYSTEM_INIT
|
|
/* bl SystemInit */
|
|
ldr r0,=SystemInit
|
|
blx r0
|
|
#endif
|
|
|
|
bl _start
|
|
|
|
.pool
|
|
.size Reset_Handler, . - Reset_Handler
|
|
|
|
/* Macro to define default handlers. Default handler
|
|
* will be weak symbol and just dead loops. They can be
|
|
* overwritten by other handlers */
|
|
.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
|
|
|
|
/* System Exception Handlers */
|
|
|
|
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
|
|
|
|
/* IRQ Handlers */
|
|
|
|
def_default_handler LVD_Handler
|
|
def_default_handler RTC_Handler
|
|
def_default_handler COMP0_Handler
|
|
def_default_handler COMP1_Handler
|
|
def_default_handler GPIO0_7_Handler
|
|
def_default_handler GPIO8_15_Handler
|
|
def_default_handler GPIO16_23_Handler
|
|
def_default_handler MTP_Handler
|
|
def_default_handler CHARGER_OK_Handler
|
|
def_default_handler CHARGER_END_Handler
|
|
def_default_handler ADC_Handler
|
|
def_default_handler LCD_Handler
|
|
def_default_handler UART0_Handler
|
|
def_default_handler UART1_Handler
|
|
def_default_handler SPI0_Handler
|
|
def_default_handler SPI1_Handler
|
|
def_default_handler I2C0_Event_Handler
|
|
def_default_handler I2C0_Error_Handler
|
|
def_default_handler I2C1_Event_Handler
|
|
def_default_handler I2C1_Error_Handler
|
|
def_default_handler PWM_Handler
|
|
def_default_handler TIMER0_Handler
|
|
def_default_handler TIMER1_Handler
|
|
def_default_handler DUALTIMER_Handler
|
|
def_default_handler OVER_TEMP_Handler
|
|
def_default_handler WG_DRV_Handler
|
|
/*
|
|
def_default_handler Default_Handler
|
|
.weak DEF_IRQHandler
|
|
.set DEF_IRQHandler, Default_Handler
|
|
*/
|
|
.end
|
|
|