📄 int.s
字号:
;// 初始化IRQ模式下的堆栈
MRS r0,CPSR ;// Pickup current CPSR
BIC r0,r0,#MODE_MASK ;// Clear the mode bits
ORR r0,r0,#MODE_IRQ ;// Set the IRQ mode bits
MSR CPSR_cxsf,r0 ;// Move to IRQ mode
LDR SP,=IRQ_STACK ;// Setup IRQ stack pointer
;// 初始化SUP模式下的堆栈
MRS r0,CPSR ;// Pickup current CPSR
BIC r0,r0,#MODE_MASK ;// Clear the mode bits
ORR r0,r0,#MODE_SUP ;// Set the SUP mode bits
MSR CPSR_cxsf,r0 ;// Move to SUP mode
LDR SP,=SVC_STACK ;// Setup SUP stack pointer
;// 转回系统模式,并使能中断标志位
MRS r0,CPSR ;// Pickup current CPSR
BIC r0,r0,#MODE_MASK ;// Clear mode bits
ORR r0,r0,#MODE_SYS ;// Set the SYSTEM mode bits
BIC R0,R0,#INTLOCK ;// 开中断
MSR CPSR_cxsf,r0 ;// All interrupt stacks are setup,
;// return to supervisor mode
;/*
;***************************************************************************************************
; C语言的调用(跳至应用程序)
;***************************************************************************************************
;*/
IMPORT C_Entry
B C_Entry ;C_Entry是一个循环程序
;/*
;***************************************************************************************************
;* INT_IRQ
;*
;***************************************************************************************************
;*/
AREA IRQ,CODE,READONLY
EXPORT INT_IRQ
INT_IRQ
;/* This Code is used to correctly handle interrupts and
; is necessary due to the nature of the ARM7 architecture */
STMDB sp!, {r1} ;保存寄存器r1,将r1压栈
MRS r1, SPSR
TST r1, #I_BIT
LDMIA sp!, {r1}
SUBNES pc,lr,#4
;//LR_IRQ,SPSR_IRQ压栈来避免下一次中断发生使它们被冲掉
SUB lr, lr, #4
STMFD sp!, {lr}
MRS r14, SPSR
STMFD sp!, {r0-r4, r14}
;// 查寄存器INTOFFSET找出对应的中断
LDR R0,=INTOFFSET
LDR R0,[R0,#0]
CMP R0,#0X0
BNE IRQ_VECTOR_FOUND
;// No bits in pending register set, restore context and exit interrupt servicing
LDMIA SP!,{R0-R4,R14}
MSR SPSR_csxf,R14
LDMIA SP!,{PC}^
;//清中断控制源
IRQ_VECTOR_FOUND
CMP R0,#Handler_ADC
BNE SUB_UART_CLEAR
LDR R1,=ADCTSC ;//设置触摸屏为Y转换模式
LDR R2,=0X69
STR R2,[R1,#0]
LDR R1,=SUBSRCPND
LDR R2,=INT_SUB_TC
STR R2,[R1,#0]
B INT_SOUR_CLEAR
SUB_UART_CLEAR ;//清uart中断源
CMP R0,#Handler_UART0
BNE INT_SOUR_CLEAR
LDR R1,=SUBSRCPND ;//清touch panel中断源
LDR R2,=(INT_SUB_TXD0:OR:INT_SUB_RXD0)
STR R2,[R1,#0]
INT_SOUR_CLEAR
LDR R2,=INTPND
LDR R3,[R2,#0]
LDR R1,=SRCPND
STR R3,[R1,#0]
STR R3,[R2,#0]
;// Get IRQ vector table address
LDR r3,=INT_IRQ_Vectors ;// Get IRQ vector table address
MOV r2, r0, LSL #2 ;// Multiply vector by 4 to get offset into table
ADD r3, r3, r2 ;// Adjust vector table address to correct offset
LDR r2, [r3,#0] ;// Load branch address from vector table
MOV PC, r2 ;// Jump to correct branch location based on vector table
;/*
;***************************************************************************************************
;* INT_ADC_Shell
;*
;***************************************************************************************************
;*/
EXPORT INT_ADC_Shell
INT_ADC_Shell
MRS r1,CPSR ;// Pickup current CPSR
BIC r1,r1,#MODE_MASK ;// Clear the mode bits
ORR r1,r1,#MODE_SYS ;// Set the SYS mode bits
BIC r1,r1,#I_BIT ;//ENABLE INT
MSR CPSR_cxsf,r1 ;// Change to IRQ mode
MOV r4,lr ;// Put IRQ return address into r4
;// 跳至上下文保存处理程序
STMDB SP!,{LR}
;// 跳至中断服务程序
;// BL TPLCD_LISR ;// processing.
LDMIA SP!,{LR}
;// 返回到IRQ模式
MRS r1,CPSR ;// Pickup current CPSR
BIC r1,r1,#MODE_MASK ;// Clear the mode bits
ORR r1,r1,#MODE_IRQ ;// Set the IRQ mode bits
ORR R1,R1,#I_BIT ;//DISABLE INT
MSR CPSR_cxsf,r1 ;// Change to IRQ mode
;//此值是在进入IRQ时设置的
LDMIA SP!,{R0-R4,R14}
MSR SPSR_csxf,R14
LDMIA SP!,{PC}^
;/*
;***************************************************************************************************
;* INT_UART0_Shell
;*
;***************************************************************************************************
;*/
EXPORT INT_UART0_Shell
INT_UART0_Shell
MRS r1,CPSR ;// Pickup current CPSR
BIC r1,r1,#MODE_MASK ;// Clear the mode bits
ORR r1,r1,#MODE_SYS ;// Set the SYS mode bits
BIC r1,r1,#I_BIT ;//ENABLE INT
MSR CPSR_cxsf,r1 ;// Change to IRQ mode
;// MOV r4,lr ;// Put IRQ return address into r4
;// 跳至上下文保存处理程序
STMDB SP!,{LR}
;// 跳至中断服务程序
;// LDR R0,=Handler_UART0
;// BL SDC_LISR ;// processing.
LDMIA SP!,{LR}
;// 返回到IRQ模式
MRS r1,CPSR ;// Pickup current CPSR
BIC r1,r1,#MODE_MASK ;// Clear the mode bits
ORR r1,r1,#MODE_IRQ ;// Set the IRQ mode bits
ORR R1,R1,#I_BIT ;//DISABLE INT
MSR CPSR_cxsf,r1 ;// Change to IRQ mode
;//此值是在进入IRQ时设置的
LDMIA SP!,{R0-R4,R14}
MSR SPSR_csxf,R14
LDMIA SP!,{PC}^
;/*
;***************************************************************************************************
;* INT_USBD_Shell
;*
;***************************************************************************************************
;*/
EXPORT INT_USBD_Shell
INT_USBD_Shell
MRS r1,CPSR ;// Pickup current CPSR
BIC r1,r1,#MODE_MASK ;// Clear the mode bits
ORR r1,r1,#MODE_SYS ;// Set the SYS mode bits
ORR r1,r1,#I_BIT ;//DISABLE INT
MSR CPSR_cxsf,r1 ;// Change to IRQ mode
;// MOV r4,lr ;// Put IRQ return address into r4
;// 跳至上下文保存处理程序
STMDB SP!,{LR}
;// 跳至中断服务程序
;// LDR R0,=Handler_UART0
;// BL SDC_LISR ;// processing.
BL IsrUsbd
LDMIA SP!,{LR}
;// 返回到IRQ模式
MRS r1,CPSR ;// Pickup current CPSR
BIC r1,r1,#MODE_MASK ;// Clear the mode bits
ORR r1,r1,#MODE_IRQ ;// Set the IRQ mode bits
BIC R1,R1,#I_BIT ;//ENABLE INT
MSR CPSR_cxsf,r1 ;// Change to IRQ mode
;//此值是在进入IRQ时设置的
LDMIA SP!,{R0-R4,R14}
MSR SPSR_csxf,R14
LDMIA SP!,{PC}^
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -