📄 eint1_led.s
字号:
;******************************************************************************
; File:EINT1_LED.S
; 功能:使用外部中断1进行LED4的控制,每当有一次中断时,即取反LED4,
; 以便指示中断输入。
; 说明:将跳线器JP8_LED4短接。
; 由于外部中断是电平方式的,所以在退出中断前要等待中断信号撤消;
; 为了方便调试,使用了REMAP功能。
;******************************************************************************
INCLUDE LPC2106.INC ; 引入头文件
LEDCON EQU 0x000002000 ; P0.13引脚控制LED4,低电平点亮
AREA EINT1C,CODE,READONLY
ENTRY
MAIN LDR R0,=PINSEL0 ; 设置I/O口工作模式,P0.14设置为EINT1
MOV R1,#0x20000000
STR R1,[R0],#4
MOV R1,#0x00000000
STR R1,[R0] ; PINSEL0=0x20000000
LDR R0,=IODIR
MOV R1,#LEDCON
STR R1,[R0] ; PINSEL0=0x00000000
MSR CPSR_c,#0xD3 ; 设置各种模式下的堆栈,
LDR SP,=0x40003000
MSR CPSR_c,#0xD2
LDR SP,=0x40003100
MSR CPSR_c,#0xD1
LDR SP,=0x40003200
MSR CPSR_c,#0x10
LDR SP,=0x40003300
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
REMAPS MOV R0,#0x40000000 ; 复制中断向量代码,设置目标地址
LDR R1,=Vectors ; 设置源地址
LDMIA R1!,{R2-R9} ; 共复制16个字
STMIA R0!,{R2-R9}
LDMIA R1!,{R2-R9}
STMIA R0!,{R2-R9}
LDR R0,=MEMMAP ; REMAP操作
MOV R1,#0x02
STR R1,[R0]
; 打开EINT1中断(不设置向量控制器,即使用非向量IRQ)
LDR R0,=VIC_BASE_ADDR
MOV R1,#0x00008000
STR R1,[R0,#0x10] ; VICIntEnable = 0x00008000
LDR R1,[R0] ; 读出VICIRQStatus的值
LDR R0,=EXTINT ; 清除外部中断标志
MOV R1,#0x07
STR R1,[R0]
HALT NOP ; 等待中断
B HALT
; 定义中断向量表,用于REMAP
AREA Startup,CODE,READONLY
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
; 中断服务程序
Reset
Undefined
SoftwareInterrupt
PrefetchAbort
DataAbort
B .
;******************************************************************************
; IRQ中断处理(即EINT1中断)
; 将LED4控制取反,并等待外部中断信号恢复为高电平
;******************************************************************************
IRQ_Handler
LDR R0,=VICIRQStatus
LDR R1,[R0] ; 读出VICIRQStatus的值
LDR R0,=IOSET ; 读取当前LED4控制值
LDR R1,[R0]
ANDS R1,R1,#LEDCON
LDREQ R0,=IOSET
LDRNE R0,=IOCLR
MOV R1,#LEDCON
STR R1,[R0] ; 控制LED4输出
LDR R0,=EXTINT
WAITUP MOV R1,#0x02
STR R1,[R0] ; 清除EINT1中断标志
LDR R1,[R0]
ANDS R1,R1,#0x02
BNE WAITUP ; 等待外部中断信号恢复为高电平
SUBS PC,R14,#4 ; 中断返回
; FIQ中断服务程序
FIQ_Handler
B .
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -