你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
fuluoce 发表于 2015-1-30 10:50 而且这bug不好改! 太多的地方调用uint32_t HAL_GetTick(void)函数了,,又不能随便给uwTick;清零 ...
creep 发表于 2015-7-2 17:12 ST在最新的HAL库里面已经修复了这个bug,新的延时函数如下: 测试如下:
jiaozhu88 发表于 2016-1-9 17:31 这样改了应该不行的吧 每次调用这个延迟函数的时候都改变了uwTick的值,但这个uwTick不光是在这个 ...
creep 发表于 2016-1-11 08:44 不小心把我测试的代码也添加进去了,应该是下面这样的!
jiaozhu88 发表于 2016-1-9 17:29 转自21 一楼的写法的确是有BUG的,并非是溢出问题,假设延时 30ms 0x1E: void HAL_Delay(__IO uint32_t D ...
似乎是有这问题。其实以前的VB也有这个问题。
MSDN中也明确的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是编写服务器端程序,此处一定要万分注意,避免引起意外的状况。
不过再MCU里连续工作49天那是很正常的。所以还是有一些问题的。
应该还是有问题的吧。。
在HAL库里,很多都是:if((Timeout == 0) || ((HAL_GetTick() - tickstart ) > Timeout)) 这类判断
如果改成:if((Timeout == 0) || (HAL_GetTick() > (tickstart + Timeout))) 就好像没问题了
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while(HAL_GetTick() < (tickstart+ Delay))
{
}
}
uwTick是无符号32位,开机要不断运行49天才会溢出,你要是觉得短的话把uwTick改为u64类型的不就行了,这样就再也不用担心溢出了,至于HAL库中其他地方需要timeout做超时判断的地方,你应该不会设置超时49天吧,所以u32的timeout就可以了。
这个问题确实是比较难解决,比较调用共用的太多了,
或者建立一个定时器表,各自都分配一个id,更具不同的定时器id判断各自的定时时间,估计这样会比较好,
一楼的写法的确是有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)为假,延时完成,退出。
{
}
}
个人感觉这个解答很好,新版本的HAL也确实是按照他说的这个改的。改了后uwTick的溢出对这个延迟函数没有任何影响。但这个uwTick的溢出是否在别的地方有影响还不好说。得看具体情况了。
这样改了应该不行的吧 每次调用这个延迟函数的时候都改变了uwTick的值,但这个uwTick不光是在这个延迟函数里用的啊 在别的地方还有用到呢
不小心把我测试的代码也添加进去了,应该是下面这样的!
清零了,就只有一个地方可以使用。
权衡一下,还是不要清零的好。。。
改成这样确实不会有问题了!
这个讲解很耐心