У меня почти такая же проблема: второй раз не обрабатывает прерывание и докучи перезаписывает один из существующих массивов (программа не зависает, если это важно).
Камень AT91RM9200
Инициализация (сделана отдельной функцией):
Код
void IntInit(void)
{AT91F_PIO_CfgInput(AT91C_BASE_PIOA, DataInput);
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, DataInput, 0);
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_IRQ2, 7, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, PIOA_Handler);
// prio
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ2);
}
Обработчик:
Код
extern int p[33];
static void PIOA_Handler( void )
{ AT91C_BASE_AIC->AIC_IVR;
AT91C_BASE_PIOB->PIO_SODR |= ( DDS_P2_MODULATION ); /* PB7 - выв 87 AT91RM9200 */
AT91C_BASE_PIOB->PIO_CODR |= ( DDS_P2_MODULATION ); /* PB7 are output */
AT91C_BASE_AIC->AIC_ICCR |= ( 1UL<<AT91C_ID_IRQ2 );//clear interrupt
AT91C_BASE_AIC->AIC_EOICR = 0;
}
Строки, касающиеся прерывания из main():
Код
...
IntInit();
AT91C_BASE_PIOB->PIO_SODR |= ( DDS_P2_MODULATION ); /* PB7 - выв 87 AT91RM9200 */
__enable_interrupt();
delay(5000);
AT91C_BASE_PIOB->PIO_CODR |= ( DDS_P2_MODULATION ); /* PB7 are output */
...
Сообщение отредактировал Antokha - Apr 22 2009, 15:16