菜鸟偶现在在看LPC214x的启动代码,有几个疑问,还望指点一下。。 LPC2000系列的启动代码如下: ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
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 F_Bit EQU 0x40
UND_Stack_Size EQU 0x00000000 SVC_Stack_Size EQU 0x00000008 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
Heap_Size EQU 0x00000000
AREA HEAP, NOINIT, READWRITE, ALIGN=3 Heap_Mem SPACE Heap_Size
; VPBDIV definitions VPBDIV EQU 0xE01FC100 ; VPBDIV Address
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
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
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
BCFG0_SETUP EQU 0 BCFG0_Val EQU 0x0000FBEF
BCFG1_SETUP EQU 0 BCFG1_Val EQU 0x0000FBEF
BCFG2_SETUP EQU 0 BCFG2_Val EQU 0x0000FBEF
BCFG3_SETUP EQU 0 BCFG3_Val EQU 0x0000FBEF
; 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, Reset_Addr LDR PC, Undef_Addr LDR PC, SWI_Addr LDR PC, PAbt_Addr LDR PC, DAbt_Addr NOP ; Reserved Vector ; LDR PC, IRQ_Addr LDR PC, [PC, #-0x0FF0] ; Vector from VicVectAddr,为什么PC要减去0x0FF0?? LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler DCD 0 ; Reserved Address IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler SWI_Handler B SWI_Handler PAbt_Handler B PAbt_Handler DAbt_Handler B DAbt_Handler IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler
; Reset Handler
EXPORT Reset_Handler Reset_Handler
; Setup External Memory Pins IF :DEF:EXTERNAL_MODE ;这条语句是什么意思??DEF是什么意思,冒号代表什么意思,EXTERNAL_MODE又是什么意思?? LDR R0, =PINSEL2 LDR R1, =PINSEL2_Val STR R1, [R0] ENDIF
; Setup External Memory Controller IF EMC_SETUP <> 0 LDR R0, =EMC_BASE
IF BCFG0_SETUP <> 0 LDR R1, =BCFG0_Val STR R1, [R0, #BCFG0_OFS] ENDIF
IF BCFG1_SETUP <> 0 LDR R1, =BCFG1_Val STR R1, [R0, #BCFG1_OFS] ENDIF
IF BCFG2_SETUP <> 0 LDR R1, =BCFG2_Val STR R1, [R0, #BCFG2_OFS] ENDIF
IF BCFG3_SETUP <> 0 LDR R1, =BCFG3_Val STR R1, [R0, #BCFG3_OFS] ENDIF
ENDIF ; EMC_SETUP
; 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
|