发新帖我要提问
12
返回列表
打印
[STM32F4]

stm32的hal库的hal_delay问题

[复制链接]
楼主: fuluoce
手机看帖
扫描二维码
随时随地手机跟帖
21
delong_z| | 2015-10-30 16:02 | 只看该作者 回帖奖励 |倒序浏览
一楼的写法的确是有BUG的,并非是溢出问题,假设延时 30ms  0x1E:
void HAL_Delay(__IO uint32_t Delay)
{
   __IO uint32_t timingdelay;

   timingdelay = uwTick + Delay;             //假设此时uwTick=0xFFFFFFF0  Delay=0x1E 则 timingdelay=0x1 0000000E,溢出后保留32位=0x0000000E。
   //while(HAL_GetTick() < timingdelay)
         while(uwTick < timingdelay)          //此时的uwTick仍是0xFFFFFFF0或任何小于0xFFFFFFFF的值,则 if(0xFFFFFFF0<0x0000000E) 为假,立即退出,并没有延时30ms。
   {;
   }
}

正确的写法应该是这样,仍然假设延时 30ms  0x1E:
__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();                         //假设此时uwTick=0xFFFFFFF0  Delay=0x1E 则 tickstart=0xFFFFFFF0。
  while((HAL_GetTick() - tickstart) < Delay)   //此时的uwTick仍是0xFFFFFFF0或任何小于0xFFFFFFFF的值时,假如是0xFFFFFFF5-0xFFFFFFF0=0x05,if(0x05<0x1E)为真,继续等待。
                                                                 //如果溢出后 uwTick=0x0000000D,则0x0000000D-0xFFFFFFF0=0x1D,if(0x1D<0x1E)为真,继续等待。
                                                                 //继续 uwTick=0x0000000E,则0x0000000E-0xFFFFFFF0=0x1E,if(0x1E<0x1E)为假,延时完成,退出。
  {
  }
}

使用特权

评论回复
22
delong_z| | 2015-10-30 16:07 | 只看该作者
一楼的写法并非是溢出问题,而是当 uwTick+延时值,即 timingdelay 有溢出的时候, 而且此时的 uwTick 又刚好大于 timingdelay 值时,这两个条件同时成立,则会立即退出延时,即没有延时。

使用特权

评论回复
23
delong_z| | 2015-10-30 16:18 | 只看该作者
类似地,HAL库中有些函数支持超时退出的:

  /* Get tick */
  tickstart = HAL_GetTick();
。。。。。
      if((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout))
      {
。。。。。
        return HAL_TIMEOUT;
      }

这里其实有点小问题,实际超时时间是比 TimeOut 多了1ms
正确的应该是 ((HAL_GetTick() - tickstart) >= Timeout)),超时等待时间才正确。


使用特权

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

本版积分规则