gpio_irq_task.lua 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. --[[
  2. @module gpio_irq_task
  3. @summary GPIO中断功能模块
  4. @version 1.0
  5. @date 2025.10.21
  6. @author 拓毅恒
  7. @usage
  8. 本文件为 GPIO 按键短按和长按检测的代码示例,核心业务逻辑为:
  9. 1. 配置GPIO5为中断模式,上升沿和下降沿均触发
  10. 2. 实现按键短按(小于3秒)和长按(大于等于3秒)的检测功能
  11. 3. 可连接按键或直接用杜邦线轻触GND进行测试
  12. 4. 注意:使用杜邦线测试时,因为脉冲可能无法控制,所以不要加防抖防止程序测试异常
  13. ]]
  14. -- 配置gpio5为中断模式,上升沿(gpio.RISING)和下降沿(gpio.FALLING)均触发(gpio.BOTH)
  15. local gpio_pin = 5
  16. -- gpio.debounce(gpio_pin, 100) -- 实际设计板子时,根据自己的需求可以更改防抖配置以及打开防抖
  17. -- 按键状态变量
  18. local long_press_threshold = 3000 -- 长按判断阈值,3秒
  19. local current_state = 1 -- 跟踪当前按键状态,1为释放,0为按下
  20. -- 定时器回调函数,处理长按事件
  21. local function timer_callback(gpio_id)
  22. log.info("按键检测", "长按事件", gpio_id)
  23. end
  24. -- 定义GPIO中断处理函数
  25. local function gpio_irq_handler()
  26. local pin_state = gpio.get(gpio_pin) -- 获取GPIO当前状态
  27. -- 只有当状态发生变化时才处理
  28. if pin_state ~= current_state then
  29. current_state = pin_state -- 更新当前状态
  30. if pin_state == 0 then
  31. -- 按键按下
  32. log.info("按键检测", "按键按下")
  33. if not sys.timerIsActive(timer_callback, gpio_pin) then
  34. -- 启动定时器,3秒后触发长按事件
  35. sys.timerStart(timer_callback, long_press_threshold, gpio_pin)
  36. end
  37. elseif pin_state == 1 then
  38. -- 按键释放
  39. log.info("按键检测", "按键释放")
  40. -- 如果定时器还在运行,说明是短按
  41. if sys.timerIsActive(timer_callback, gpio_pin) then
  42. sys.timerStop(timer_callback, gpio_pin)
  43. log.info("按键检测", "短按事件")
  44. end
  45. end
  46. end
  47. end
  48. -- 配置GPIO中断
  49. gpio.setup(gpio_pin, gpio_irq_handler, gpio.PULLUP, gpio.BOTH)