pins.lua 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. --- 模块功能:GPIO 功能配置,包括输入输出IO和上升下降沿中断IO
  2. -- @module pins
  3. -- @author 稀饭放姜
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.09.23 11:34
  7. module(..., package.seeall)
  8. local interruptCallbacks = {}
  9. --- 自适应GPIO模式
  10. -- @param pin ,参数为pio.P0_1-31 和 pio_P1_1-31 (IO >= 32 and IO - 31)
  11. -- @param val,输出模式默认电平:0 是低电平1是高电平,中断模式为回调函数
  12. -- @return function ,返回一个函数,该函数接受一个参数用来设置IO的电平
  13. -- @return nil,中断模式捆绑回调函数返回空
  14. -- @usage pins.setup(pio.P1_1,0,key_int) ,配置Key的IO为pio.32,中断模式,自动触发key_int(msg)函数
  15. -- @usage led = pins.setup(pio.P1_1,0) ,配置LED脚的IO为pio.32,输出模式,默认输出低电平。led(1)即可输出高电平
  16. -- @usage key = pins.setup(pio.P1_1),配置key的IO为pio.32,输入模式,用key()即可获得当前电平
  17. function setup(pin, val)
  18. -- 关闭该IO
  19. pio.pin.close(pin)
  20. -- 中断模式配置
  21. if type(val) == "function" then
  22. pio.pin.setdir(pio.INT, pin)
  23. --注册引脚中断的处理函数
  24. interruptCallbacks[pin] = val
  25. return
  26. end
  27. -- 输出模式初始化默认配置
  28. if val ~= nil then
  29. pio.pin.setdir(pio.OUTPUT, pin)
  30. pio.pin.setval(val, pin)
  31. -- 输入模式初始化默认配置
  32. else
  33. pio.pin.setdir(pio.INPUT, pin)
  34. end
  35. -- 返回一个自动切换输入输出模式的函数
  36. return function(val)
  37. pio.pin.close(pin)
  38. if val ~= nil then
  39. pio.pin.setdir(pio.OUTPUT, pin)
  40. pio.pin.setval(val, pin)
  41. else
  42. pio.pin.setdir(pio.INPUT, pin)
  43. return pio.pin.getval(pin)
  44. end
  45. end
  46. end
  47. rtos.on(rtos.MSG_INT, function(msg)
  48. if interruptCallbacks[msg.int_resnum] == nil then
  49. log.warn('pins.rtos.on', 'warning:rtos.MSG_INT callback nil', msg.int_resnum)
  50. end
  51. interruptCallbacks[msg.int_resnum](msg.int_id)
  52. end)