你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

滴答定时器延时函数疑问

[复制链接]
huahuahnu 提问时间:2022-8-25 13:41 / 未解决
在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 发布时间:2022-8-25 13:41

举报

3个回答
butterflyspring 回答时间:2022-8-25 16:46:03
如果是延时1ms,不加1的话,刚好计数器到0,那么执行减1后,不就立刻结束延时了么,所以是为了保证最小的等待时间。
yklstudent 回答时间:2022-8-25 20:12:34
mark,签到+1
xmshao 回答时间:2022-8-26 11:07:10
研究库代码如此仔细,值得学习!


首先,你说的情况是存在的,1ms延时可能变成2ms,准确地讲是可能变成接近2ms,永远到不了2ms这个极限。


ST库函数里一般将systick 计数器的分辨率设置为1ms,换言之,我们就得接受1ms内的误差。


具体到这里,代码在这个地方加1是为了确保至少1ms的延迟,结合上面的分析,误差也不会大过1ms.
当然,这里不考虑其它抢占、堵塞等问题。


最后,这个延时函数不是一成不变的,我们可以根据自己需求调整分辨率和自行组织实现代码,包括上面
提到的加1操作。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版