首页 / 资讯中心 / 文章详情

ESP32踩坑实录:定时器让灯一直闪,但程序怎么停不下来了?

ESP32踩坑实录:定时器让灯一直闪,但程序怎么停不下来了? ★ FEATURED ARTICLE
注本文排版和原理解析部分借助了 AI 辅助整理但所有代码均在本地 Thonny ESP32 开发板实测跑通。踩坑不易记录分享大佬轻喷~【在这里插入你的图片ESP32开发板亮蓝灯的照片】最近在折腾物联网开发用 ESP32 跑 MicroPython。前几天刚用while True死循环搞定了按键控制 LED但这有个致命缺点CPU 一直在原地空转死等极其浪费资源。今天准备进阶一下用 ESP32 内部的硬件定时器Timer来实现一个新功能让板载的蓝灯每隔 1 秒钟自动亮灭交替一次并且在终端打印出当前是第几秒。【踩坑现象】代码写得很顺利点运行后板子上的蓝灯确实完美地一秒闪一次终端也在疯狂打印递增的数字。但是当我想让程序停下来的时候问题出现了按 Thonny 上的红色“停止”按钮程序根本停不下来甚至偶尔按了停止后再次点运行还会直接报错卡死。【踩坑原因】查了资料才明白罪魁祸首是Timer的硬件级别。之前用的while循环是软件级别的点停止就能强行打断。但硬件定时器是底层外设它一旦跑起来就像定了一个永远重复的闹钟。普通的停止指令掐不断它导致底层的硬件资源一直被占用无法释放。【解决办法加上“资源释放”保护罩】为了让程序能被我们人类安全控制我们必须加一个try...except语句来捕获手动停止动作CtrlC并且在程序退出前手动把定时器关掉tim.deinit()。【修复后的完整代码】pythonfrom machine import Pin, Timer import time led Pin(2, Pin.OUT) # 假设蓝灯在 2 号引脚 Counter 0 # 定义回调函数定时器时间一到自动执行这里 def fun(tim): global Counter Counter Counter 1 led.value(Counter % 2) # 核心取余操作实现 1、0 交替闪烁 print(f定时器触发第 {Counter} 秒) # 实例化硬件定时器 0 tim Timer(0) # 周期 1000ms1秒周期性触发回调 fun 函数 tim.init(period1000, modeTimer.PERIODIC, callbackfun) # 核心保护机制 try: while True: time.sleep(1) # 主程序进入休眠把 CPU 让给底层干活 except KeyboardInterrupt: print(程序被手动停止了) tim.deinit() # 极其关键的一步关闭定时器释放硬件资源【运行结果】现在程序受控了。每次点击运行灯都会稳定闪烁。当我按下CtrlC或者点击停止时终端会立刻打印出“程序手动停止了”板子安静下来硬件资源完美释放再次点击运行也不会报错了。【踩坑记录小结】硬件定时器Timer非常强大它是“非阻塞”的可以让我们在不写死循环的情况下实现多任务。玩底层硬件开发一定要有“资源回收”意识。用完的引脚、打开的文件、开启的定时器一定要记得deinit()或者close()否则后患无穷。记录一下踩坑过程希望能帮到同样刚入门 MicroPython 的同学
阅读完成 · 觉得有帮助?
咨询建站