STM32
直播中

王涛

8年用户 1296经验值
私信 关注
[问答]

stm32cubemx的HAL_Delay()函数,当HAL_GetTick()的计数正好要溢出时,是不是延时就不准了?

          __weak uint32_t HAL_Gettick(void)
{
  return uwTick;
}

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

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}

这里使用这个延时函数有没有这种情况,当HAL_GetTick()的计数正好要溢出时,是不是延时就不准了?



回帖(1)

周必镜

2024-5-9 16:15:43
是的,您提到的问题是正确的。在STM32CubeMX的HAL_Delay()函数中,当HAL_GetTick()的计数正好要溢出时,延时可能会变得不准确。这是因为HAL_GetTick()函数返回的是一个无符号整数(uint32_t),当它达到最大值时会发生溢出,从而重新开始计数。

在您提供的代码中,HAL_Delay()函数的工作原理如下:

1. 首先,获取当前的系统滴答计数(tickstart = HAL_GetTick())。
2. 然后,进入一个while循环,直到从tickstart开始的延时时间(Delay)过去。
3. 在循环内部,计算当前滴答计数与tickstart之间的差值,并检查是否小于Delay。

当HAL_GetTick()的计数溢出时,会发生以下情况:

1. HAL_GetTick()返回的值突然变得非常小,导致while循环中的差值计算不准确。
2. 这可能导致HAL_Delay()函数提前退出,从而导致实际延时时间小于预期的Delay值。

为了解决这个问题,可以采用以下方法:

1. 在while循环中,检查HAL_GetTick()的当前值是否小于tickstart。如果是,则说明计数已经溢出,需要进行特殊处理。
2. 当计数溢出时,更新tickstart为当前的HAL_GetTick()值,并重新计算剩余的延时时间。

修改后的HAL_Delay()函数可能如下所示:

```c
__weak void HAL_Delay(__IO uint32_t Delay)
{
    uint32_t tickstart = 0;
    uint32_t wait = Delay;
    tickstart = HAL_GetTick();
    while ((HAL_GetTick() - tickstart) < wait)
    {
        if (HAL_GetTick() < tickstart)
        {
            // 计数已经溢出,重新计算剩余延时
            wait -= (tickstart - HAL_GetTick());
            tickstart = HAL_GetTick();
        }
    }
}
```

这样,即使在HAL_GetTick()计数溢出的情况下,HAL_Delay()函数也能准确地实现预期的延时。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分