67 lines
1.0 KiB
C++
67 lines
1.0 KiB
C++
|
|
#include "gd32f4xx.h"
|
||
|
|
#include "systick.h"
|
||
|
|
|
||
|
|
SysTickTimer &SysTickTimer::instance()
|
||
|
|
{
|
||
|
|
static SysTickTimer timer;
|
||
|
|
return timer;
|
||
|
|
}
|
||
|
|
|
||
|
|
RetCode SysTickTimer::config()
|
||
|
|
{
|
||
|
|
uint32_t clock_freq = SystemCoreClock;
|
||
|
|
|
||
|
|
SysTick->CTRL = 0;
|
||
|
|
|
||
|
|
if (clock_freq / 1000U > 0xFFFFFFU)
|
||
|
|
{
|
||
|
|
SysTick->LOAD = 0xFFFFFFU;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
SysTick->LOAD = (clock_freq / 1000U) - 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
SysTick->VAL = 0;
|
||
|
|
|
||
|
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||
|
|
SysTick_CTRL_TICKINT_Msk |
|
||
|
|
SysTick_CTRL_ENABLE_Msk;
|
||
|
|
|
||
|
|
NVIC_SetPriority(SysTick_IRQn, 0x80U);
|
||
|
|
|
||
|
|
return RET_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
void SysTickTimer::delay_ms(uint32_t count)
|
||
|
|
{
|
||
|
|
delay_ = count;
|
||
|
|
|
||
|
|
while (0U != delay_)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void SysTickTimer::decrement()
|
||
|
|
{
|
||
|
|
if (0U != delay_)
|
||
|
|
{
|
||
|
|
delay_--;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void systick_config(void)
|
||
|
|
{
|
||
|
|
SysTickTimer::instance().config();
|
||
|
|
}
|
||
|
|
|
||
|
|
void delay_1ms(uint32_t count)
|
||
|
|
{
|
||
|
|
SysTickTimer::instance().delay_ms(count);
|
||
|
|
}
|
||
|
|
|
||
|
|
void delay_decrement(void)
|
||
|
|
{
|
||
|
|
SysTickTimer::instance().decrement();
|
||
|
|
}
|