?? 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 + -