主题 : 自己写的一段汇编中断程序代码,求解! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 58130
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
综合积分: 34 分
注册时间: 2011-11-03
最后登录: 2012-07-25
楼主  发表于: 2011-11-07 11:58

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

;按一下按键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






        
级别: 新手上路
UID: 58130
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
综合积分: 34 分
注册时间: 2011-11-03
最后登录: 2012-07-25
1楼  发表于: 2011-11-07 12:03
原本我只是想简单的写一个小程序加深一下印象,不搞什么向量表那些复杂的东西。我的理解是IRQ中断来的时候程序就自动跳到
b    HandlerIRQ 这个地方执行,然后就通过指令跳转到了中断服务程序了,为什么这样不行呢?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2011-11-07 14:58
你确定你在程序里调用了InitStacks? 从你贴出来的代码看它没有被调用到。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 58130
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
综合积分: 34 分
注册时间: 2011-11-03
最后登录: 2012-07-25
3楼  发表于: 2011-11-08 09:30
没有调用InitStacks,只是后面加上去的。
级别: 新手上路
UID: 58130
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
综合积分: 34 分
注册时间: 2011-11-03
最后登录: 2012-07-25
4楼  发表于: 2011-11-10 15:22
自己顶一下!