📄 int.s
字号:
AREA INTERRUPT_UART, CODE, READONLY
CODE32
EXPORT DRIVER_AsmUARTInterruptHandler ; Assembler Interrupt Handler
IMPORT ISR_Driver ; C Interrupt function
;EXPORT DRIVER_AsmVBUSInterruptHandler
;IMPORT ISR_VBus
GIC_BASE EQU 0xFFFFF000 ; Address of controller
GIC_SMR EQU GIC_BASE ; Source Mode Register
GIC_SVR EQU GIC_SMR + 32*4 ; Source Vector Register
GIC_IVR EQU GIC_SVR + 32*4 ; IRQ Vector Register
GIC_FVR EQU GIC_IVR + 4 ; FIQ Vector Register
GIC_ISR EQU GIC_FVR + 4 ; Interrupt Status Register
GIC_IPR EQU GIC_ISR + 4 ; Interrupt Pending Register
GIC_IMR EQU GIC_IPR + 4 ; Interrupt Mask Register
GIC_CISR EQU GIC_IMR + 4 ; Core Interrupt Status Register
GIC_IECR EQU GIC_CISR + 3*4 ; Interrupt Enable Command Register
GIC_IDCR EQU GIC_IECR + 4 ; Interrupt Disable Command Register
GIC_ICCR EQU GIC_IDCR + 4 ; Interrupt Clear Command Register
GIC_ISCR EQU GIC_ICCR + 4 ; Interrupt Set Command Register
GIC_EOICR EQU GIC_ISCR + 4 ; End of Interrupt Command Register
GIC_SPU EQU GIC_EOICR + 4 ; Spurious Vector Register
ARM_MODE_USER EQU 0x10
ARM_MODE_FIQ EQU 0x11
ARM_MODE_IRQ EQU 0x12
ARM_MODE_SVC EQU 0x13
ARM_MODE_ABORT EQU 0x17
ARM_MODE_UNDEF EQU 0x1B
ARM_MODE_SYS EQU 0x1F
; Control bits
I_BIT EQU 0x80
F_BIT EQU 0x40
T_BIT EQU 0x20
;******************************************************************************
;* IRQ Entry
;******************************************************************************
MACRO
IRQ_ENTRY
; Adjust and save LR_irq in IRQ stack
sub r14, r14, #4
stmfd sp!, {r14}
; Save SPSR and r0 in IRQ stack
mrs r14, SPSR
stmfd sp!, {r0, r14}
; Enable Interrupt and Switch in SYS Mode
mrs r0, CPSR
bic r0, r0, #I_BIT
orr r0, r0, #ARM_MODE_SYS
msr CPSR_c, r0
; Save scratch/used registers and LR in User Stack
stmfd sp!, { r1-r3, r12, r14}
MEND
;******************************************************************************
;* IRQ Exit
;******************************************************************************
MACRO
IRQ_EXIT
; Restore scratch/used registers and LR from User Stack
ldmia sp!, { r1-r3, r12, r14}
; Disable Interrupt and switch back in IRQ mode
mrs r0, CPSR
bic r0, r0, #ARM_MODE_SYS
orr r0, r0, #I_BIT:OR:ARM_MODE_IRQ
msr CPSR_c, r0
; Mark the End of Interrupt on the GIC
ldr r0, =GIC_EOICR
str r0, [r0]
; Restore SPSR_irq and r0 from IRQ stack
ldmia sp!, {r0, r14}
msr SPSR_cxsf, r14
; Restore adjusted LR_irq from IRQ stack directly in the PC
ldmia sp!, {pc}^
MEND
;******************************************************************************
;* UPIO0 Handler
;******************************************************************************
DRIVER_AsmUARTInterruptHandler
IRQ_ENTRY
bl ISR_Driver
IRQ_EXIT
;******************************************************************************
;DRIVER_AsmVBUSInterruptHandler
; IRQ_ENTRY
; bl ISR_VBus
; IRQ_EXIT
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -