#define TCK 1000 /* Timer Clock */ #define PIV ((MCK/TCK/16)-1) /* Periodic Interval Value */ void NACKEDFUNC ATTR systime_isr(void) { /* System Interrupt Handler */ volatile AT91S_PITC * pPIT; AT91PS_PIO pPIOA = AT91C_BASE_PIOA; ISR_ENTRY(); pPIT = AT91C_BASE_PITC; if (pPIT->PITC_PISR & AT91C_PITC_PITS) { /* Check PIT Interrupt */ systime_value++; /* Increment Time Tick */ if ((systime_value % 500) == 0) { /* 500ms Elapsed ? */ *AT91C_PIOA_ODSR ^= LED2; /* Toggle LED2 */ } *AT91C_AIC_EOICR = pPIT->PITC_PIVR; /* Ack & End of Interrupt */ } else { *AT91C_AIC_EOICR = 0; /* End of Interrupt */ } ISR_EXIT(); } void systime_init(void) { /* Setup PIT with Interrupt */ volatile AT91S_AIC * pAIC = AT91C_BASE_AIC; //*AT91C_PIOA_OWER = LED2; // LED2 ODSR Write Enable *AT91C_PITC_PIMR = AT91C_PITC_PITIEN | /* PIT Interrupt Enable */ AT91C_PITC_PITEN | /* PIT Enable */ PIV; /* Periodic Interval Value */ /* Setup System Interrupt Mode and Vector with Priority 7 and Enable it */ pAIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7; pAIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) systime_isr; pAIC->AIC_IECR = (1 << AT91C_ID_SYS); }