HAL_Delay延时不准确

HAL_Delay 延时误差大

某次使用HAL_Delay函数的发现delay和自己预想的不太一致,始终是多一些时间,导致出现了一些问题。

于是乎测试了一下HAL_Delay函数的延时时间。

测试delay时间

程序中有个1ms的定时器中断,会导致delay的时间稍微多点。

在while循环中通过反转引脚的状态来查看delay 1ms时间;

c 复制代码
// 测试主要代码
while(1)
{
    HAL_Delay(1);
    HAL_GPIO_TogglePin(TP_19_GPIO_Port, TP_19_Pin);
}

测试显示,相对应的引脚反转的时间是实际的2ms左右,比预设的要多出 1ms;

后又查看delay 2ms 的时间

c 复制代码
// 测试主要代码
while(1)
{
    HAL_Delay(2);
    HAL_GPIO_TogglePin(TP_19_GPIO_Port, TP_19_Pin);
}

还是比预设的多出 1ms;

事情变得有趣起来了。

查看 HAL_Delay 函数的实现

追 HAL_Delay 函数

c 复制代码
__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 函数 是个虚函数,用户可根据自己的需求将其重写。

相关推荐
zhangzhangkeji5 分钟前
stm32 HAL 库改写 江协科大的程序
stm32
沐欣工作室_lvyiyi1 小时前
基于STM32的社区养老控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·社区养老控制系统·保定理工学院·华德学院·淮南师范学院
创界工坊工作室2 小时前
26-基于51单片机的智能热水器控制系统设计
stm32·单片机·嵌入式硬件·毕业设计·51单片机·proteus
sayang_shao2 小时前
用 Rust 开发 STM32H743:从零搭建一个能烧录、能看日志的项目
stm32·单片机·rust
硅基造物主2 小时前
18.从 IP 到 MQTT:STM32 用 AT 指令驱动 ESP-12F 上云的完整链路(含全套实战代码 + 踩坑清单)
网络·stm32·单片机·嵌入式硬件·网络协议·tcp/ip
一个风轻云淡3 小时前
扒开系统调用的三层皮:从 getpid 到手写 int 0x80
stm32·单片机·嵌入式硬件
qq_401700414 小时前
CAN 开源库大全(嵌入式/上位机,适配STM32、Linux、Qt,附带Github地址)
linux·stm32·开源
BT-BOX4 小时前
2026最新Keil 5软件下载安装详细教程含MDK和C51(附下载链接)
stm32·proteus
li星野6 小时前
【学习记录】DAP调试器电路原理图完全详解:从STM32最小系统到SWD调试接口
stm32·嵌入式硬件·学习
Zw-awa6 小时前
黑盒与白盒:人是怎么把世界装进口袋的
stm32