news 2026/4/25 15:35:28

你还在使用HAL_Delay吗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
你还在使用HAL_Delay吗

HAL_Delay 是STM32HAL库提供的毫秒级延时函数, 相信所有STM32开发人员都对它非常的熟悉, 那么你曾经或者是现在是否还在频繁的使用HAL_Delay呢? 现在的你是否还记得自己点亮的第一颗Led灯呢?

看下面代码:

void Led_Flicker(void) { Led_On(); HAL_Delay(500); Led_Off(); HAL_Delay(500); return; }

这段代码非常简单,就是实现一个Led灯的闪烁效果,频率是500ms。当你满心欢喜的把它放在while(1){}中,下载到板子上面, 看着不断闪烁的小灯泡激动不已, 这时的你可能不会去深究, 这个HAL_Delay实现了精确的延时, 但随之会带来那些问题呢。 刚开始只是简单的一个小实验, 并不会影响很大, 可是如果像下面这样呢?

while(1) { Led_Flicker(); Key_Scan(); }

循环中除了执行Led闪烁的代码外, 还有按键扫描的代码, 这时问题就来了, HAL_Delay是阻塞延时, 不到达设定的时间是不会往下执行的, 也就是说, 在Led闪烁的时候, 下面的按键扫描是在等待执行的, 不能够及时的检测到按键状态。最终会造成系统响应不及时。那么怎么解决这个问题呢, 下面给出其中一种解决方法:

// 枚举Led的状态 typedef enum { LED_ON, // 亮 LED_OFF, // 灭 LED_KEEP_ON, // 保持亮 LED_KEEP_OFF // 保持灭 }LedState; void Led_Flicker(void) { static LedState state = LED_ON; // 初始化Led的状态 static uint32_t start_time = 0; // 记录开始时间 uint32_t now = HAL_GetTick(); // 获取当前时间 switch(state){ case LED_ON: Led_On(); start_time = now; // 记录亮灯开始的时间 state = LED_KEEP_ON; // 切换状态 break; case LED_KEEP_ON: if(now - start_time >= 500){ // 查询亮灯的时间 state = LED_OFF; } break; case LED_OFF: Led_Off(); start_time = now; state = LED_KEEP_OFF; break; case LED_KEEP_OFF: if(now - start_time >= 500){ state = LED_ON; } break; } }

HAL_GetTick() 返回的是当前系统时间uwTick,可以把它理解成一个一直在变化的时间戳, 它是系统启动后, 由SysTick中断回调不断更新的一个值,默认是1ms,每次会把uwTick+1。

没错, 这就是传说中的状态机, 通过状态机不断的查询时间来实现延时的效果, 实现非阻塞, 状态机是实现非阻塞的核心, 今天通过这个例子, 体现了状态机在延时方面的应用。

现在通过状态机实现延时, 查询到延时时间没有到达, 就会立即返回, 不会阻塞整个系统的运行了, 也不会占用有限的硬件资源, 状态机的应用非常的广泛, 实现延时只是其中的一种。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 13:37:55

Agent记忆系统对比

在AI Agent的开发中,“烧钱”的往往不是模型本身,而是被你强行塞进上下文窗口(Context Window)里的海量垃圾数据。 一个好的记忆系统,本质上就是一个**“抠门且高效的管家”**,它能帮你把原本需要几万甚至…

作者头像 李华
网站建设 2026/4/19 0:44:51

LEDUV固化机对高性能电子元件固化要求

在科技不断发展进步的今天,半导体,电子元件的集成度越来越高,对用于芯片/电子元件封装过程LEDUV固化机要求也越来越高。LEDUV固化机厂家,可满足精密电子元件用胶及LEDUV固化需求,可提供一系列成熟产品。在高性能电子元…

作者头像 李华
网站建设 2026/4/18 13:38:02

手把手教你用Multisim14.0验证Buck电路CCM模式:电感电流波形怎么看?

手把手教你用Multisim14.0验证Buck电路CCM模式:电感电流波形怎么看? 在电力电子领域,Buck电路作为最基本的DC-DC降压拓扑,其工作模式的理解对工程师至关重要。Multisim14.0作为业界广泛使用的电路仿真工具,能够直观展示…

作者头像 李华