/** * * This function is the handler which handles the periodic tick interrupt. * It updates its count, and set a flag to signal PWM timer counter to * update its duty cycle. * * This handler provides an example of how to handle data for the TTC and * is application specific. * * @param CallBackRef contains a callback reference from the driver, in * this case it is the instance pointer for the TTC driver. * * @return None. * * @note None. * *****************************************************************************/ static void TickHandler(void *CallBackRef) { u32 StatusEvent; /* * Read the interrupt status, then write it back to clear the interrupt. */ StatusEvent = XTtcPs_GetInterruptStatus((XTtcPs *)CallBackRef); XTtcPs_ClearInterruptStatus((XTtcPs *)CallBackRef, StatusEvent); if (0 != (XTTCPS_IXR_INTERVAL_MASK & StatusEvent)) { TickCount++; if (TICKS_PER_CHANGE_PERIOD == TickCount) { TickCount = 0; PWM_UpdateFlag = TRUE; } } else { /* * The Interval event should be the only one enabled. If it is * not it is an error */ ErrorCount++; } }
/** * * This function is the handler which handles the PWM interrupt. * * It updates the match register to reflect the change on duty cycle. It also * disable interrupt at the end. The interrupt will be enabled by the Ticker * timer counter. * * @param CallBackRef contains a callback reference from the driver, in * this case it is a pointer to the MatchValue variable. * * @return None. * * @note None. * *****************************************************************************/ static void PWMHandler(void *CallBackRef) { u32 *MatchReg; u32 StatusEvent; XTtcPs *Timer; MatchReg = (u32 *) CallBackRef; Timer = &(TtcPsInst[TTC_PWM_DEVICE_ID]); /* * Read the interrupt status, then write it back to clear the interrupt. */ StatusEvent = XTtcPs_GetInterruptStatus(Timer); XTtcPs_ClearInterruptStatus(Timer, StatusEvent); if (0 != (XTTCPS_IXR_INTERVAL_MASK & StatusEvent)) { XTtcPs_SetMatchValue(Timer, 0, *MatchReg); } else { /* * If it is not Interval event, it is an error. */ ErrorCount++; } XTtcPs_DisableInterrupts(Timer, XTTCPS_IXR_ALL_MASK); }
void vClearTickInterrupt( void ) { volatile uint32_t ulStatus; ulStatus = XTtcPs_GetInterruptStatus( &xTimerInstance ); ( void ) ulStatus; }
void platform_clear_interrupt( XTtcPs * TimerInstance ) { u32 StatusEvent; StatusEvent = XTtcPs_GetInterruptStatus(TimerInstance); XTtcPs_ClearInterruptStatus(TimerInstance, StatusEvent); }
void vClearTickInterrupt( void ) { volatile uint32_t ulInterruptStatus; /* Read the interrupt status, then write it back to clear the interrupt. */ ulInterruptStatus = XTtcPs_GetInterruptStatus( &xRTOSTickTimerInstance ); XTtcPs_ClearInterruptStatus( &xRTOSTickTimerInstance, ulInterruptStatus ); __asm volatile( "DSB SY" ); __asm volatile( "ISB SY" ); }
static void TickHandler(void *CallBackRef) { u32 StatusEvent; /* * Read the interrupt status, then write it back to clear the interrupt. */ StatusEvent = XTtcPs_GetInterruptStatus((XTtcPs *)CallBackRef); XTtcPs_ClearInterruptStatus((XTtcPs *)CallBackRef, StatusEvent); CountTimerTTC++; }
static void prvTimerHandler( void *pvCallBackRef ) { uint32_t ulInterruptStatus; XTtcPs *pxTimer = ( XTtcPs * ) pvCallBackRef; BaseType_t xYieldRequired; /* Read the interrupt status, then write it back to clear the interrupt. */ ulInterruptStatus = XTtcPs_GetInterruptStatus( pxTimer ); XTtcPs_ClearInterruptStatus( pxTimer, ulInterruptStatus ); /* Only one interrupt event type is expected. */ configASSERT( ( XTTCPS_IXR_INTERVAL_MASK & ulInterruptStatus ) != 0 ); /* Check the device ID to know which IntQueue demo to call. */ if( pxTimer->Config.DeviceId == xDeviceIDs[ 0 ] ) { xYieldRequired = xFirstTimerHandler(); } else if( pxTimer->Config.DeviceId == xDeviceIDs[ 1 ] ) { xYieldRequired = xSecondTimerHandler(); } else { /* The high frequency timer is also used to generate the time base for the run time state. */ ulHighFrequencyTimerCounts++; /* Latch the highest interrupt nesting count detected. */ if( ulPortInterruptNesting > ulMaxRecordedNesting ) { ulMaxRecordedNesting = ulPortInterruptNesting; } xYieldRequired = pdFALSE; } /* If xYieldRequired is not pdFALSE then calling either xFirstTimerHandler() or xSecondTimerHandler() resulted in a task leaving the blocked state and the task that left the blocked state had a priority higher than the currently running task (the task this interrupt interrupted) - so a context switch should be performed so the interrupt returns directly to the higher priority task. xYieldRequired is tested inside the following macro. */ portYIELD_FROM_ISR( xYieldRequired ); }