|
麻烦大家帮我看一下我的代码,我现在需要用PA23,PA24分别检测两路脉冲输入计数,用的 IO中断,另外再用一个1S的RTT定时器计数,现在是我该如何判定是哪个管脚发生的中断,程序该如何修改。我用的是AT91SAM7S128,麻烦指点一下啊 。
#define pulse1_key (1<<23)
#define pulse2_key (1<<24)
void isr_pio(void) __irq
{
uint sr=0;
sr=AT91C_BASE_PIOA->PIO_ISR;
// printfint(sr);
// if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & pulse1_key ) == 0)
// if(sr&pulse1_key == 0x00000 ) //檢測pulse1_key是否髮生狀態改變。
pulse_counter1=pulse_counter1+1;
// if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & pulse2_key ) == pulse2_key) //檢測pulse1_key是否髮生狀態改變。
// pulse_counter2=pulse_counter2+1;
Trace_Toggel_LED( AT91B_LED3) ;
//避免编译时产生警
// sr =sr;
//* 等待释放
// while ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & pulse1_key ) != pulse1_key);
AT91C_BASE_AIC->AIC_EOICR = 0; // End of Interrupt Command Register
}
void init_PIO(void)
{
AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_PIOA); //首先禁止相应PIO中断
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE |AT91C_AIC_PRIOR_1;//设置PIO中断优先级,大于串口中断小于rtt中断 ,外部中断源负边缘变化
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int) *isr_pio;
AT91C_BASE_PIOA->PIO_IDR= 0xffffffff; //禁止所有IO口中断
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_PIOA); //清除中断标志
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_PIOA); //激活相应PIO中断
// AT91C_BASE_PIOA->PIO_IER = pulse1_key|pulse2_key; //激活PIO相应管脚中断
AT91C_BASE_PIOA->PIO_IER = pulse1_key;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|