自己写的一段汇编中断程序代码,求解!
;按一下按键K1-K4(EINT1,EINT2,EINT0,EINT3),用中断的方式点亮对应的灯LED1-LED4(GPG5,GPG6,GPG7,GPG10)
;9key_interrupt
rGPFCON EQU 0x56000050
rGPGCON EQU 0x56000060
rGPGDAT EQU 0x56000064
rGPGUP EQU 0x56000068
LED1_ON EQU (~(1<<5))
LED2_ON EQU (~(1<<6))
LED3_ON EQU (~(1<<7))
LED4_ON EQU (~(1<<10))
LED1_OFF EQU (1<<5)
LED2_OFF EQU (1<<6)
LED3_OFF EQU (1<<7)
LED4_OFF EQU (1<<10)
;=================
; INTERRUPT
;=================
SRCPND EQU 0x4a000000 ;Interrupt request status
INTMOD EQU 0x4a000004 ;Interrupt mode control
INTMSK EQU 0x4a000008 ;Interrupt mask control
PRIORITY EQU 0x4a00000c ;IRQ priority control <-- May 06, 2002 SOP
INTPND EQU 0x4a000010 ;Interrupt request status
INTOFFSET EQU 0x4a000014 ;Interruot request source offset
SUSSRCPND EQU 0x4a000018 ;Sub source pending
INTSUBMSK EQU 0x4a00001c ;Interrupt sub mask
AREA FLYRIZ,CODE,READONLY
ENTRY
CODE32
START
B RESET
b . ;转跳到Undefined mode程序入口
b . ;转跳到SWI 中断程序入口
b . ;转跳到PAbort(指令异常)程序入口
b . ;转跳到DAbort(数据异常)程序入口
b . ;保留
b HandlerIRQ ;转跳到IRQ 中断程序入口
b . ;转跳到FIQ 中断程序入口
RESET
LDR R0,=INTMSK
LDR R1,=0xFFFFFFF0 ;屏蔽除EINT0...3以外的所有中断
str R1,[R0]
LDR R0,=INTSUBMSK
LDR R1,=0x7FFF ;屏蔽所有的子中断
STR R1,[R0]
;初始化GPF0...3为中断模式
LDR R0,=rGPFCON
LDR R1,[R0]
LDR R2,=0xFFFFFF00
AND R1,R1,R2
ORR R1,R1,#0xAA
STR R1,[R0]
BL LED_INIT
LOOP
NOP
B LOOP
HandlerIRQ
SUB LR,LR,#4
STMFD SP!,{LR}
LDR R1,=INTPND
LDR R0,[R1]
TST R0,#1
BEQ EINT1
;点亮第3个灯
LDR R1,=rGPGDAT
LDR R2,[R1]
AND R2,R2,#LED3_ON
STR R2,[R1]
EINT1
TST R0,#2
BEQ EINT2
;点亮第1个灯
LDR R1,=rGPGDAT
LDR R2,[R1]
AND R2,R2,#LED1_ON
STR R2,[R1]
EINT2
TST R0,#4
BEQ EINT3
;点亮第2个灯
LDR R1,=rGPGDAT
LDR R2,[R1]
AND R2,R2,#LED2_ON
STR R2,[R1]
EINT3
TST R0,#8
BEQ EINT_END
;点亮第4个灯
LDR R1,=rGPGDAT
LDR R2,[R1]
AND R2,R2,#LED4_ON
STR R2,[R1]
EINT_END
LDR R0,=SRCPND
MOV R1,#0xF
STR R1,[R0]
LDR R0,=INTPND
MOV R1,#0xF
STR R1,[R0]
;四个LED全熄灭
LDR R1,=rGPGDAT
LDR R0,[R1]
ORR R0,R0,#LED1_OFF|LED2_OFF|LED3_OFF|LED4_OFF
STR R0,[R1]
SUBS PC,LR,#4
;初始化LED IO口
LED_INIT
;IO口方向设置为输出
LDR R1,=rGPGCON
LDR R0,[R1]
;LDR R2,=0x30FC00 ;0000 0000 0011 0000 1111 1100 0000 0000 B
;MVN R2,R2 ;1111 1111 1100 1111 0000 0011 1111 1111 B ,R2=0xFFCF03FF
LDR R2,=~( (3<<10)|(3<<12)|(3<<14)|(3<<20) )
AND R0,R0,R2
;LDR R2,=0x105400 ;0000 0000 0001 0000 0101 0100 0000 0000 B
LDR R2,=(1<<10)|(1<<12)|(1<<14)|(1<<20)
ORR R0,R0,R2
STR R0,[R1]
;四个LED全熄灭
LDR R1,=rGPGDAT
LDR R0,[R1]
;ORR R0,R0,#0x04E0 ;0000 0100 1110 0000
ORR R0,R0,#LED1_OFF|LED2_OFF|LED3_OFF|LED4_OFF
STR R0,[R1]
MOV PC,LR
;function: initializing stacks
InitStacks
mrs r0,cpsr
bic r0,r0,#0x1f ;MODEMASK=0x1f
orr r1,r0,#0x12 ;IRQMODE=0x12
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=0x33FF7000 ; IRQStack=0x33FF7000
mov pc,lr
END
原本我只是想简单的写一个小程序加深一下印象,不搞什么向量表那些复杂的东西。我的理解是IRQ中断来的时候程序就自动跳到b HandlerIRQ 这个地方执行,然后就通过指令跳转到了中断服务程序了,为什么这样不行呢?
[解决办法]
这个我真的不是看不懂,是很难看懂