打印
[STM32F1]

精确延时函数的实现原理

[复制链接]
617|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinpian101|  楼主 | 2024-8-22 16:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多时候跑空指令的延时看着太小儿科了,或许不够精准。
我看到一个帖子。
https://bbs.21ic.com/icview-3295756-1-1.html
讲述了HAL库的延时函数的实现原理。
然后结合我在Arduino上看到的是延时和计时函数,发现了异曲同工的地方。
void HAL_Delay_us(uint32_t microseconds)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while ((HAL_GetTick() - tickstart) < (microseconds / 1000));
}
注意到这个函数其实是调用了一个叫做 HAL_GetTick();的函数来实现的,这个就像一个时钟一样,读取时候就是看一下时钟。记下来,然后就一直看着它,当新的时刻大道指定的时间差后就退出,表示到点了。

使用特权

评论回复
沙发
xinpian101|  楼主 | 2024-8-22 16:12 | 只看该作者
    在Arduino上也有个类似的计时器函数millis(),单位是毫秒,所以也就只能延时毫秒级的。例如延时5秒就是下面这个情况,将他放在某个while死循环里,就可以实现延时5秒后跳出。

  if((millis()-currentMillis)>=1000)
      {
        currentMillis=millis();
        timer_wait++;
        if(timer_wait>5)
        {
          return(1);
        }

使用特权

评论回复
板凳
xinpian101|  楼主 | 2024-8-22 16:13 | 只看该作者
HAL_GetTick()和millis()都是相当于一个时钟,用来记录给定一个时间刷新值。于你开始记录那个比较就实现了定时功能。

使用特权

评论回复
地板
花间一壶酒sd| | 2024-8-31 22:04 | 只看该作者
你观察得非常准确。HAL_Delay_us 函数利用了 HAL_GetTick() 函数来实现延时

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

1471

帖子

1

粉丝