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文章
920浏览量
43879 -
源码
+关注
关注
8文章
689浏览量
31521 -
函数
+关注
关注
3文章
4422浏览量
67863 -
Systick
+关注
关注
0文章
67浏览量
14020 -
HAL
+关注
关注
2文章
75浏览量
13750
发布评论请先 登录
驱动板PCB布线的注意事项
Enclustra瑞苏盈科产品使用注意事项
在rtthread的main函数里用HAL_Delay函数不起作用是哪里的问题?
别让这些细节毁了PCBA!焊接注意事项清单
智多晶PLL使用注意事项
美国Odyssey奥德赛电池充电注意事项全解析
IGBT器件的防静电注意事项
手机喇叭气密性检测仪的注意事项
SysTick与HAL_Delay的关系与注意事项
评论