Вот простой пример рабочего прерывания.
Код
#include <AT91SAM7S256.H> /* AT91SAMT7S64 definitions */
#include <lib_AT91SAM7S256.h>
/*
* Main Program
*/
int i;
__irq void isrSYS(void)
{
unsigned int status = AT91C_BASE_SYS->PITC_PIVR;
if (i)
{
AT91C_BASE_PIOA->PIO_SODR = 1;
i = 0;
}
else
{
AT91C_BASE_PIOA->PIO_CODR = 1;
i = 1;
}
AT91C_BASE_AIC->AIC_EOICR = status;
}
int main (void) {
// Enable the Clock of the PIO
AT91C_BASE_PIOA->PIO_PER = (1 << AT91C_PIO_PA0);
AT91C_BASE_PIOA->PIO_OER = 0x00000001;
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA);
AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN|AT91C_PITC_PITIEN|0x0ffff7;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)isrSYS;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = 6;
AT91C_BASE_AIC->AIC_IECR = (1UL << AT91C_ID_SYS);
// Loop forever
for (;;)
{
}
}