当前位置: 代码迷 >> 汇编语言 >> 自己写的一段汇编中断程序代码,求解!解决方案
  详细解决方案

自己写的一段汇编中断程序代码,求解!解决方案

热度:8882   发布时间:2013-02-26 00:00:00.0
自己写的一段汇编中断程序代码,求解!
;按一下按键K1-K4(EINT1,EINT2,EINT0,EINT3),用中断的方式点亮对应的灯LED1-LED4(GPG5,GPG6,GPG7,GPG10)
;9key_interrupt

rGPFCON EQU 0x56000050

rGPGCON EQU 0x56000060
rGPGDAT EQU 0x56000064
rGPGUP EQU 0x56000068

LED1_ON EQU (~(1<<5))
LED2_ON EQU (~(1<<6))
LED3_ON EQU (~(1<<7))
LED4_ON EQU (~(1<<10))

LED1_OFF EQU (1<<5)
LED2_OFF EQU (1<<6)
LED3_OFF EQU (1<<7)
LED4_OFF EQU (1<<10)

;=================
; INTERRUPT
;=================
SRCPND EQU 0x4a000000 ;Interrupt request status
INTMOD EQU 0x4a000004 ;Interrupt mode control
INTMSK EQU 0x4a000008 ;Interrupt mask control
PRIORITY EQU 0x4a00000c ;IRQ priority control <-- May 06, 2002 SOP
INTPND EQU 0x4a000010 ;Interrupt request status
INTOFFSET EQU 0x4a000014 ;Interruot request source offset
SUSSRCPND EQU 0x4a000018 ;Sub source pending
INTSUBMSK EQU 0x4a00001c ;Interrupt sub mask

  AREA FLYRIZ,CODE,READONLY
  ENTRY
  CODE32
START
  B RESET
  b . ;转跳到Undefined mode程序入口
  b . ;转跳到SWI 中断程序入口
  b . ;转跳到PAbort(指令异常)程序入口
  b . ;转跳到DAbort(数据异常)程序入口
  b . ;保留
  b HandlerIRQ ;转跳到IRQ 中断程序入口
  b . ;转跳到FIQ 中断程序入口 
   
RESET
  LDR R0,=INTMSK
  LDR R1,=0xFFFFFFF0 ;屏蔽除EINT0...3以外的所有中断
  str R1,[R0]

  LDR R0,=INTSUBMSK
  LDR R1,=0x7FFF ;屏蔽所有的子中断
  STR R1,[R0]
   
  ;初始化GPF0...3为中断模式
  LDR R0,=rGPFCON
  LDR R1,[R0]
  LDR R2,=0xFFFFFF00
  AND R1,R1,R2
  ORR R1,R1,#0xAA
  STR R1,[R0]
   
  BL LED_INIT

LOOP
  NOP
  B LOOP
   


   
HandlerIRQ  
  SUB LR,LR,#4
  STMFD SP!,{LR}
  LDR R1,=INTPND
  LDR R0,[R1]
  TST R0,#1
  BEQ EINT1
  ;点亮第3个灯
  LDR R1,=rGPGDAT
  LDR R2,[R1]
  AND R2,R2,#LED3_ON
  STR R2,[R1]
EINT1
  TST R0,#2
  BEQ EINT2
  ;点亮第1个灯
  LDR R1,=rGPGDAT
  LDR R2,[R1]
  AND R2,R2,#LED1_ON
  STR R2,[R1]
EINT2
  TST R0,#4
  BEQ EINT3
  ;点亮第2个灯
  LDR R1,=rGPGDAT
  LDR R2,[R1]
  AND R2,R2,#LED2_ON
  STR R2,[R1]
EINT3
  TST R0,#8
  BEQ EINT_END
  ;点亮第4个灯
  LDR R1,=rGPGDAT
  LDR R2,[R1]
  AND R2,R2,#LED4_ON
  STR R2,[R1]
EINT_END
  LDR R0,=SRCPND
  MOV R1,#0xF
  STR R1,[R0]
  LDR R0,=INTPND
  MOV R1,#0xF
  STR R1,[R0]
  ;四个LED全熄灭
  LDR R1,=rGPGDAT
  LDR R0,[R1]
  ORR R0,R0,#LED1_OFF|LED2_OFF|LED3_OFF|LED4_OFF
  STR R0,[R1]
  SUBS PC,LR,#4
   
   
  ;初始化LED IO口
LED_INIT
  ;IO口方向设置为输出
  LDR R1,=rGPGCON
  LDR R0,[R1]
  ;LDR R2,=0x30FC00 ;0000 0000 0011 0000 1111 1100 0000 0000 B
  ;MVN R2,R2 ;1111 1111 1100 1111 0000 0011 1111 1111 B ,R2=0xFFCF03FF 
  相关解决方案