ARM9 S3C2440按键中断方式点亮LED的汇编程序

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
 
 


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值