rtthread 移植system_tick相关代码
extern __IO uint32_t uwTick;
static uint32_t _systick_ms = 1;
void rt_hw_systick_init(void)
{
HAL_SYSTICK_Config(SystemCoreClock / RT_TICK_PER_SECOND);
NVIC_SetPriority(SysTick_IRQn, 0xFF);
_systick_ms = 1000u / RT_TICK_PER_SECOND;
if(_systick_ms == 0)
_systick_ms = 1;
}
uint32_t HAL_GetTick(void)
{
if(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
HAL_IncTick();
return uwTick;
}
void HAL_IncTick(void)
{
uwTick += _systick_ms;
}
void HAL_Delay(__IO uint32_t Delay)
{
if (rt_thread_self())
{
rt_thread_mdelay(Delay);
}
else
{
for (rt_uint32_t count = 0; count < Delay; count++)
{
rt_hw_us_delay(1000);
}
}
}
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
rt_hw_systick_init();
return HAL_OK;
}
void rt_hw_us_delay(rt_uint32_t us)
{
rt_uint64_t ticks;
rt_uint32_t told, tnow, tcnt = 0;
rt_uint32_t reload = SysTick->LOAD;
ticks = us * (reload / (1000000 / RT_TICK_PER_SECOND));
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}