#include "api_timer.h" #include "api_rt_timer.h" #include "api_rt_dbg.h" #include "board_config.h" #include "gd32f30x.h" #include "classB.h" ApiRtTimer_Handle Timers[GENERAL_TIMER_COUNT + 1]; /* ========================================================================== */ /* ============================== API RT Functions ============================= */ /* ========================================================================== */ void iRtTimer_Init() { Timers[HW_TBC_HALF_UPDATE_TIMER].TimerBase = TIMER6; Timers[HW_TBC_HALF_UPDATE_TIMER].TickISR.Enable = 0; Timers[HW_TBS_TIMER].TimerBase = TIMER3; Timers[HW_TBS_TIMER].TickISR.Enable = 0; Timers[HW_EVENT1MS_TIMER].TimerBase = TIMER5; Timers[HW_EVENT1MS_TIMER].TickISR.Enable = 0; Timers[HW_SYSTICK_TIMER].TimerBase = 0; Timers[HW_SYSTICK_TIMER].TickISR.Enable = 0; } void iRtTimer_Isr(uint8_t devIndex) { if (Timers[devIndex].TickISR.Action != 0) { Timers[devIndex].TickISR.Action(); } if (devIndex < GENERAL_TIMER_COUNT) { uint32_t base = Timers[devIndex].TimerBase; TIMER_INTF(base)&= ~0x0001; } } /* ========================================================================== */ /* ============================== API Functions ============================= */ /* ========================================================================== */ uint32_t iTimer_GetClock(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { return HW_TIM_CLOCK_HZ; } else { return HW_TIM_CLOCK_HZ; } } void iTimer_Start(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_CTL0(base) |= (uint32_t)BIT(0); } else { SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; } } void iTimer_Stop(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_CTL0(base) &= ~(uint32_t)BIT(0); } else { SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } } void iTimer_EnableAutoReload(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_CTL0(base) |= (uint32_t)BIT(7); } } void iTimer_DisableAutoReload(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_CTL0(base) &= ~(uint32_t)BIT(7); } } uint32_t iTimer_GetPeriod(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; uint32_t count_value = 0U; count_value = TIMER_CAR(base); return count_value; } else { return SysTick->LOAD; } } void iTimer_SetPeriod(uint8_t devIndex, uint32_t ticks) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_CAR(base) = ticks; } else { SysTick->LOAD = ticks; } } uint32_t iTimer_GetCount(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; uint32_t count_value = 0U; count_value = TIMER_CNT(base); return count_value; } else { return SysTick->VAL; } } void iTimer_Reset(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_CNT(base) = 0; } else { SysTick->VAL = SysTick->LOAD; } } void iTimer_BindInterrupt(uint8_t devIndex, void (*action)()) { Timers[devIndex].TickISR.Action = action; } void iTimer_EnableInterrupt(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_DMAINTEN(base)|= (uint16_t)0x01; } else { } } void iTimer_DisableInterrupt(uint8_t devIndex) { if (devIndex < SYSTEM_TICK_TIMER_INDEX) { uint32_t base = Timers[devIndex].TimerBase; TIMER_DMAINTEN(base) &= ~((uint16_t)0x01); } else { } }