SysTick与HAL_Delay的关系与注意事项

描述

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()的源代码:

__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}

接着追一下uwTick ,发现在下面这个函数中对它的值进行了操作:

__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}

接着追一下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的值不会变,从而陷入死循环中。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分