[STM32F1] 精确延时函数的实现原理

[复制链接]
1475|4
 楼主| xinpian101 发表于 2024-8-22 16:09 | 显示全部楼层 |阅读模式
很多时候跑空指令的延时看着太小儿科了,或许不够精准。
我看到一个帖子。
https://bbs.21ic.com/icview-3295756-1-1.html
讲述了HAL库的延时函数的实现原理。
然后结合我在Arduino上看到的是延时和计时函数,发现了异曲同工的地方。
  1. void HAL_Delay_us(uint32_t microseconds)
  2. {
  3.   uint32_t tickstart = 0;
  4.   tickstart = HAL_GetTick();
  5.   while ((HAL_GetTick() - tickstart) < (microseconds / 1000));
  6. }
注意到这个函数其实是调用了一个叫做 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() 函数来实现延时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

130

主题

1651

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部