久芯网

滴答定时器延时函数疑问

avatar huahuahnu 提问时间: 2023-07-19 16:06:15 / 未解决
在stm32f1xx_ll_utils.c中提供的延时函数,以下标红语句为什么要多加1呢?延时1ms不就变成2ms了吗?

void LL_mDelay(uint32_t Delay)
{
  __IO uint32_t  tmp = SysTick->CTRL;  /* Clear the COUNTFLAG first */
  /* Add this code to indicate that local variable is not used */
  ((void)tmp);

  /* Add a period to guaranty minimum wait */
  if (Delay < LL_MAX_DELAY)
  {
    Delay++;
  }

  while (Delay)
  {
    if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U)
    {
      Delay--;
    }
  }
}

3个回答
  • avatar butterflyspring
    回答时间: 2023-07-19 16:24:01

    如果是延时1ms,不加1的话,刚好计数器到0,那么执行减1后,不就立刻结束延时了么,所以是为了保证最小的等待时间。

  • avatar yklstudent
    回答时间: 2023-07-19 16:52:13

    mark,签到+1

  • avatar xmshao
    回答时间: 2023-07-19 17:10:32

    研究库代码如此仔细,值得学习! 首先,你说的情况是存在的,1ms延时可能变成2ms,准确地讲是可能变成接近2ms,永远到不了2ms这个极限。 ST库函数里一般将systick 计数器的分辨率设置为1ms,换言之,我们就得接受1ms内的误差。 具体到这里,代码在这个地方加1是为了确保至少1ms的延迟,结合上面的分析,误差也不会大过1ms. 当然,这里不考虑其它抢占、堵塞等问题。 最后,这个延时函数不是一成不变的,我们可以根据自己需求调整分辨率和自行组织实现代码,包括上面 提到的加1操作。

会员中心 微信客服
客服
回到顶部