1*150812a8SEvalZero/* 2*150812a8SEvalZero 3*150812a8SEvalZeroCopyright (c) 2009-2018 ARM Limited. All rights reserved. 4*150812a8SEvalZero 5*150812a8SEvalZero SPDX-License-Identifier: Apache-2.0 6*150812a8SEvalZero 7*150812a8SEvalZeroLicensed under the Apache License, Version 2.0 (the License); you may 8*150812a8SEvalZeronot use this file except in compliance with the License. 9*150812a8SEvalZeroYou may obtain a copy of the License at 10*150812a8SEvalZero 11*150812a8SEvalZero www.apache.org/licenses/LICENSE-2.0 12*150812a8SEvalZero 13*150812a8SEvalZeroUnless required by applicable law or agreed to in writing, software 14*150812a8SEvalZerodistributed under the License is distributed on an AS IS BASIS, WITHOUT 15*150812a8SEvalZeroWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*150812a8SEvalZeroSee the License for the specific language governing permissions and 17*150812a8SEvalZerolimitations under the License. 18*150812a8SEvalZero 19*150812a8SEvalZeroNOTICE: This file has been modified by Nordic Semiconductor ASA. 20*150812a8SEvalZero 21*150812a8SEvalZero*/ 22*150812a8SEvalZero 23*150812a8SEvalZero .syntax unified 24*150812a8SEvalZero .arch armv7e-m 25*150812a8SEvalZero 26*150812a8SEvalZero#ifdef __STARTUP_CONFIG 27*150812a8SEvalZero#include "startup_config.h" 28*150812a8SEvalZero#ifndef __STARTUP_CONFIG_STACK_ALIGNEMENT 29*150812a8SEvalZero#define __STARTUP_CONFIG_STACK_ALIGNEMENT 3 30*150812a8SEvalZero#endif 31*150812a8SEvalZero#endif 32*150812a8SEvalZero 33*150812a8SEvalZero .section .stack 34*150812a8SEvalZero#if defined(__STARTUP_CONFIG) 35*150812a8SEvalZero .align __STARTUP_CONFIG_STACK_ALIGNEMENT 36*150812a8SEvalZero .equ Stack_Size, __STARTUP_CONFIG_STACK_SIZE 37*150812a8SEvalZero#elif defined(__STACK_SIZE) 38*150812a8SEvalZero .align 3 39*150812a8SEvalZero .equ Stack_Size, __STACK_SIZE 40*150812a8SEvalZero#else 41*150812a8SEvalZero .align 3 42*150812a8SEvalZero .equ Stack_Size, 2048 43*150812a8SEvalZero#endif 44*150812a8SEvalZero .globl __StackTop 45*150812a8SEvalZero .globl __StackLimit 46*150812a8SEvalZero__StackLimit: 47*150812a8SEvalZero .space Stack_Size 48*150812a8SEvalZero .size __StackLimit, . - __StackLimit 49*150812a8SEvalZero__StackTop: 50*150812a8SEvalZero .size __StackTop, . - __StackTop 51*150812a8SEvalZero 52*150812a8SEvalZero .section .heap 53*150812a8SEvalZero .align 3 54*150812a8SEvalZero#if defined(__STARTUP_CONFIG) 55*150812a8SEvalZero .equ Heap_Size, __STARTUP_CONFIG_HEAP_SIZE 56*150812a8SEvalZero#elif defined(__HEAP_SIZE) 57*150812a8SEvalZero .equ Heap_Size, __HEAP_SIZE 58*150812a8SEvalZero#else 59*150812a8SEvalZero .equ Heap_Size, 2048 60*150812a8SEvalZero#endif 61*150812a8SEvalZero .globl __HeapBase 62*150812a8SEvalZero .globl __HeapLimit 63*150812a8SEvalZero__HeapBase: 64*150812a8SEvalZero .if Heap_Size 65*150812a8SEvalZero .space Heap_Size 66*150812a8SEvalZero .endif 67*150812a8SEvalZero .size __HeapBase, . - __HeapBase 68*150812a8SEvalZero__HeapLimit: 69*150812a8SEvalZero .size __HeapLimit, . - __HeapLimit 70*150812a8SEvalZero 71*150812a8SEvalZero .section .isr_vector 72*150812a8SEvalZero .align 2 73*150812a8SEvalZero .globl __isr_vector 74*150812a8SEvalZero__isr_vector: 75*150812a8SEvalZero .long __StackTop /* Top of Stack */ 76*150812a8SEvalZero .long Reset_Handler 77*150812a8SEvalZero .long NMI_Handler 78*150812a8SEvalZero .long HardFault_Handler 79*150812a8SEvalZero .long MemoryManagement_Handler 80*150812a8SEvalZero .long BusFault_Handler 81*150812a8SEvalZero .long UsageFault_Handler 82*150812a8SEvalZero .long 0 /*Reserved */ 83*150812a8SEvalZero .long 0 /*Reserved */ 84*150812a8SEvalZero .long 0 /*Reserved */ 85*150812a8SEvalZero .long 0 /*Reserved */ 86*150812a8SEvalZero .long SVC_Handler 87*150812a8SEvalZero .long DebugMon_Handler 88*150812a8SEvalZero .long 0 /*Reserved */ 89*150812a8SEvalZero .long PendSV_Handler 90*150812a8SEvalZero .long SysTick_Handler 91*150812a8SEvalZero 92*150812a8SEvalZero /* External Interrupts */ 93*150812a8SEvalZero .long POWER_CLOCK_IRQHandler 94*150812a8SEvalZero .long RADIO_IRQHandler 95*150812a8SEvalZero .long UARTE0_IRQHandler 96*150812a8SEvalZero .long TWIM0_TWIS0_IRQHandler 97*150812a8SEvalZero .long SPIM0_SPIS0_IRQHandler 98*150812a8SEvalZero .long 0 /*Reserved */ 99*150812a8SEvalZero .long GPIOTE_IRQHandler 100*150812a8SEvalZero .long SAADC_IRQHandler 101*150812a8SEvalZero .long TIMER0_IRQHandler 102*150812a8SEvalZero .long TIMER1_IRQHandler 103*150812a8SEvalZero .long TIMER2_IRQHandler 104*150812a8SEvalZero .long RTC0_IRQHandler 105*150812a8SEvalZero .long TEMP_IRQHandler 106*150812a8SEvalZero .long RNG_IRQHandler 107*150812a8SEvalZero .long ECB_IRQHandler 108*150812a8SEvalZero .long CCM_AAR_IRQHandler 109*150812a8SEvalZero .long WDT_IRQHandler 110*150812a8SEvalZero .long RTC1_IRQHandler 111*150812a8SEvalZero .long QDEC_IRQHandler 112*150812a8SEvalZero .long COMP_IRQHandler 113*150812a8SEvalZero .long SWI0_EGU0_IRQHandler 114*150812a8SEvalZero .long SWI1_EGU1_IRQHandler 115*150812a8SEvalZero .long SWI2_IRQHandler 116*150812a8SEvalZero .long SWI3_IRQHandler 117*150812a8SEvalZero .long SWI4_IRQHandler 118*150812a8SEvalZero .long SWI5_IRQHandler 119*150812a8SEvalZero .long 0 /*Reserved */ 120*150812a8SEvalZero .long 0 /*Reserved */ 121*150812a8SEvalZero .long PWM0_IRQHandler 122*150812a8SEvalZero .long PDM_IRQHandler 123*150812a8SEvalZero .long 0 /*Reserved */ 124*150812a8SEvalZero .long 0 /*Reserved */ 125*150812a8SEvalZero .long 0 /*Reserved */ 126*150812a8SEvalZero .long 0 /*Reserved */ 127*150812a8SEvalZero .long 0 /*Reserved */ 128*150812a8SEvalZero .long 0 /*Reserved */ 129*150812a8SEvalZero .long 0 /*Reserved */ 130*150812a8SEvalZero .long 0 /*Reserved */ 131*150812a8SEvalZero .long 0 /*Reserved */ 132*150812a8SEvalZero .long 0 /*Reserved */ 133*150812a8SEvalZero .long 0 /*Reserved */ 134*150812a8SEvalZero .long 0 /*Reserved */ 135*150812a8SEvalZero .long 0 /*Reserved */ 136*150812a8SEvalZero .long 0 /*Reserved */ 137*150812a8SEvalZero .long 0 /*Reserved */ 138*150812a8SEvalZero .long 0 /*Reserved */ 139*150812a8SEvalZero .long 0 /*Reserved */ 140*150812a8SEvalZero .long 0 /*Reserved */ 141*150812a8SEvalZero .long 0 /*Reserved */ 142*150812a8SEvalZero .long 0 /*Reserved */ 143*150812a8SEvalZero .long 0 /*Reserved */ 144*150812a8SEvalZero .long 0 /*Reserved */ 145*150812a8SEvalZero .long 0 /*Reserved */ 146*150812a8SEvalZero .long 0 /*Reserved */ 147*150812a8SEvalZero .long 0 /*Reserved */ 148*150812a8SEvalZero .long 0 /*Reserved */ 149*150812a8SEvalZero .long 0 /*Reserved */ 150*150812a8SEvalZero .long 0 /*Reserved */ 151*150812a8SEvalZero .long 0 /*Reserved */ 152*150812a8SEvalZero .long 0 /*Reserved */ 153*150812a8SEvalZero .long 0 /*Reserved */ 154*150812a8SEvalZero .long 0 /*Reserved */ 155*150812a8SEvalZero .long 0 /*Reserved */ 156*150812a8SEvalZero .long 0 /*Reserved */ 157*150812a8SEvalZero .long 0 /*Reserved */ 158*150812a8SEvalZero .long 0 /*Reserved */ 159*150812a8SEvalZero .long 0 /*Reserved */ 160*150812a8SEvalZero .long 0 /*Reserved */ 161*150812a8SEvalZero .long 0 /*Reserved */ 162*150812a8SEvalZero .long 0 /*Reserved */ 163*150812a8SEvalZero .long 0 /*Reserved */ 164*150812a8SEvalZero .long 0 /*Reserved */ 165*150812a8SEvalZero .long 0 /*Reserved */ 166*150812a8SEvalZero .long 0 /*Reserved */ 167*150812a8SEvalZero .long 0 /*Reserved */ 168*150812a8SEvalZero .long 0 /*Reserved */ 169*150812a8SEvalZero .long 0 /*Reserved */ 170*150812a8SEvalZero .long 0 /*Reserved */ 171*150812a8SEvalZero .long 0 /*Reserved */ 172*150812a8SEvalZero .long 0 /*Reserved */ 173*150812a8SEvalZero .long 0 /*Reserved */ 174*150812a8SEvalZero .long 0 /*Reserved */ 175*150812a8SEvalZero .long 0 /*Reserved */ 176*150812a8SEvalZero .long 0 /*Reserved */ 177*150812a8SEvalZero .long 0 /*Reserved */ 178*150812a8SEvalZero .long 0 /*Reserved */ 179*150812a8SEvalZero .long 0 /*Reserved */ 180*150812a8SEvalZero .long 0 /*Reserved */ 181*150812a8SEvalZero .long 0 /*Reserved */ 182*150812a8SEvalZero .long 0 /*Reserved */ 183*150812a8SEvalZero .long 0 /*Reserved */ 184*150812a8SEvalZero .long 0 /*Reserved */ 185*150812a8SEvalZero .long 0 /*Reserved */ 186*150812a8SEvalZero .long 0 /*Reserved */ 187*150812a8SEvalZero .long 0 /*Reserved */ 188*150812a8SEvalZero .long 0 /*Reserved */ 189*150812a8SEvalZero .long 0 /*Reserved */ 190*150812a8SEvalZero .long 0 /*Reserved */ 191*150812a8SEvalZero .long 0 /*Reserved */ 192*150812a8SEvalZero .long 0 /*Reserved */ 193*150812a8SEvalZero .long 0 /*Reserved */ 194*150812a8SEvalZero .long 0 /*Reserved */ 195*150812a8SEvalZero .long 0 /*Reserved */ 196*150812a8SEvalZero .long 0 /*Reserved */ 197*150812a8SEvalZero .long 0 /*Reserved */ 198*150812a8SEvalZero .long 0 /*Reserved */ 199*150812a8SEvalZero .long 0 /*Reserved */ 200*150812a8SEvalZero .long 0 /*Reserved */ 201*150812a8SEvalZero .long 0 /*Reserved */ 202*150812a8SEvalZero .long 0 /*Reserved */ 203*150812a8SEvalZero .long 0 /*Reserved */ 204*150812a8SEvalZero .long 0 /*Reserved */ 205*150812a8SEvalZero 206*150812a8SEvalZero .size __isr_vector, . - __isr_vector 207*150812a8SEvalZero 208*150812a8SEvalZero/* Reset Handler */ 209*150812a8SEvalZero 210*150812a8SEvalZero 211*150812a8SEvalZero .text 212*150812a8SEvalZero .thumb 213*150812a8SEvalZero .thumb_func 214*150812a8SEvalZero .align 1 215*150812a8SEvalZero .globl Reset_Handler 216*150812a8SEvalZero .type Reset_Handler, %function 217*150812a8SEvalZeroReset_Handler: 218*150812a8SEvalZero 219*150812a8SEvalZero 220*150812a8SEvalZero/* Loop to copy data from read only memory to RAM. 221*150812a8SEvalZero * The ranges of copy from/to are specified by following symbols: 222*150812a8SEvalZero * __etext: LMA of start of the section to copy from. Usually end of text 223*150812a8SEvalZero * __data_start__: VMA of start of the section to copy to. 224*150812a8SEvalZero * __bss_start__: VMA of end of the section to copy to. Normally __data_end__ is used, but by using __bss_start__ 225*150812a8SEvalZero * the user can add their own initialized data section before BSS section with the INTERT AFTER command. 226*150812a8SEvalZero * 227*150812a8SEvalZero * All addresses must be aligned to 4 bytes boundary. 228*150812a8SEvalZero */ 229*150812a8SEvalZero ldr r1, =__etext 230*150812a8SEvalZero ldr r2, =__data_start__ 231*150812a8SEvalZero ldr r3, =__bss_start__ 232*150812a8SEvalZero 233*150812a8SEvalZero subs r3, r3, r2 234*150812a8SEvalZero ble .L_loop1_done 235*150812a8SEvalZero 236*150812a8SEvalZero.L_loop1: 237*150812a8SEvalZero subs r3, r3, #4 238*150812a8SEvalZero ldr r0, [r1,r3] 239*150812a8SEvalZero str r0, [r2,r3] 240*150812a8SEvalZero bgt .L_loop1 241*150812a8SEvalZero 242*150812a8SEvalZero.L_loop1_done: 243*150812a8SEvalZero 244*150812a8SEvalZero/* This part of work usually is done in C library startup code. Otherwise, 245*150812a8SEvalZero * define __STARTUP_CLEAR_BSS to enable it in this startup. This section 246*150812a8SEvalZero * clears the RAM where BSS data is located. 247*150812a8SEvalZero * 248*150812a8SEvalZero * The BSS section is specified by following symbols 249*150812a8SEvalZero * __bss_start__: start of the BSS section. 250*150812a8SEvalZero * __bss_end__: end of the BSS section. 251*150812a8SEvalZero * 252*150812a8SEvalZero * All addresses must be aligned to 4 bytes boundary. 253*150812a8SEvalZero */ 254*150812a8SEvalZero#ifdef __STARTUP_CLEAR_BSS 255*150812a8SEvalZero ldr r1, =__bss_start__ 256*150812a8SEvalZero ldr r2, =__bss_end__ 257*150812a8SEvalZero 258*150812a8SEvalZero movs r0, 0 259*150812a8SEvalZero 260*150812a8SEvalZero subs r2, r2, r1 261*150812a8SEvalZero ble .L_loop3_done 262*150812a8SEvalZero 263*150812a8SEvalZero.L_loop3: 264*150812a8SEvalZero subs r2, r2, #4 265*150812a8SEvalZero str r0, [r1, r2] 266*150812a8SEvalZero bgt .L_loop3 267*150812a8SEvalZero 268*150812a8SEvalZero.L_loop3_done: 269*150812a8SEvalZero#endif /* __STARTUP_CLEAR_BSS */ 270*150812a8SEvalZero 271*150812a8SEvalZero/* Execute SystemInit function. */ 272*150812a8SEvalZero bl SystemInit 273*150812a8SEvalZero 274*150812a8SEvalZero/* Call _start function provided by libraries. 275*150812a8SEvalZero * If those libraries are not accessible, define __START as your entry point. 276*150812a8SEvalZero */ 277*150812a8SEvalZero#ifndef __START 278*150812a8SEvalZero#define __START _start 279*150812a8SEvalZero#endif 280*150812a8SEvalZero bl __START 281*150812a8SEvalZero 282*150812a8SEvalZero .pool 283*150812a8SEvalZero .size Reset_Handler,.-Reset_Handler 284*150812a8SEvalZero 285*150812a8SEvalZero .section ".text" 286*150812a8SEvalZero 287*150812a8SEvalZero 288*150812a8SEvalZero/* Dummy Exception Handlers (infinite loops which can be modified) */ 289*150812a8SEvalZero 290*150812a8SEvalZero .weak NMI_Handler 291*150812a8SEvalZero .type NMI_Handler, %function 292*150812a8SEvalZeroNMI_Handler: 293*150812a8SEvalZero b . 294*150812a8SEvalZero .size NMI_Handler, . - NMI_Handler 295*150812a8SEvalZero 296*150812a8SEvalZero 297*150812a8SEvalZero .weak HardFault_Handler 298*150812a8SEvalZero .type HardFault_Handler, %function 299*150812a8SEvalZeroHardFault_Handler: 300*150812a8SEvalZero b . 301*150812a8SEvalZero .size HardFault_Handler, . - HardFault_Handler 302*150812a8SEvalZero 303*150812a8SEvalZero 304*150812a8SEvalZero .weak MemoryManagement_Handler 305*150812a8SEvalZero .type MemoryManagement_Handler, %function 306*150812a8SEvalZeroMemoryManagement_Handler: 307*150812a8SEvalZero b . 308*150812a8SEvalZero .size MemoryManagement_Handler, . - MemoryManagement_Handler 309*150812a8SEvalZero 310*150812a8SEvalZero 311*150812a8SEvalZero .weak BusFault_Handler 312*150812a8SEvalZero .type BusFault_Handler, %function 313*150812a8SEvalZeroBusFault_Handler: 314*150812a8SEvalZero b . 315*150812a8SEvalZero .size BusFault_Handler, . - BusFault_Handler 316*150812a8SEvalZero 317*150812a8SEvalZero 318*150812a8SEvalZero .weak UsageFault_Handler 319*150812a8SEvalZero .type UsageFault_Handler, %function 320*150812a8SEvalZeroUsageFault_Handler: 321*150812a8SEvalZero b . 322*150812a8SEvalZero .size UsageFault_Handler, . - UsageFault_Handler 323*150812a8SEvalZero 324*150812a8SEvalZero 325*150812a8SEvalZero .weak SVC_Handler 326*150812a8SEvalZero .type SVC_Handler, %function 327*150812a8SEvalZeroSVC_Handler: 328*150812a8SEvalZero b . 329*150812a8SEvalZero .size SVC_Handler, . - SVC_Handler 330*150812a8SEvalZero 331*150812a8SEvalZero 332*150812a8SEvalZero .weak DebugMon_Handler 333*150812a8SEvalZero .type DebugMon_Handler, %function 334*150812a8SEvalZeroDebugMon_Handler: 335*150812a8SEvalZero b . 336*150812a8SEvalZero .size DebugMon_Handler, . - DebugMon_Handler 337*150812a8SEvalZero 338*150812a8SEvalZero 339*150812a8SEvalZero .weak PendSV_Handler 340*150812a8SEvalZero .type PendSV_Handler, %function 341*150812a8SEvalZeroPendSV_Handler: 342*150812a8SEvalZero b . 343*150812a8SEvalZero .size PendSV_Handler, . - PendSV_Handler 344*150812a8SEvalZero 345*150812a8SEvalZero 346*150812a8SEvalZero .weak SysTick_Handler 347*150812a8SEvalZero .type SysTick_Handler, %function 348*150812a8SEvalZeroSysTick_Handler: 349*150812a8SEvalZero b . 350*150812a8SEvalZero .size SysTick_Handler, . - SysTick_Handler 351*150812a8SEvalZero 352*150812a8SEvalZero 353*150812a8SEvalZero/* IRQ Handlers */ 354*150812a8SEvalZero 355*150812a8SEvalZero .globl Default_Handler 356*150812a8SEvalZero .type Default_Handler, %function 357*150812a8SEvalZeroDefault_Handler: 358*150812a8SEvalZero b . 359*150812a8SEvalZero .size Default_Handler, . - Default_Handler 360*150812a8SEvalZero 361*150812a8SEvalZero .macro IRQ handler 362*150812a8SEvalZero .weak \handler 363*150812a8SEvalZero .set \handler, Default_Handler 364*150812a8SEvalZero .endm 365*150812a8SEvalZero 366*150812a8SEvalZero IRQ POWER_CLOCK_IRQHandler 367*150812a8SEvalZero IRQ RADIO_IRQHandler 368*150812a8SEvalZero IRQ UARTE0_IRQHandler 369*150812a8SEvalZero IRQ TWIM0_TWIS0_IRQHandler 370*150812a8SEvalZero IRQ SPIM0_SPIS0_IRQHandler 371*150812a8SEvalZero IRQ GPIOTE_IRQHandler 372*150812a8SEvalZero IRQ SAADC_IRQHandler 373*150812a8SEvalZero IRQ TIMER0_IRQHandler 374*150812a8SEvalZero IRQ TIMER1_IRQHandler 375*150812a8SEvalZero IRQ TIMER2_IRQHandler 376*150812a8SEvalZero IRQ RTC0_IRQHandler 377*150812a8SEvalZero IRQ TEMP_IRQHandler 378*150812a8SEvalZero IRQ RNG_IRQHandler 379*150812a8SEvalZero IRQ ECB_IRQHandler 380*150812a8SEvalZero IRQ CCM_AAR_IRQHandler 381*150812a8SEvalZero IRQ WDT_IRQHandler 382*150812a8SEvalZero IRQ RTC1_IRQHandler 383*150812a8SEvalZero IRQ QDEC_IRQHandler 384*150812a8SEvalZero IRQ COMP_IRQHandler 385*150812a8SEvalZero IRQ SWI0_EGU0_IRQHandler 386*150812a8SEvalZero IRQ SWI1_EGU1_IRQHandler 387*150812a8SEvalZero IRQ SWI2_IRQHandler 388*150812a8SEvalZero IRQ SWI3_IRQHandler 389*150812a8SEvalZero IRQ SWI4_IRQHandler 390*150812a8SEvalZero IRQ SWI5_IRQHandler 391*150812a8SEvalZero IRQ PWM0_IRQHandler 392*150812a8SEvalZero IRQ PDM_IRQHandler 393*150812a8SEvalZero 394*150812a8SEvalZero .end 395