📄 2440vectors.s
字号:
;=========================================
; NAME: 2440vectors.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
; HISTORY:
; 2007.07.12: Freddy.Ding : ver 0.0
;=========================================
GET ..\2440_CODE\option.inc
GET ..\2440_CODE\memcfg.inc
GET ..\2440_CODE\2440addr.inc
IMPORT OSIntEnter
IMPORT OSIntExit
IMPORT ResetHandler ; In init.s
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
AREA Vect,CODE,READONLY
ENTRY
; *****************
; Exception Vectors
; *****************
; Note: LDR PC instructions are used here, though branch (B) instructions
; could also be used, unless the ROM is at an address >32MB.
VectorsAddr
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
EXPORT VectorsAddr
Reset_Addr DCD ResetHandler
Undefined_Addr DCD HandlerUndef
SWI_Addr DCD HandlerSWI
Prefetch_Addr DCD HandlerPabort
Abort_Addr DCD HandlerDabort
IRQ_Addr DCD HandlerIRQ
FIQ_Addr DCD HandlerFIQ
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
IRQMODE EQU 0x12
SVCMODE EQU 0x13
NOINT EQU 0xc0
IMPORT C_IRQHandler
EXPORT IRQ_ISR
EXPORT HandleIRQ
IRQ_ISR
;STMFD sp!, {r0-r12,lr} ; irq will change these reg so,push them first
STMFD SP!, {R1-R3} ; PUSH WORKING REGISTERS ONTO IRQ STACK
MOV R1, SP ; Save IRQ stack pointer
SUB R2, LR,#4 ; Adjust PC for return address to task
MRS R3, SPSR ; Copy SPSR (i.e. interrupted tasks CPSR) to R3
ADD SP, SP, #12
;-------------------
;从IRQ切换到SVC模式
;-------------------
MSR CPSR_c, #(NOINT | SVCMODE) ; Change to SVC mode
; SAVE TASKS CONTEXT ONTO TASKS STACK
STMFD SP!, {R2} ; Push tasks Return PC
STMFD SP!, {LR} ; Push tasks LR
STMFD SP!, {R4-R12} ; Push tasks R12-R4
LDMFD R1!, {R4-R6} ; Move tasks R1-R3 from IRQ stack to SVC stack
STMFD SP!, {R4-R6}
STMFD SP!, {R0} ; Push tasks R0 onto tasks stack
STMFD SP!, {R3} ; Push tas CPSR (i.e. IRQs SPSR);
BL OSIntEnter
; ----------------identify source of interrupt----------BEGIN---------------
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r0,=HandleEINT0
add r0,r0,r9,lsl #2
ldr r0,[r0]
; ----------------identify source of interrupt-----------END----------------
BL C_IRQHandler
BL OSIntExit
LDMFD sp!, {r4} ; get cpsr_svc from stack
MSR spsr_cxsf, r4 ; prepare spsr_cxsf to return svc mode
LDMFD sp!, {r0-r12, lr,pc}^ ; recover r0-r12 and pc from stack, cpsr also
ALIGN
AREA RamData, DATA, READWRITE
^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;Dont use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
;@0x33FF_FF20
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleCAM # 4 ; Added for 2440.
HandleBATFLT # 4
HandleTICK # 4
HandleWDT # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
;@0x33FF_FF60
HandleLCD # 4
HandleDMA0 # 4
HandleDMA1 # 4
HandleDMA2 # 4
HandleDMA3 # 4
HandleMMC # 4
HandleSPI0 # 4
HandleUART1 # 4
HandleNFCON # 4 ; Added for 2440.
HandleUSBD # 4
HandleUSBH # 4
HandleIIC # 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
;@0x33FF_FFA0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -