#include "timer.h"
// Timer for multiple task
static Timer timers[MAX_TIMERS];
/* PERIODIC TIMER HANDLER */
void PIT0_IRQHandler(void) {
PRINTF("Periodic timer Interrupt");
for (uint8_t i = 0; i < MAX_TIMERS; i++) {
if (timers[i].active && (timers[i].ticks > 0U)) {
timers[i].ticks--;
if (timers[i].ticks == 0U) {
if (timers[i].callback != NULL) {
timers[i].callback();
}
timers[i].ticks = timers[i].period; /* 리셋 */
}
}
}
PIT_ClearStatusFlags(PIT, kPIT_Chnl_0, kPIT_TimerFlag);
}
void Timers_Init(void) {
PRINTF("Init PIT\r\n");
/* Get PIT Default Config and Initialize PIT */
pit_config_t pitCfg ={0};
PIT_GetDefaultConfig(&pitCfg);
PIT_Init(PIT, &pitCfg);
PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, GET_MSEC_COUNT(1000));
PRINTF("%d\r\n",GET_MSEC_COUNT(1000));
PIT_EnableInterrupts(PIT, kPIT_Chnl_0, kPIT_TimerInterruptEnable);
NVIC_EnableIRQ(PIT0_IRQn);
for ( uint8_t i = 0; i < MAX_TIMERS; i++) {
timers[i].active = false;
timers[i].ticks = 0U;
timers[i].period = 0U;
timers[i].callback = NULL;
}
}
TimerError Timer_Set(uint8_t timer_id, uint32_t period, void (*callback)(void)) {
PRINTF("tIMERsET\r\n");
if (timer_id >= MAX_TIMERS) {
return TIMER_ERROR_INVALID_ID;
}
if (callback == NULL) {
return TIMER_ERROR_NULL_POINTER;
}
timers[timer_id].period = period;
timers[timer_id].ticks = period;
timers[timer_id].callback = callback;
timers[timer_id].active = false; /* 초기 상태는 비활성화 */
return TIMER_SUCCESS;
}
TimerError Timer_Start(uint8_t timer_id) {
PRINTF("tIMERsTART\r\n");
if (timer_id >= MAX_TIMERS) {
return TIMER_ERROR_INVALID_ID;
}
timers[timer_id].active = true;
timers[timer_id].ticks = timers[timer_id].period;
PRINTF("TimerStart\r\n");
return TIMER_SUCCESS;
}
TimerError Timer_Stop(uint8_t timer_id) {
if (timer_id >= MAX_TIMERS) {
return TIMER_ERROR_INVALID_ID;
}
timers[timer_id].active = false;
return TIMER_SUCCESS;
}