Конфигурация прерываний происходит следующим образом:
Код
void RT()
{
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_PIOA, 0x06, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, irq_RT);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW2_MASK);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW3_MASK); //Маска прерываний на PA23, PA24
//* set the interrupt by software
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOA);
while(1); //Ожидание прерывания
}
Обработчик прерываний:
Код
__ramfunc void irq_RT()
{
//Определение источника прерывания и запрет прерываний
int i_status = AT91F_PIO_GetInterruptStatus(AT91C_BASE_PIOA);
if(i_status&0x800000) AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA,SW3_MASK); //Прерывание пришло от PA23
if(i_status&0x1000000) AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA,SW2_MASK); //Прерывание пришло от PA24
AT91F_AIC_DisableIt(AT91C_BASE_AIC, AT91C_ID_PIOA);
...
//программа обработки прерывания
...
//Разрешение прерываний
if(i_status&0x800000) AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW3_MASK);
if(i_status&0x1000000) AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW2_MASK);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOA);
Первое прерывание нормально обрабатывается, но второе прерывание не обрабатывается, хотя источником является тот же вывод (PA24). Чтобы обработать следующее прерывание, приходится презагружать устройство и заново вызывать прерывание. То есть больше одного прерывания подряд не обрабатывает. Почемутак происходит, я ведь правильно конфигурирую прерывания?
Заранее благодарен!