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;
}
-
中断
+关注
关注
5文章
895浏览量
41384 -
源码
+关注
关注
8文章
633浏览量
29134 -
函数
+关注
关注
3文章
4303浏览量
62411 -
Systick
+关注
关注
0文章
62浏览量
13042 -
HAL
+关注
关注
2文章
70浏览量
12591
发布评论请先 登录
相关推荐
评论