SysTick与HAL_Delay的关系与注意事项
本文将介绍SysTick与HAL_Delay()函数之间的关系,以及使用HAL_Delay()函数的注意事项;
一.HAL_Delay()函数实现的原理、与SysTick的关系
下面我们先看一下HAL_Delay函数的源码
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while((HAL_GetTick() - tickstart) < wait)
{
}
}
从源码可以看出该函数将我们传入的参数与HAL_GetTick()-tickstart比较,若不满足条件则退出while、若满足 接下来我们追一下HAL_GetTick()的源代码: 接着追一下uwTick ,发现在下面这个函数中对它的值进行了操作: 接着追一下uwTickFreq 发现uwTickFreq = 1,接着追一下HAL_IncTick(void)函数: 发现HAL_IncTick(void)函数是在SysTick的中断回调函数内调用的; 综上可知HAL_Delay与SysTick的关系:HAL_Delay函数的执行、最终是依赖于SysTick的每触发一次SysTick的中断耗时1ms,HAL_GetTick()-tickstart会增大1、知道差值等于HAL_Delay的传入参数。 二、由SysTick与HAL_Delay之间的关系可知,我们在使用HAL_Delay的时候需要注意:当在中断中使用了HAL_Delay函数,则该中断的抢占优先级必须低于SysTick中断的优先级,否则会导致SysTick中断不能抢占该中断函数、最终导致HAL_GetTick()-tickstart的值不会变,从而陷入死循环中。__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}
全部0条评论
快来发表一下你的评论吧 !