📄 startup.s
字号:
;******************************************************************************
;
; STARTUP CODE
; LPC2138
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : Startup.s
;******************************************************************************
PRESERVE8
AREA INIT, CODE, READONLY ; Name this block of code ;
ARM
;******************************************************************************
; IMPORTS
;******************************************************************************
IMPORT __main
IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit|| ; Import stack limit from scatter-loading file ;
;******************************************************************************
; EXPORTS
;******************************************************************************
;******************************************************************************
; DEFINITIONS
;******************************************************************************
MODE_BITS EQU 0x1F ; Bit mask for mode bits in CPSR
USR_MODE EQU 0x10 ; User mode
FIQ_MODE EQU 0x11 ; Fast Interrupt Request mode
IRQ_MODE EQU 0x12 ; Interrupt Request mode
SVC_MODE EQU 0x13 ; Supervisor mode
ABT_MODE EQU 0x17 ; Abort mode
UND_MODE EQU 0x1B ; Undefined Instruction mode
SYS_MODE EQU 0x1F ; System mode
I_BIT EQU 0x80
F_BIT EQU 0x40
; Define stack sizes ;
IRQ_STK_SIZE EQU 0x00000200
FIQ_STK_SIZE EQU 0x00000100
SVC_STK_SIZE EQU 0x00000200
ABT_STK_SIZE EQU 0x00000200
UND_STK_SIZE EQU 0x00000200
SYS_STK_SIZE EQU 0x00000200
;******************************************************************************
; PERFORM ROM/RAM REMAPPING
;******************************************************************************
ENTRY
Vectors
LDR PC, Reset_Addr
LDR PC, Undef_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
Reset_Addr DCD ResetHndlr
Undef_Addr DCD OS_CPU_ARM_ExceptUndefInstrHndlr
SWI_Addr DCD OS_CPU_ARM_ExceptSwiHndlr
Prefetch_Addr DCD OS_CPU_ARM_ExceptPrefetchAbortHndlr
Abort_Addr DCD OS_CPU_ARM_ExceptDataAbortHndlr
NOP
IRQ_Addr DCD OS_CPU_ARM_ExceptIrqHndlr
FIQ_Addr DCD OS_CPU_ARM_ExceptFiqHndlr
OS_CPU_ARM_ExceptUndefInstrHndlr B OS_CPU_ARM_ExceptUndefInstrHndlr
OS_CPU_ARM_ExceptSwiHndlr B OS_CPU_ARM_ExceptSwiHndlr
OS_CPU_ARM_ExceptPrefetchAbortHndlr B OS_CPU_ARM_ExceptPrefetchAbortHndlr
OS_CPU_ARM_ExceptDataAbortHndlr B OS_CPU_ARM_ExceptDataAbortHndlr
OS_CPU_ARM_ExceptIrqHndlr B OS_CPU_ARM_ExceptIrqHndlr
OS_CPU_ARM_ExceptFiqHndlr B OS_CPU_ARM_ExceptFiqHndlr
;******************************************************************************
; SETUP STACK POINTERS
;******************************************************************************
ResetHndlr
LDR r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||
MRS r0,cpsr ; Original PSR value ;
BIC r0,r0,#MODE_BITS ; Clear the mode bits ;
ORR r0,r0,#IRQ_MODE ; Set IRQ mode bits ;
MSR cpsr_c,r0 ; Change the mode ;
MOV sp, r1
SUB r1, r1, #IRQ_STK_SIZE
MRS r0,cpsr ; Original PSR value ;
BIC r0,r0,#MODE_BITS ; Clear the mode bits ;
ORR r0,r0,#ABT_MODE ; Set IRQ mode bits ;
MSR cpsr_c,r0 ; Change the mode ;
MOV sp, r1
SUB r1, r1, #ABT_STK_SIZE
MRS r0,cpsr ; Original PSR value ;
BIC r0,r0,#MODE_BITS ; Clear the mode bits ;
ORR r0,r0,#UND_MODE ; Set IRQ mode bits ;
MSR cpsr_c,r0 ; Change the mode ;
MOV sp, r1
SUB r1, r1, #UND_STK_SIZE
MRS r0,cpsr ; Original PSR value ;
BIC r0,r0,#MODE_BITS ; Clear the mode bits ;
ORR r0,r0,#FIQ_MODE ; Set IRQ mode bits ;
MSR cpsr_c,r0 ; Change the mode ;
MOV sp, r1
SUB r1, r1, #FIQ_STK_SIZE
MRS r0,cpsr ; Original PSR value ;
BIC r0,r0,#MODE_BITS ; Clear the mode bits ;
ORR r0,r0,#SVC_MODE ; Set IRQ mode bits ;
MSR cpsr_c,r0 ; Change the mode ;
MOV sp, r1
MSR cpsr_c, #SVC_MODE:OR:F_BIT ; Enable interrupts, if required ;
;******************************************************************************
; MOVE TO MAIN
;******************************************************************************
LDR r0, =__main
bx r0 ; Save this in register for possible long jump ;
LTORG
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -