HAL_Delay 延时误差大
某次使用HAL_Delay函数的发现delay和自己预想的不太一致,始终是多一些时间,导致出现了一些问题。
于是乎测试了一下HAL_Delay函数的延时时间。
测试delay时间
程序中有个1ms的定时器中断,会导致delay的时间稍微多点。
在while循环中通过反转引脚的状态来查看delay 1ms时间;
// 测试主要代码
while(1)
{
HAL_Delay(1);
HAL_GPIO_TogglePin(TP_19_GPIO_Port, TP_19_Pin);
}
测试显示,相对应的引脚反转的时间是实际的2ms左右,比预设的要多出 1ms;
后又查看delay 2ms 的时间
// 测试主要代码
while(1)
{
HAL_Delay(2);
HAL_GPIO_TogglePin(TP_19_GPIO_Port, TP_19_Pin);
}
还是比预设的多出 1ms;
事情变得有趣起来了。
查看 HAL_Delay 函数的实现
追 HAL_Delay 函数
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
发现自己在内部悄悄的将延时时间更改为了 Delay + (uint32_t)(uwTickFreq)
而 uwTickFreq默认是1,也就是HAL_Delay 函数实际延时的时间是要比设置的值要大的,最大是多出 1 ms的时间;
估计是为了保证用户设置的延时一定被满足,也就是最少延时用户设定的时间。
时的时间是要比设置的值要大的,最大是多出 1 ms的时间;
估计是为了保证用户设置的延时一定被满足,也就是最少延时用户设定的时间。
HAL_Delay 函数 是个虚函数,用户可根据自己的需求将其重写。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41555003/article/details/140360045
|