📄 init.s
字号:
;******************************************************************************
;
; STARTUP CODE
; LPC2378
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : init.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
;******************************************************************************
EXPORT ResetHndlr
;******************************************************************************
; 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 0x00000300
FIQ_STK_SIZE EQU 0x00000200
SVC_STK_SIZE EQU 0x00000300
ABT_STK_SIZE EQU 0x00000200
UND_STK_SIZE EQU 0x00000200
SYS_STK_SIZE EQU 0x00000300
MEMMAP EQU 0xE01FC040
; Define stack pointers ;
;******************************************************************************
; PERFORM ROM/RAM REMAPPING
;******************************************************************************
ENTRY
ResetHndlr
; If interrupt vectors in RAM, then perform remap ;
IF :DEF: REMAP
LDR R0, =MEMMAP
MOV R1, #2
STR R1, [R0]
ENDIF
;******************************************************************************
; SETUP STACK POINTERS
;******************************************************************************
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 ABT 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 UND 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 FIQ 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 SVC 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 + -