|
我用9260裸机调中断,思路是这样的:
我想启用周期时钟(PIT)中断和串口(DBGU)中断。
其中PIT中断准备提供给uC/OS使用,DBUG采用DMA方式收发。
由于PIT和DBGU使用相同的中断源(source 1),所以他们的中断在同一个函数中响应。在这个函数中再去判断是PIT产生的中断,还是DBGU产生的中断,然后再分开处理。
可是问题在于,单独启用一个中断的时候,中断正常响应,两个同时启用的时候,中断就不响应了。
不仅如此,DBGU同时开启两个中断(DMA发送完成中断和DMA接收缓冲区满中断)也出现类似的显现,即只开启一个中断时正常响应,两个同时开始时中断不响应。
不才以为,是中断设置或者处理不当造成的。
以下市关键部分代码,请高手指定。
中断配置:
AIC_ConfigureIT(AT91C_ID_SYS,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE|priority, //此处设置为电平触发,则不停得产生中断。
handler); //若设置为边缘触发,则中断不响应。
//使能中断
AIC_EnableIT(AT91C_ID_SYS);
//同时启用DMA发送完成、接收缓冲区满中断。
AT91C_BASE_DBGU->DBGU_IER = AT91C_US_ENDRX | AT91C_US_ENDTX;
中断处理:
uint32 status;
AT91F_AIC_ClearIt(AT91C_BASE_AIC,1);//清除中断标志
status = AT91F_DBGU_GetInterruptMaskStatus(AT91C_BASE_DBGU); //读取中断状态
if(status & AT91C_US_ENDTX)//处理对应的中断
{
//End of Tx Handler
DBGU_ENDTX_Handler();
status &= ~AT91C_US_ENDTX;
}
if(status & AT91C_US_ENDRX)
{
//End of Rx Handler
DBGU_ENDRX_Handler();
status &= ~AT91C_US_ENDRX;
}
中断向量的汇编程序(其中有读IVR和写EOICR):
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}^ |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|