Startup.s
上传用户:dsfgsdff
上传日期:2022-07-10
资源大小:319k
文件大小:13k
- ;/*****************************************************************************/
- ;/* STARTUP.S: Startup file for Philips LPC2000 */
- ;/*****************************************************************************/
- ;/* <<< Use Configuration Wizard in Context Menu >>> */
- ;/*****************************************************************************/
- ;/* This file is part of the uVision/ARM development tools. */
- ;/* Copyright (c) 2005-2006 Keil Software. All rights reserved. */
- ;/* This software may only be used under the terms of a valid, current, */
- ;/* end user licence from KEIL for a compatible version of KEIL software */
- ;/* development tools. Nothing else gives you the right to use this software. */
- ;/*****************************************************************************/
- ;/*
- ; * The STARTUP.S code is executed after CPU Reset. This file may be
- ; * translated with the following SET symbols. In uVision these SET
- ; * symbols are entered under Options - ASM - Define.
- ; *
- ; * REMAP: when set the startup code initializes the register MEMMAP
- ; * which overwrites the settings of the CPU configuration pins. The
- ; * startup and interrupt vectors are remapped from:
- ; * 0x00000000 default setting (not remapped)
- ; * 0x80000000 when EXTMEM_MODE is used
- ; * 0x40000000 when RAM_MODE is used
- ; *
- ; * EXTMEM_MODE: when set the device is configured for code execution
- ; * from external memory starting at address 0x80000000.
- ; *
- ; * RAM_MODE: when set the device is configured for code execution
- ; * from on-chip RAM starting at address 0x40000000.
- ; */
- ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
- IMPORT SoftwareInterrupt
- EXPORT StackUsr
- Mode_USR EQU 0x10
- Mode_FIQ EQU 0x11
- Mode_IRQ EQU 0x12
- Mode_SVC EQU 0x13
- Mode_ABT EQU 0x17
- Mode_UND EQU 0x1B
- Mode_SYS EQU 0x1F
- I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
- F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
- ;// <h> Stack Configuration (Stack Sizes in Bytes)
- ;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8>
- ;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8>
- ;// <o2> Abort Mode <0x0-0xFFFFFFFF:8>
- ;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
- ;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8>
- ;// <o5> User/System Mode <0x0-0xFFFFFFFF:8>
- ;// </h>
- UND_Stack_Size EQU 0x00000000
- SVC_Stack_Size EQU 0x00000080
- ABT_Stack_Size EQU 0x00000000
- FIQ_Stack_Size EQU 0x00000000
- IRQ_Stack_Size EQU 0x00000080
- USR_Stack_Size EQU 0x00000400
- Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size +
- FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
- AREA STACK, NOINIT, READWRITE, ALIGN=3
- Stack_Mem SPACE Stack_Size
- Stack_Top EQU Stack_Mem + Stack_Size
- ;// <h> Heap Configuration
- ;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF>
- ;// </h>
- AREA Stacks, DATA, NOINIT
- StackUsr
- Heap_Size EQU 0x00000100
- AREA HEAP, NOINIT, READWRITE, ALIGN=3
- Heap_Mem SPACE Heap_Size
- ; VPBDIV definitions
- VPBDIV EQU 0xE01FC100 ; VPBDIV Address
- ;// <e> VPBDIV Setup
- ;// <i> Peripheral Bus Clock Rate
- ;// <o1.0..1> VPBDIV: VPB Clock
- ;// <0=> VPB Clock = CPU Clock / 4
- ;// <1=> VPB Clock = CPU Clock
- ;// <2=> VPB Clock = CPU Clock / 2
- ;// <o1.4..5> XCLKDIV: XCLK Pin
- ;// <0=> XCLK Pin = CPU Clock / 4
- ;// <1=> XCLK Pin = CPU Clock
- ;// <2=> XCLK Pin = CPU Clock / 2
- ;// </e>
- VPBDIV_SETUP EQU 0
- VPBDIV_Val EQU 0x00000000
- ; Phase Locked Loop (PLL) definitions
- PLL_BASE EQU 0xE01FC080 ; PLL Base Address
- PLLCON_OFS EQU 0x00 ; PLL Control Offset
- PLLCFG_OFS EQU 0x04 ; PLL Configuration Offset
- PLLSTAT_OFS EQU 0x08 ; PLL Status Offset
- PLLFEED_OFS EQU 0x0C ; PLL Feed Offset
- PLLCON_PLLE EQU (1<<0) ; PLL Enable
- PLLCON_PLLC EQU (1<<1) ; PLL Connect
- PLLCFG_MSEL EQU (0x1F<<0) ; PLL Multiplier
- PLLCFG_PSEL EQU (0x03<<5) ; PLL Divider
- PLLSTAT_PLOCK EQU (1<<10) ; PLL Lock Status
- ;// <e> PLL Setup
- ;// <o1.0..4> MSEL: PLL Multiplier Selection
- ;// <1-32><#-1>
- ;// <i> M Value
- ;// <o1.5..6> PSEL: PLL Divider Selection
- ;// <0=> 1 <1=> 2 <2=> 4 <3=> 8
- ;// <i> P Value
- ;// </e>
- PLL_SETUP EQU 1
- PLLCFG_Val EQU 0x00000024
- ; Memory Accelerator Module (MAM) definitions
- MAM_BASE EQU 0xE01FC000 ; MAM Base Address
- MAMCR_OFS EQU 0x00 ; MAM Control Offset
- MAMTIM_OFS EQU 0x04 ; MAM Timing Offset
- ;// <e> MAM Setup
- ;// <o1.0..1> MAM Control
- ;// <0=> Disabled
- ;// <1=> Partially Enabled
- ;// <2=> Fully Enabled
- ;// <i> Mode
- ;// <o2.0..2> MAM Timing
- ;// <0=> Reserved <1=> 1 <2=> 2 <3=> 3
- ;// <4=> 4 <5=> 5 <6=> 6 <7=> 7
- ;// <i> Fetch Cycles
- ;// </e>
- MAM_SETUP EQU 1
- MAMCR_Val EQU 0x00000002
- MAMTIM_Val EQU 0x00000004
- ; External Memory Controller (EMC) definitions
- EMC_BASE EQU 0xFFE00000 ; EMC Base Address
- BCFG0_OFS EQU 0x00 ; BCFG0 Offset
- BCFG1_OFS EQU 0x04 ; BCFG1 Offset
- BCFG2_OFS EQU 0x08 ; BCFG2 Offset
- BCFG3_OFS EQU 0x0C ; BCFG3 Offset
- ;// <e> External Memory Controller (EMC)
- EMC_SETUP EQU 0
- ;// <e> Bank Configuration 0 (BCFG0)
- ;// <o1.0..3> IDCY: Idle Cycles <0-15>
- ;// <o1.5..9> WST1: Wait States 1 <0-31>
- ;// <o1.11..15> WST2: Wait States 2 <0-31>
- ;// <o1.10> RBLE: Read Byte Lane Enable
- ;// <o1.26> WP: Write Protect
- ;// <o1.27> BM: Burst ROM
- ;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
- ;// <2=> 32-bit <3=> Reserved
- ;// </e>
- BCFG0_SETUP EQU 0
- BCFG0_Val EQU 0x0000FBEF
- ;// <e> Bank Configuration 1 (BCFG1)
- ;// <o1.0..3> IDCY: Idle Cycles <0-15>
- ;// <o1.5..9> WST1: Wait States 1 <0-31>
- ;// <o1.11..15> WST2: Wait States 2 <0-31>
- ;// <o1.10> RBLE: Read Byte Lane Enable
- ;// <o1.26> WP: Write Protect
- ;// <o1.27> BM: Burst ROM
- ;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
- ;// <2=> 32-bit <3=> Reserved
- ;// </e>
- BCFG1_SETUP EQU 0
- BCFG1_Val EQU 0x0000FBEF
- ;// <e> Bank Configuration 2 (BCFG2)
- ;// <o1.0..3> IDCY: Idle Cycles <0-15>
- ;// <o1.5..9> WST1: Wait States 1 <0-31>
- ;// <o1.11..15> WST2: Wait States 2 <0-31>
- ;// <o1.10> RBLE: Read Byte Lane Enable
- ;// <o1.26> WP: Write Protect
- ;// <o1.27> BM: Burst ROM
- ;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
- ;// <2=> 32-bit <3=> Reserved
- ;// </e>
- BCFG2_SETUP EQU 0
- BCFG2_Val EQU 0x0000FBEF
- ;// <e> Bank Configuration 3 (BCFG3)
- ;// <o1.0..3> IDCY: Idle Cycles <0-15>
- ;// <o1.5..9> WST1: Wait States 1 <0-31>
- ;// <o1.11..15> WST2: Wait States 2 <0-31>
- ;// <o1.10> RBLE: Read Byte Lane Enable
- ;// <o1.26> WP: Write Protect
- ;// <o1.27> BM: Burst ROM
- ;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
- ;// <2=> 32-bit <3=> Reserved
- ;// </e>
- BCFG3_SETUP EQU 0
- BCFG3_Val EQU 0x0000FBEF
- ;// </e> End of EMC
- ; External Memory Pins definitions
- PINSEL2 EQU 0xE002C014 ; PINSEL2 Address
- PINSEL2_Val EQU 0x0E6149E4 ; CS0..3, OE, WE, BLS0..3,
- ; D0..31, A2..23, JTAG Pins
- PRESERVE8
-
- ; Area Definition and Entry Point
- ; Startup Code must be linked first at Address at which it expects to run.
- AREA RESET, CODE, READONLY
- ARM
- ; Exception Vectors
- ; Mapped to Address 0.
- ; Absolute addressing mode must be used.
- ; Dummy Handlers are implemented as infinite loops which can be modified.
-
- Vectors
- LDR PC, ResetAddr
- LDR PC, UndefinedAddr
- LDR PC, SWI_Addr
- LDR PC, PrefetchAddr
- LDR PC, DataAbortAddr
- DCD 0xb9205f80
- LDR PC, [PC, #-0xff0]
- LDR PC, FIQ_Addr
- ResetAddr DCD Reset_Handler
- UndefinedAddr DCD Undefined
- SWI_Addr DCD SoftwareInterrupt
- PrefetchAddr DCD PrefetchAbort
- DataAbortAddr DCD DataAbort
- Nouse DCD 0
- IRQ_Addr DCD 0
- FIQ_Addr DCD FIQ_Handler
- ;未定义指令
- Undefined
- B Undefined
-
- ;取指令中止
- PrefetchAbort
- B PrefetchAbort
- ;取数据中止
- DataAbort
- B DataAbort
- ;快速中断
- FIQ_Handler
- B FIQ_Handler
- ; Reset Handler
- EXPORT Reset_Handler
- Reset_Handler
- ; Setup VPBDIV
- IF VPBDIV_SETUP <> 0
- LDR R0, =VPBDIV
- LDR R1, =VPBDIV_Val
- STR R1, [R0]
- ENDIF
- ; Setup PLL
- IF PLL_SETUP <> 0
- LDR R0, =PLL_BASE
- MOV R1, #0xAA
- MOV R2, #0x55
- ; Configure and Enable PLL
- MOV R3, #PLLCFG_Val
- STR R3, [R0, #PLLCFG_OFS]
- MOV R3, #PLLCON_PLLE
- STR R3, [R0, #PLLCON_OFS]
- STR R1, [R0, #PLLFEED_OFS]
- STR R2, [R0, #PLLFEED_OFS]
- ; Wait until PLL Locked
- PLL_Loop LDR R3, [R0, #PLLSTAT_OFS]
- ANDS R3, R3, #PLLSTAT_PLOCK
- BEQ PLL_Loop
- ; Switch to PLL Clock
- MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)
- STR R3, [R0, #PLLCON_OFS]
- STR R1, [R0, #PLLFEED_OFS]
- STR R2, [R0, #PLLFEED_OFS]
- ENDIF ; PLL_SETUP
- ; Setup MAM
- IF MAM_SETUP <> 0
- LDR R0, =MAM_BASE
- MOV R1, #MAMTIM_Val
- STR R1, [R0, #MAMTIM_OFS]
- MOV R1, #MAMCR_Val
- STR R1, [R0, #MAMCR_OFS]
- ENDIF ; MAM_SETUP
- ; Memory Mapping (when Interrupt Vectors are in RAM)
- MEMMAP EQU 0xE01FC040 ; Memory Mapping Control
- IF :DEF:REMAP
- LDR R0, =MEMMAP
- IF :DEF:EXTMEM_MODE
- MOV R1, #3
- ELIF :DEF:RAM_MODE
- MOV R1, #2
- ELSE
- MOV R1, #1
- ENDIF
- STR R1, [R0]
- ENDIF
- ; Initialise Interrupt System
- ; ...
- ; Setup Stack for each mode
- LDR R0, =Stack_Top
- ; Enter Undefined Instruction Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #UND_Stack_Size
- ; Enter Abort Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #ABT_Stack_Size
- ; Enter FIQ Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #FIQ_Stack_Size
- ; Enter IRQ Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #IRQ_Stack_Size
- ; Enter Supervisor Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #SVC_Stack_Size
- ; Enter User Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_USR
- MOV SP, R0
- SUB SL, SP, #USR_Stack_Size
- ; Enter the C code
- IMPORT __main
- LDR R0, =__main
- BX R0
- ; User Initial Stack & Heap
- AREA |.text|, CODE, READONLY
- IMPORT __use_two_region_memory
- EXPORT __user_initial_stackheap
- __user_initial_stackheap
- LDR R0, = Heap_Mem
- LDR R1, =(Stack_Mem + USR_Stack_Size)
- LDR R2, = (Heap_Mem + Heap_Size)
- LDR R3, = Stack_Mem
- BX LR
- END