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

相关推荐
Lzh编程小栈1 天前
嵌入式深度精讲|STM32引脚全方位底层原理、配置逻辑、硬件规范、高频面试题
c语言·stm32·单片机·嵌入式硬件
AI的探索之旅1 天前
我把立创EDA接进了本地大模型:数据不出门的AI设计检查实测
人工智能·stm32·硬件工程
李boyang2 天前
STM32H5_Bootloader与IAP升级机制深度解析
stm32·iap·bootloader
达子6662 天前
Zephyr RTOS 学习系统:第一阶段 —— 入门篇
stm32·单片机·嵌入式硬件
‎ദ്ദിᵔ.˛.ᵔ₎2 天前
STM32入门第一课:32位MCU
stm32·单片机
根号五2 天前
【HAL库】STM32F407---低功耗休眠
stm32·单片机·嵌入式硬件
Freedom_my2 天前
STM32简单项目
stm32·单片机·嵌入式硬件
周洲08302 天前
STM32+ESP8266 WiFi 远程环境监测平台|本地 OLED 显示 + TCP 上传电脑 / 手机
stm32·tcp/ip·电脑
GeekArch2 天前
第8讲:裸机单片机项目——Vibe快速迭代的最优边界
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·ai编程
辰哥单片机设计3 天前
STM32音乐播放器
stm32·单片机·嵌入式硬件