1*10465441SEvalZero;/*****************************************************************************/ 2*10465441SEvalZero;/* STARTUP.S: Startup file for Philips LPC2000 */ 3*10465441SEvalZero;/*****************************************************************************/ 4*10465441SEvalZero;/* <<< Use Configuration Wizard in Context Menu >>> */ 5*10465441SEvalZero;/*****************************************************************************/ 6*10465441SEvalZero;/* This file is part of the uVision/ARM development tools. */ 7*10465441SEvalZero;/* Copyright (c) 2005-2007 Keil Software. All rights reserved. */ 8*10465441SEvalZero;/* This software may only be used under the terms of a valid, current, */ 9*10465441SEvalZero;/* end user licence from KEIL for a compatible version of KEIL software */ 10*10465441SEvalZero;/* development tools. Nothing else gives you the right to use this software. */ 11*10465441SEvalZero;/*****************************************************************************/ 12*10465441SEvalZero 13*10465441SEvalZero 14*10465441SEvalZero;/* 15*10465441SEvalZero; * The STARTUP.S code is executed after CPU Reset. This file may be 16*10465441SEvalZero; * translated with the following SET symbols. In uVision these SET 17*10465441SEvalZero; * symbols are entered under Options - ASM - Define. 18*10465441SEvalZero; * 19*10465441SEvalZero; * REMAP: when set the startup code initializes the register MEMMAP 20*10465441SEvalZero; * which overwrites the settings of the CPU configuration pins. The 21*10465441SEvalZero; * startup and interrupt vectors are remapped from: 22*10465441SEvalZero; * 0x00000000 default setting (not remapped) 23*10465441SEvalZero; * 0x80000000 when EXTMEM_MODE is used 24*10465441SEvalZero; * 0x40000000 when RAM_MODE is used 25*10465441SEvalZero; * 26*10465441SEvalZero; * EXTMEM_MODE: when set the device is configured for code execution 27*10465441SEvalZero; * from external memory starting at address 0x80000000. 28*10465441SEvalZero; * 29*10465441SEvalZero; * RAM_MODE: when set the device is configured for code execution 30*10465441SEvalZero; * from on-chip RAM starting at address 0x40000000. 31*10465441SEvalZero; * 32*10465441SEvalZero; * EXTERNAL_MODE: when set the PIN2SEL values are written that enable 33*10465441SEvalZero; * the external BUS at startup. 34*10465441SEvalZero; */ 35*10465441SEvalZero 36*10465441SEvalZero 37*10465441SEvalZero; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs 38*10465441SEvalZero 39*10465441SEvalZeroMode_USR EQU 0x10 40*10465441SEvalZeroMode_FIQ EQU 0x11 41*10465441SEvalZeroMode_IRQ EQU 0x12 42*10465441SEvalZeroMode_SVC EQU 0x13 43*10465441SEvalZeroMode_ABT EQU 0x17 44*10465441SEvalZeroMode_UND EQU 0x1B 45*10465441SEvalZeroMode_SYS EQU 0x1F 46*10465441SEvalZero 47*10465441SEvalZeroI_Bit EQU 0x80 ; when I bit is set, IRQ is disabled 48*10465441SEvalZeroF_Bit EQU 0x40 ; when F bit is set, FIQ is disabled 49*10465441SEvalZero 50*10465441SEvalZero 51*10465441SEvalZero;// <h> Stack Configuration (Stack Sizes in Bytes) 52*10465441SEvalZero;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8> 53*10465441SEvalZero;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8> 54*10465441SEvalZero;// <o2> Abort Mode <0x0-0xFFFFFFFF:8> 55*10465441SEvalZero;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8> 56*10465441SEvalZero;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8> 57*10465441SEvalZero;// <o5> User/System Mode <0x0-0xFFFFFFFF:8> 58*10465441SEvalZero;// </h> 59*10465441SEvalZero 60*10465441SEvalZeroUND_Stack_Size EQU 0x00000000 61*10465441SEvalZeroSVC_Stack_Size EQU 0x00000100 62*10465441SEvalZeroABT_Stack_Size EQU 0x00000000 63*10465441SEvalZeroFIQ_Stack_Size EQU 0x00000000 64*10465441SEvalZeroIRQ_Stack_Size EQU 0x00000100 65*10465441SEvalZeroUSR_Stack_Size EQU 0x00000100 66*10465441SEvalZero 67*10465441SEvalZeroISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ 68*10465441SEvalZero FIQ_Stack_Size + IRQ_Stack_Size) 69*10465441SEvalZero 70*10465441SEvalZero AREA STACK, NOINIT, READWRITE, ALIGN=3 71*10465441SEvalZero 72*10465441SEvalZeroStack_Mem SPACE USR_Stack_Size 73*10465441SEvalZero__initial_sp SPACE ISR_Stack_Size 74*10465441SEvalZero 75*10465441SEvalZeroStack_Top 76*10465441SEvalZero 77*10465441SEvalZero 78*10465441SEvalZero;// <h> Heap Configuration 79*10465441SEvalZero;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF> 80*10465441SEvalZero;// </h> 81*10465441SEvalZero 82*10465441SEvalZeroHeap_Size EQU 0x00000000 83*10465441SEvalZero 84*10465441SEvalZero AREA HEAP, NOINIT, READWRITE, ALIGN=3 85*10465441SEvalZero__heap_base 86*10465441SEvalZeroHeap_Mem SPACE Heap_Size 87*10465441SEvalZero__heap_limit 88*10465441SEvalZero 89*10465441SEvalZero 90*10465441SEvalZero; VPBDIV definitions 91*10465441SEvalZeroVPBDIV EQU 0xE01FC100 ; VPBDIV Address 92*10465441SEvalZero 93*10465441SEvalZero;// <e> VPBDIV Setup 94*10465441SEvalZero;// <i> Peripheral Bus Clock Rate 95*10465441SEvalZero;// <o1.0..1> VPBDIV: VPB Clock 96*10465441SEvalZero;// <0=> VPB Clock = CPU Clock / 4 97*10465441SEvalZero;// <1=> VPB Clock = CPU Clock 98*10465441SEvalZero;// <2=> VPB Clock = CPU Clock / 2 99*10465441SEvalZero;// <o1.4..5> XCLKDIV: XCLK Pin 100*10465441SEvalZero;// <0=> XCLK Pin = CPU Clock / 4 101*10465441SEvalZero;// <1=> XCLK Pin = CPU Clock 102*10465441SEvalZero;// <2=> XCLK Pin = CPU Clock / 2 103*10465441SEvalZero;// </e> 104*10465441SEvalZeroVPBDIV_SETUP EQU 0 105*10465441SEvalZeroVPBDIV_Val EQU 0x00000000 106*10465441SEvalZero 107*10465441SEvalZero 108*10465441SEvalZero; Phase Locked Loop (PLL) definitions 109*10465441SEvalZeroPLL_BASE EQU 0xE01FC080 ; PLL Base Address 110*10465441SEvalZeroPLLCON_OFS EQU 0x00 ; PLL Control Offset 111*10465441SEvalZeroPLLCFG_OFS EQU 0x04 ; PLL Configuration Offset 112*10465441SEvalZeroPLLSTAT_OFS EQU 0x08 ; PLL Status Offset 113*10465441SEvalZeroPLLFEED_OFS EQU 0x0C ; PLL Feed Offset 114*10465441SEvalZeroPLLCON_PLLE EQU (1<<0) ; PLL Enable 115*10465441SEvalZeroPLLCON_PLLC EQU (1<<1) ; PLL Connect 116*10465441SEvalZeroPLLCFG_MSEL EQU (0x1F<<0) ; PLL Multiplier 117*10465441SEvalZeroPLLCFG_PSEL EQU (0x03<<5) ; PLL Divider 118*10465441SEvalZeroPLLSTAT_PLOCK EQU (1<<10) ; PLL Lock Status 119*10465441SEvalZero 120*10465441SEvalZero;// <e> PLL Setup 121*10465441SEvalZero;// <o1.0..4> MSEL: PLL Multiplier Selection 122*10465441SEvalZero;// <1-32><#-1> 123*10465441SEvalZero;// <i> M Value 124*10465441SEvalZero;// <o1.5..6> PSEL: PLL Divider Selection 125*10465441SEvalZero;// <0=> 1 <1=> 2 <2=> 4 <3=> 8 126*10465441SEvalZero;// <i> P Value 127*10465441SEvalZero;// </e> 128*10465441SEvalZeroPLL_SETUP EQU 1 129*10465441SEvalZeroPLLCFG_Val EQU 0x00000024 130*10465441SEvalZero 131*10465441SEvalZero 132*10465441SEvalZero; Memory Accelerator Module (MAM) definitions 133*10465441SEvalZeroMAM_BASE EQU 0xE01FC000 ; MAM Base Address 134*10465441SEvalZeroMAMCR_OFS EQU 0x00 ; MAM Control Offset 135*10465441SEvalZeroMAMTIM_OFS EQU 0x04 ; MAM Timing Offset 136*10465441SEvalZero 137*10465441SEvalZero;// <e> MAM Setup 138*10465441SEvalZero;// <o1.0..1> MAM Control 139*10465441SEvalZero;// <0=> Disabled 140*10465441SEvalZero;// <1=> Partially Enabled 141*10465441SEvalZero;// <2=> Fully Enabled 142*10465441SEvalZero;// <i> Mode 143*10465441SEvalZero;// <o2.0..2> MAM Timing 144*10465441SEvalZero;// <0=> Reserved <1=> 1 <2=> 2 <3=> 3 145*10465441SEvalZero;// <4=> 4 <5=> 5 <6=> 6 <7=> 7 146*10465441SEvalZero;// <i> Fetch Cycles 147*10465441SEvalZero;// </e> 148*10465441SEvalZeroMAM_SETUP EQU 1 149*10465441SEvalZeroMAMCR_Val EQU 0x00000002 150*10465441SEvalZeroMAMTIM_Val EQU 0x00000004 151*10465441SEvalZero 152*10465441SEvalZero 153*10465441SEvalZero; External Memory Controller (EMC) definitions 154*10465441SEvalZeroEMC_BASE EQU 0xFFE00000 ; EMC Base Address 155*10465441SEvalZeroBCFG0_OFS EQU 0x00 ; BCFG0 Offset 156*10465441SEvalZeroBCFG1_OFS EQU 0x04 ; BCFG1 Offset 157*10465441SEvalZeroBCFG2_OFS EQU 0x08 ; BCFG2 Offset 158*10465441SEvalZeroBCFG3_OFS EQU 0x0C ; BCFG3 Offset 159*10465441SEvalZero 160*10465441SEvalZero;// <e> External Memory Controller (EMC) 161*10465441SEvalZeroEMC_SETUP EQU 0 162*10465441SEvalZero 163*10465441SEvalZero;// <e> Bank Configuration 0 (BCFG0) 164*10465441SEvalZero;// <o1.0..3> IDCY: Idle Cycles <0-15> 165*10465441SEvalZero;// <o1.5..9> WST1: Wait States 1 <0-31> 166*10465441SEvalZero;// <o1.11..15> WST2: Wait States 2 <0-31> 167*10465441SEvalZero;// <o1.10> RBLE: Read Byte Lane Enable 168*10465441SEvalZero;// <o1.26> WP: Write Protect 169*10465441SEvalZero;// <o1.27> BM: Burst ROM 170*10465441SEvalZero;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit 171*10465441SEvalZero;// <2=> 32-bit <3=> Reserved 172*10465441SEvalZero;// </e> 173*10465441SEvalZeroBCFG0_SETUP EQU 0 174*10465441SEvalZeroBCFG0_Val EQU 0x0000FBEF 175*10465441SEvalZero 176*10465441SEvalZero;// <e> Bank Configuration 1 (BCFG1) 177*10465441SEvalZero;// <o1.0..3> IDCY: Idle Cycles <0-15> 178*10465441SEvalZero;// <o1.5..9> WST1: Wait States 1 <0-31> 179*10465441SEvalZero;// <o1.11..15> WST2: Wait States 2 <0-31> 180*10465441SEvalZero;// <o1.10> RBLE: Read Byte Lane Enable 181*10465441SEvalZero;// <o1.26> WP: Write Protect 182*10465441SEvalZero;// <o1.27> BM: Burst ROM 183*10465441SEvalZero;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit 184*10465441SEvalZero;// <2=> 32-bit <3=> Reserved 185*10465441SEvalZero;// </e> 186*10465441SEvalZeroBCFG1_SETUP EQU 0 187*10465441SEvalZeroBCFG1_Val EQU 0x0000FBEF 188*10465441SEvalZero 189*10465441SEvalZero;// <e> Bank Configuration 2 (BCFG2) 190*10465441SEvalZero;// <o1.0..3> IDCY: Idle Cycles <0-15> 191*10465441SEvalZero;// <o1.5..9> WST1: Wait States 1 <0-31> 192*10465441SEvalZero;// <o1.11..15> WST2: Wait States 2 <0-31> 193*10465441SEvalZero;// <o1.10> RBLE: Read Byte Lane Enable 194*10465441SEvalZero;// <o1.26> WP: Write Protect 195*10465441SEvalZero;// <o1.27> BM: Burst ROM 196*10465441SEvalZero;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit 197*10465441SEvalZero;// <2=> 32-bit <3=> Reserved 198*10465441SEvalZero;// </e> 199*10465441SEvalZeroBCFG2_SETUP EQU 0 200*10465441SEvalZeroBCFG2_Val EQU 0x0000FBEF 201*10465441SEvalZero 202*10465441SEvalZero;// <e> Bank Configuration 3 (BCFG3) 203*10465441SEvalZero;// <o1.0..3> IDCY: Idle Cycles <0-15> 204*10465441SEvalZero;// <o1.5..9> WST1: Wait States 1 <0-31> 205*10465441SEvalZero;// <o1.11..15> WST2: Wait States 2 <0-31> 206*10465441SEvalZero;// <o1.10> RBLE: Read Byte Lane Enable 207*10465441SEvalZero;// <o1.26> WP: Write Protect 208*10465441SEvalZero;// <o1.27> BM: Burst ROM 209*10465441SEvalZero;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit 210*10465441SEvalZero;// <2=> 32-bit <3=> Reserved 211*10465441SEvalZero;// </e> 212*10465441SEvalZeroBCFG3_SETUP EQU 0 213*10465441SEvalZeroBCFG3_Val EQU 0x0000FBEF 214*10465441SEvalZero 215*10465441SEvalZero;// </e> End of EMC 216*10465441SEvalZero 217*10465441SEvalZero 218*10465441SEvalZero; External Memory Pins definitions 219*10465441SEvalZeroPINSEL2 EQU 0xE002C014 ; PINSEL2 Address 220*10465441SEvalZeroPINSEL2_Val EQU 0x0E6149E4 ; CS0..3, OE, WE, BLS0..3, 221*10465441SEvalZero ; D0..31, A2..23, JTAG Pins 222*10465441SEvalZero 223*10465441SEvalZero 224*10465441SEvalZero PRESERVE8 225*10465441SEvalZero 226*10465441SEvalZero 227*10465441SEvalZero; Area Definition and Entry Point 228*10465441SEvalZero; Startup Code must be linked first at Address at which it expects to run. 229*10465441SEvalZero 230*10465441SEvalZero AREA RESET, CODE, READONLY 231*10465441SEvalZero ARM 232*10465441SEvalZero 233*10465441SEvalZero 234*10465441SEvalZero; Exception Vectors 235*10465441SEvalZero; Mapped to Address 0. 236*10465441SEvalZero; Absolute addressing mode must be used. 237*10465441SEvalZero; Dummy Handlers are implemented as infinite loops which can be modified. 238*10465441SEvalZero 239*10465441SEvalZeroVectors LDR PC, Reset_Addr 240*10465441SEvalZero LDR PC, Undef_Addr 241*10465441SEvalZero LDR PC, SWI_Addr 242*10465441SEvalZero LDR PC, PAbt_Addr 243*10465441SEvalZero LDR PC, DAbt_Addr 244*10465441SEvalZero NOP ; Reserved Vector 245*10465441SEvalZero LDR PC, IRQ_Addr 246*10465441SEvalZero LDR PC, FIQ_Addr 247*10465441SEvalZero 248*10465441SEvalZeroReset_Addr DCD Reset_Handler 249*10465441SEvalZeroUndef_Addr DCD Undef_Handler 250*10465441SEvalZeroSWI_Addr DCD SWI_Handler 251*10465441SEvalZeroPAbt_Addr DCD PAbt_Handler 252*10465441SEvalZeroDAbt_Addr DCD DAbt_Handler 253*10465441SEvalZero DCD 0 ; Reserved Address 254*10465441SEvalZeroIRQ_Addr DCD IRQ_Handler 255*10465441SEvalZeroFIQ_Addr DCD FIQ_Handler 256*10465441SEvalZero 257*10465441SEvalZeroUndef_Handler B Undef_Handler 258*10465441SEvalZeroSWI_Handler B SWI_Handler 259*10465441SEvalZeroPAbt_Handler B PAbt_Handler 260*10465441SEvalZeroDAbt_Handler B DAbt_Handler 261*10465441SEvalZeroFIQ_Handler B FIQ_Handler 262*10465441SEvalZero 263*10465441SEvalZero 264*10465441SEvalZero; Reset Handler 265*10465441SEvalZero 266*10465441SEvalZero EXPORT Reset_Handler 267*10465441SEvalZeroReset_Handler 268*10465441SEvalZero 269*10465441SEvalZero 270*10465441SEvalZero; Setup External Memory Pins 271*10465441SEvalZero IF :DEF:EXTERNAL_MODE 272*10465441SEvalZero LDR R0, =PINSEL2 273*10465441SEvalZero LDR R1, =PINSEL2_Val 274*10465441SEvalZero STR R1, [R0] 275*10465441SEvalZero ENDIF 276*10465441SEvalZero 277*10465441SEvalZero 278*10465441SEvalZero; Setup External Memory Controller 279*10465441SEvalZero IF EMC_SETUP <> 0 280*10465441SEvalZero LDR R0, =EMC_BASE 281*10465441SEvalZero 282*10465441SEvalZero IF BCFG0_SETUP <> 0 283*10465441SEvalZero LDR R1, =BCFG0_Val 284*10465441SEvalZero STR R1, [R0, #BCFG0_OFS] 285*10465441SEvalZero ENDIF 286*10465441SEvalZero 287*10465441SEvalZero IF BCFG1_SETUP <> 0 288*10465441SEvalZero LDR R1, =BCFG1_Val 289*10465441SEvalZero STR R1, [R0, #BCFG1_OFS] 290*10465441SEvalZero ENDIF 291*10465441SEvalZero 292*10465441SEvalZero IF BCFG2_SETUP <> 0 293*10465441SEvalZero LDR R1, =BCFG2_Val 294*10465441SEvalZero STR R1, [R0, #BCFG2_OFS] 295*10465441SEvalZero ENDIF 296*10465441SEvalZero 297*10465441SEvalZero IF BCFG3_SETUP <> 0 298*10465441SEvalZero LDR R1, =BCFG3_Val 299*10465441SEvalZero STR R1, [R0, #BCFG3_OFS] 300*10465441SEvalZero ENDIF 301*10465441SEvalZero 302*10465441SEvalZero ENDIF ; EMC_SETUP 303*10465441SEvalZero 304*10465441SEvalZero 305*10465441SEvalZero; Setup VPBDIV 306*10465441SEvalZero IF VPBDIV_SETUP <> 0 307*10465441SEvalZero LDR R0, =VPBDIV 308*10465441SEvalZero LDR R1, =VPBDIV_Val 309*10465441SEvalZero STR R1, [R0] 310*10465441SEvalZero ENDIF 311*10465441SEvalZero 312*10465441SEvalZero 313*10465441SEvalZero; Setup PLL 314*10465441SEvalZero IF PLL_SETUP <> 0 315*10465441SEvalZero LDR R0, =PLL_BASE 316*10465441SEvalZero MOV R1, #0xAA 317*10465441SEvalZero MOV R2, #0x55 318*10465441SEvalZero 319*10465441SEvalZero; Configure and Enable PLL 320*10465441SEvalZero MOV R3, #PLLCFG_Val 321*10465441SEvalZero STR R3, [R0, #PLLCFG_OFS] 322*10465441SEvalZero MOV R3, #PLLCON_PLLE 323*10465441SEvalZero STR R3, [R0, #PLLCON_OFS] 324*10465441SEvalZero STR R1, [R0, #PLLFEED_OFS] 325*10465441SEvalZero STR R2, [R0, #PLLFEED_OFS] 326*10465441SEvalZero 327*10465441SEvalZero; Wait until PLL Locked 328*10465441SEvalZeroPLL_Loop LDR R3, [R0, #PLLSTAT_OFS] 329*10465441SEvalZero ANDS R3, R3, #PLLSTAT_PLOCK 330*10465441SEvalZero BEQ PLL_Loop 331*10465441SEvalZero 332*10465441SEvalZero; Switch to PLL Clock 333*10465441SEvalZero MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC) 334*10465441SEvalZero STR R3, [R0, #PLLCON_OFS] 335*10465441SEvalZero STR R1, [R0, #PLLFEED_OFS] 336*10465441SEvalZero STR R2, [R0, #PLLFEED_OFS] 337*10465441SEvalZero ENDIF ; PLL_SETUP 338*10465441SEvalZero 339*10465441SEvalZero 340*10465441SEvalZero; Setup MAM 341*10465441SEvalZero IF MAM_SETUP <> 0 342*10465441SEvalZero LDR R0, =MAM_BASE 343*10465441SEvalZero MOV R1, #MAMTIM_Val 344*10465441SEvalZero STR R1, [R0, #MAMTIM_OFS] 345*10465441SEvalZero MOV R1, #MAMCR_Val 346*10465441SEvalZero STR R1, [R0, #MAMCR_OFS] 347*10465441SEvalZero ENDIF ; MAM_SETUP 348*10465441SEvalZero 349*10465441SEvalZero 350*10465441SEvalZero; Memory Mapping (when Interrupt Vectors are in RAM) 351*10465441SEvalZeroMEMMAP EQU 0xE01FC040 ; Memory Mapping Control 352*10465441SEvalZero IF :DEF:REMAP 353*10465441SEvalZero LDR R0, =MEMMAP 354*10465441SEvalZero IF :DEF:EXTMEM_MODE 355*10465441SEvalZero MOV R1, #3 356*10465441SEvalZero ELIF :DEF:RAM_MODE 357*10465441SEvalZero MOV R1, #2 358*10465441SEvalZero ELSE 359*10465441SEvalZero MOV R1, #1 360*10465441SEvalZero ENDIF 361*10465441SEvalZero STR R1, [R0] 362*10465441SEvalZero ENDIF 363*10465441SEvalZero 364*10465441SEvalZero 365*10465441SEvalZero; Initialise Interrupt System 366*10465441SEvalZero; ... 367*10465441SEvalZero 368*10465441SEvalZero 369*10465441SEvalZero; Setup Stack for each mode 370*10465441SEvalZero 371*10465441SEvalZero LDR R0, =Stack_Top 372*10465441SEvalZero 373*10465441SEvalZero; Enter Undefined Instruction Mode and set its Stack Pointer 374*10465441SEvalZero MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit 375*10465441SEvalZero MOV SP, R0 376*10465441SEvalZero SUB R0, R0, #UND_Stack_Size 377*10465441SEvalZero 378*10465441SEvalZero; Enter Abort Mode and set its Stack Pointer 379*10465441SEvalZero MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit 380*10465441SEvalZero MOV SP, R0 381*10465441SEvalZero SUB R0, R0, #ABT_Stack_Size 382*10465441SEvalZero 383*10465441SEvalZero; Enter FIQ Mode and set its Stack Pointer 384*10465441SEvalZero MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit 385*10465441SEvalZero MOV SP, R0 386*10465441SEvalZero SUB R0, R0, #FIQ_Stack_Size 387*10465441SEvalZero 388*10465441SEvalZero; Enter IRQ Mode and set its Stack Pointer 389*10465441SEvalZero MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit 390*10465441SEvalZero MOV SP, R0 391*10465441SEvalZero SUB R0, R0, #IRQ_Stack_Size 392*10465441SEvalZero 393*10465441SEvalZero; Enter Supervisor Mode and set its Stack Pointer 394*10465441SEvalZero MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit 395*10465441SEvalZero MOV SP, R0 396*10465441SEvalZero ; SUB R0, R0, #SVC_Stack_Size 397*10465441SEvalZero 398*10465441SEvalZero; Enter User Mode and set its Stack Pointer 399*10465441SEvalZero ; RT-Thread does not use user mode 400*10465441SEvalZero ; MSR CPSR_c, #Mode_USR 401*10465441SEvalZero IF :DEF:__MICROLIB 402*10465441SEvalZero 403*10465441SEvalZero EXPORT __initial_sp 404*10465441SEvalZero 405*10465441SEvalZero ELSE 406*10465441SEvalZero 407*10465441SEvalZero ; MOV SP, R0 408*10465441SEvalZero ; SUB SL, SP, #USR_Stack_Size 409*10465441SEvalZero 410*10465441SEvalZero ENDIF 411*10465441SEvalZero 412*10465441SEvalZero; Enter the C code 413*10465441SEvalZero 414*10465441SEvalZero IMPORT __main 415*10465441SEvalZero LDR R0, =__main 416*10465441SEvalZero BX R0 417*10465441SEvalZero 418*10465441SEvalZero IMPORT rt_interrupt_enter 419*10465441SEvalZero IMPORT rt_interrupt_leave 420*10465441SEvalZero IMPORT rt_thread_switch_interrupt_flag 421*10465441SEvalZero IMPORT rt_interrupt_from_thread 422*10465441SEvalZero IMPORT rt_interrupt_to_thread 423*10465441SEvalZero IMPORT rt_hw_trap_irq 424*10465441SEvalZero IMPORT rt_hw_context_switch_interrupt_do 425*10465441SEvalZero 426*10465441SEvalZeroIRQ_Handler PROC 427*10465441SEvalZero EXPORT IRQ_Handler 428*10465441SEvalZero STMFD sp!, {r0-r12,lr} 429*10465441SEvalZero BL rt_interrupt_enter 430*10465441SEvalZero BL rt_hw_trap_irq 431*10465441SEvalZero BL rt_interrupt_leave 432*10465441SEvalZero 433*10465441SEvalZero ; if rt_thread_switch_interrupt_flag set, jump to 434*10465441SEvalZero ; rt_hw_context_switch_interrupt_do and don't return 435*10465441SEvalZero LDR r0, =rt_thread_switch_interrupt_flag 436*10465441SEvalZero LDR r1, [r0] 437*10465441SEvalZero CMP r1, #1 438*10465441SEvalZero BEQ rt_hw_context_switch_interrupt_do 439*10465441SEvalZero 440*10465441SEvalZero LDMFD sp!, {r0-r12,lr} 441*10465441SEvalZero SUBS pc, lr, #4 442*10465441SEvalZero ENDP 443*10465441SEvalZero 444*10465441SEvalZero IF :DEF:__MICROLIB 445*10465441SEvalZero 446*10465441SEvalZero EXPORT __heap_base 447*10465441SEvalZero EXPORT __heap_limit 448*10465441SEvalZero 449*10465441SEvalZero ELSE 450*10465441SEvalZero; User Initial Stack & Heap 451*10465441SEvalZero AREA |.text|, CODE, READONLY 452*10465441SEvalZero 453*10465441SEvalZero IMPORT __use_two_region_memory 454*10465441SEvalZero EXPORT __user_initial_stackheap 455*10465441SEvalZero__user_initial_stackheap 456*10465441SEvalZero 457*10465441SEvalZero LDR R0, = Heap_Mem 458*10465441SEvalZero LDR R1, =(Stack_Mem + USR_Stack_Size) 459*10465441SEvalZero LDR R2, = (Heap_Mem + Heap_Size) 460*10465441SEvalZero LDR R3, = Stack_Mem 461*10465441SEvalZero BX LR 462*10465441SEvalZero ENDIF 463*10465441SEvalZero 464*10465441SEvalZero END 465