GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058
GPGCON EQU 0x56000060
GPGDAT EQU 0x56000064
GPGUP EQU 0x56000068
SRCPND EQU 0X4A000000
INTMSK EQU 0X4A000008
INTPND EQU 0X4A000010
EINTMASK EQU 0X560000A4
INTOFFSET EQU 0X4A000014
EINTPEND EQU 0X560000A8
WTCON EQU 0X53000000
AREA SelfBoot, CODE, READONLY
ENTRY
EXPORT _ENTRY
_ENTRY
ResetEntry
B RESET //中断向量,只有resert和handleirq有用
HANDLEUNDEF
B HANDLEUNDEF
HANDLESWI
B HANDLESWI
HANDLEPABORT
B HANDLEPABORT
HANDLEDABORT
B HANDLEDABORT
HANDLERESERVE
B HANDLERESERVE
B HANDLEIRQ
HANDLEFIQ
B HANDLEFIQ
RESET
LDR SP,=4096 @设置栈指针
LDR R0,=WTCON @关闭watchdog,否则会不断重启
LDR R1,=0X0
STR R1,[R0]
MSR CPSR_c,#0XD2 @进入中断模式
LDR SP,=3072 @设置中断模式栈指针
MSR CPSR_c,#0XDF @进入系统模式
BL INIT_LED @初始化LED
BL INIT_IRQ @调用中断初始化函数
MSR CPSR_c,#0X5F @设置I—bit = 0,开IRQ中断
LDR LR,=HALT_LOOP @设置返回地址
LDR PC,=MAIN @调用main函数,在main函数里可以添加别的功能,此处是熄灭led
HALT_LOOP
B HALT_LOOP
HANDLEIRQ
SUB LR,LR,#4 @计算返回地址
STMDB SP!,{R0-R12,LR} @保存使用到的寄存器,此时的sp是中断模式的sp
LDR LR,=INT_RETURN @ISR返回的地址
LDR PC,=EINT_HANDLE @调用中断服务函数
INT_RETURN
LDMIA SP!,{R0-R12,PC}^ @中断返回,^表示将spsr的值复制到cpsr
INIT_LED
LDR R0,=GPFCON
LDR R1,=0X55AA
STR R1,[R0]
LDR R0,=GPFUP
LDR R1,=0xFF
STR R1,[R0]
MOV PC,LR
INIT_IRQ
LDR R1,=GPFCON
LDR R2,=0X55AA
STR R2,[R1]
LDR R1,=GPGCON
LDR R2,=0X800080
STR R2,[R1]
LDR R1,=EINTMASK
LDR R2,=0X7F7FF
STR R2,[R1]
LDR R1,=INTMSK
LDR R2,=0XFFD0
STR R2,[R1]
MOV PC,LR
EINT_HANDLE
LOOP
LDR R0,=GPFDAT
LDR R1,=0XFF
STR R1,[R0]
LDR R0,=INTOFFSET
LDR R1,[R0]
LDR R2,=EINTPEND
LDR R4,[R2]
MOV R5,R4
MOV R4,R4,ROR#11
MOV R5,R5,ROR#19
SWITCH
LDR R0,=GPFDAT
CASE_0
CMP R1,#1
BNE CASE_2
LDR R1,=0XDF
STR R1,[R0]
B SWITCH_END
CASE_2
CMP R1,#3
BNE CASE_4
LDR R1,=0XBF
STR R1,[R0]
B SWITCH_END
CASE_4
CMP R1,#2
BNE CASE_8
LDR R1,=0XCF
STR R1,[R0]
B SWITCH_END
CASE_8
CMP R1,#0
BNE CASE_3
LDR R1,=0XEF
STR R1,[R0]
B SWITCH_END
CASE_3
CMP R4,#1
BNE CASE_11
LDR R3,=0XAF
STR R3,[R0]
B SWITCH_END
CASE_11
CMP R5,#1
BNE DEFAULT
LDR R6,=0X9F
STR R6,[R0]
B SWITCH_END
DEFAULT
LDR R5,=0XFF
STR R5,[R0]
SWITCH_END
NOP
LDR R4,=SRCPND //清中断
LDR R5,=0X2F
STR R5,[R4]
LDR R4,=INTPND
LDR R5,=0X2F
STR R5,[R4]
LDR R4,=EINTPEND
LDR R5,=0XFFFFF
STR R5,[R4]
MOV PC,LR
MAIN
LDR R0,=GPFDAT
LDR R1,=0XFF
STR R1,[R0]
B MAIN
END
中断服务子程序与用查询方式点灯的程序基本相同,只是判断那个按键按下的方式不同,最后不要忘记清中断,且清中断时往对应寄存器写1 ,寄存器则清为0