打印

求助AT91SAM9261 中断的问题

[复制链接]
2603|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maxiang200|  楼主 | 2011-2-11 19:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
maxiang200|  楼主 | 2011-2-11 19:48 | 只看该作者
我的程序如下:

void IRQ1_ISR(void)
{

           key1 = 1;
                  AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_IRQ1;        // Clear interrupt
          AT91C_BASE_AIC->AIC_EOICR  = 1 << AT91C_ID_IRQ1;     //end interrupt
}

主函数:
中断配置:
AT91C_BASE_PMC->PMC_PCER = 0x40000000;           //使能IRQ1控制时钟
AT91C_BASE_PIOB->PIO_BSR  |= 0x40000000;          //PB30 设定为外设A(IRQ1)
AIC_DisableIT(AT91C_ID_IRQ1);    //禁止IRQ1中断
/*配置IRQ1中断,下降沿触发,中断服务子程序为IRQ1_ISR*/
AIC_ConfigureIT(AT91C_ID_IRQ1,
AT91C_AIC_PRIOR_LOWEST|AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE),IRQ1_ISR); //
AIC_EnableIT(AT91C_ID_IRQ1); //使能IRQ1中断

另外我的启动文件里面程序为:
        AREA    VECTOR, CODE
        ARM

; Exception Vectors

Vectors         
                                LDR     pc,=resetHandler


undefVector  
                            b           undefVector             ; Undefined instruction
swiVector
                        b       swiVector               ; Software interrupt
prefetchAbortVector
                        b       prefetchAbortVector     ; Prefetch abort
dataAbortVector
                       b       dataAbortVector         ; Data abort
reservedVector
                        b       reservedVector          ; Reserved for future use
irqVector
                b       irqHandler              ; Interrupt
fiqVector
                                                ; Fast interrupt
;       
;------------------------------------------------------------------------------
; Handles a fast interrupt request by branching to the address defined in the
; AIC.
;------------------------------------------------------------------------------
fiqHandler
        b       fiqHandler
       
;------------------------------------------------------------------------------
; Handles incoming interrupt requests by branching to the corresponding
; handler, as defined in the AIC. Supports interrupt nesting.
;------------------------------------------------------------------------------
irqHandler
        ;  Save interrupt context on the stack to allow nesting */
        SUB     lr, lr, #4
        STMFD   sp!, {lr}
        MRS     lr, SPSR
        STMFD   sp!, {r0,r1,lr}

        ; Write in the IVR to support Protect Mode */
        LDR     lr, =AT91C_BASE_AIC
        LDR     r0, [r14, #AIC_IVR]
        STR     lr, [r14, #AIC_IVR]

        ; Branch to interrupt handler in Supervisor mode */
        MSR     CPSR_c, #ARM_MODE_SVC
        STMFD   sp!, {r1-r4, r12, lr}
        MOV     lr, pc
        BX      r0
        LDMIA   sp!, {r1-r4, r12, lr}
        MSR     CPSR_c, #ARM_MODE_IRQ | I_BIT

        ; Acknowledge interrupt */
        LDR     lr, =AT91C_BASE_AIC
        STR     lr, [r14, #AIC_EOICR]

        ; Restore interrupt context and branch back to calling code
        LDMIA   sp!, {r0,r1,lr}
        MSR     SPSR_cxsf, lr
        LDMIA   sp!, {pc}^

;------------------------------------------------------------------------------
; After a reset, execution starts here, the mode is ARM, supervisor
; with interrupts disabled.
; Initializes the chip and branches to the main() function.
;------------------------------------------------------------------------------
               
                   AREA  cstartup, CODE
                   ENTRY        ; Entry point for the application
                  
                  
; Reset Handler

        EXPORT  resetHandler
        IMPORT        |Image$$Fixed_region$$Limit|
        IMPORT  |Image$$Relocate_region$$Base|
        IMPORT  |Image$$Relocate_region$$ZI$$Base|
        IMPORT  |Image$$Relocate_region$$ZI$$Limit|
        IMPORT  |Image$$ARM_LIB_STACK$$Base|
        IMPORT  |Image$$ARM_LIB_STACK$$ZI$$Limit|
        
                ; Perform low-level initialization of the chip using LowLevelInit()
                IMPORT  LowLevelInit
               
resetHandler   
        
        ; Set pc to actual code location (i.e. not in remap zone)
g            LDR     pc, =label
label            
                ; Set up temporary stack (Top of the SRAM)
                LDR     r0, = |Image$$ARM_LIB_STACK$$ZI$$Limit|
        MOV     sp, r0
                ; Call Low level init
            LDR     r0, =LowLevelInit
        MOV     lr, pc
        BX      r0


;Initialize the Relocate_region segment
                LDR         r0, = |Image$$Fixed_region$$Limit|
                LDR         r1, = |Image$$Relocate_region$$Base|
                LDR         r3, = |Image$$Relocate_region$$ZI$$Base|
            
            CMP     r0, r1                 
             BEQ     %1
            
            
        ; Copy init data
0       CMP     r1, r3         
        LDRCC   r2, [r0], #4   
        STRCC   r2, [r1], #4
        BCC     %0

1       LDR     r1, =|Image$$Relocate_region$$ZI$$Limit|
        MOV     r2, #0
2       CMP     r3, r1                  
        STRCC   r2, [r3], #4
        BCC     %2
      
               
; Setup Stack for each mode

        LDR     R0, = |Image$$ARM_LIB_STACK$$ZI$$Limit|


;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #ARM_MODE_UND:OR:I_BIT:OR:F_BIT
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #ARM_MODE_ABT:OR:I_BIT:OR:F_BIT
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #ARM_MODE_FIQ:OR:I_BIT:OR:F_BIT
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #ARM_MODE_IRQ:OR:I_BIT:OR:F_BIT
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #ARM_MODE_SVC|F_BIT
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
;        MSR     CPSR_c, #ARM_MODE_IRQ:OR:I_BIT:OR:F_BIT
;        MOV     SP, R0
;        SUB     R4, SP, #IRQ_Stack_Size

; Supervisor mode (interrupts enabled)
;        MSR     CPSR_c, #ARM_MODE_SVC | F_BIT
;        MOV     SP, R4      

                LDR     R0, =MATRIX_BASE
        MOV     R1, #3          ; Remap for Instruction and Data Master
        STR     R1, [R0, #MATRIX_MCFG_OFS]    ; Execute Remap
; Enter the C code

        IMPORT  __main
        LDR     R0, =__main
        BX      R0
loop4
        B       loop4               

        END

使用特权

评论回复
板凳
maxiang200|  楼主 | 2011-2-11 19:49 | 只看该作者
急啊,请告诉帮助一下,怎么只能进去一两次中断就进不去了呢

使用特权

评论回复
地板
yaxcore| | 2011-2-12 08:36 | 只看该作者
软件问题:
中断处理程序,一般的做法是,
进入中断后,先关闭中断,处理完中断后,出中断处理程序时,再开中断。

硬件问题:因为你这个是键盘,所以,需要做防抖动处理,否则,如果软件处理不好,就会进入中断嵌套。
出现死机。

使用特权

评论回复
5
maxiang200|  楼主 | 2011-3-19 22:16 | 只看该作者
首先多谢楼上的提供的解决 办法,我又遇到一个问题就是我的定时器中断只能就去两三次中断,然后就跳转到了 异常向量表,就死机了。我我尝试过很多方法,结果是我在主函数中加了几条无用的指令就能正常运行了,加的位置为
main(void)
{
   while(1)
  {
      n++;
      if(n==10)
     {
          n=0;          
     }
        //以上为无用语句          
   }
}
如果我将无用语句去掉中断就会异常,请问是什么原因呢

使用特权

评论回复
6
盈安信科技| | 2011-3-20 10:30 | 只看该作者
你做的工作,就是等待吧?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

1

粉丝