首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-03-09 
自己写的一段汇编中断程序代码,求解!按一下按键K1-K4(EINT1,EINT2,EINT0,EINT3),用中断的方式点亮对应的

自己写的一段汇编中断程序代码,求解!
;按一下按键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 


  LDR R2,=~( (3<<10)|(3<<12)|(3<<14)|(3<<20) )
  AND R0,R0,R2
  ;LDR R2,=0x105400 ;0000 0000 0001 0000 0101 0100 0000 0000 B
  LDR R2,=(1<<10)|(1<<12)|(1<<14)|(1<<20)
  ORR R0,R0,R2
  STR R0,[R1]
   
  ;四个LED全熄灭
  LDR R1,=rGPGDAT
  LDR R0,[R1]
  ;ORR R0,R0,#0x04E0 ;0000 0100 1110 0000
  ORR R0,R0,#LED1_OFF|LED2_OFF|LED3_OFF|LED4_OFF
  STR R0,[R1]
  MOV PC,LR
   
;function: initializing stacks
InitStacks
  mrs r0,cpsr
  bic r0,r0,#0x1f ;MODEMASK=0x1f
  orr r1,r0,#0x12 ;IRQMODE=0x12
  msr cpsr_cxsf,r1 ;IRQMode
  ldr sp,=0x33FF7000 ; IRQStack=0x33FF7000
  mov pc,lr
   
  END

原本我只是想简单的写一个小程序加深一下印象,不搞什么向量表那些复杂的东西。我的理解是IRQ中断来的时候程序就自动跳到b HandlerIRQ 这个地方执行,然后就通过指令跳转到了中断服务程序了,为什么这样不行呢?

[解决办法]
这个我真的不是看不懂,是很难看懂

热点排行