⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eint1_led.s

📁 周立功单片机ARM学习板easyARM2104的测试程序等
💻 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 + -