//------------------------------------------------------------------------------ /// Interrupt service routine for the PIT. Debounces the wake-up pin input. //------------------------------------------------------------------------------ static void ISR_Pit(void) { static unsigned long debounceCounter = DEBOUNCE_TIME; unsigned long pisr = 0; // Read the PISR pisr = PIT_GetStatus() & AT91C_PITC_PITS; if (pisr != 0) { // Read the PIVR. It acknowledges the IT PIT_GetPIVR(); } // Button released if (PIO_Get(&pinWakeUp)) { debounceCounter = DEBOUNCE_TIME; } // Button still pressed else { debounceCounter--; } // End of debounce time if (debounceCounter == 0) { debounceCounter = DEBOUNCE_TIME; PIT_DisableIT(); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITEN; COMPOSITEDDriver_RemoteWakeUp(); } }
void PitInit(unsigned int msperiod) { PIT_DisableIT(); // Initialize the PIT to the desired frequency PIT_Init(0, 0); // PIT timer runs at MCK/16 // calculates the PIT Value accurate to a Millisecond interrupt // msperiod can not be larget than 349 because PIV is at a 20bit limit if(msperiod > 349) msperiod = 349; PIT_SetPIV((MCK/(16*1000))*msperiod); // Configure interrupt on PIT AIC_DisableIT(AT91C_ID_SYS); AIC_ConfigureIT(AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); AIC_EnableIT(AT91C_ID_SYS); PIT_EnableIT(); // Enable the pit PIT_Enable(); }