使用系统定时器进行us级延时,代码解析
代码中,先获取了系统定时器中的装载值,系统定时器的装载值可以通过初始化设置函数进行查看。
获取到装载值后通过计算,得到最终的要延时的时间长度,该时间通过ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);计算得到。然后由told和tnow计算出两次读取时间之间的时钟数,最终进行判断,实现的us延时。
/**
* The time delay function.
*
* @param microseconds.
*/
static void stm32_udelay(rt_uint32_t us)
{
rt_uint32_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;
}
}
}
}