testGpioSingle.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. --- 模块功能:GPIO功能测试.
  2. -- @author openLuat
  3. -- @module gpio.testGpioSingle
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.03.27
  7. module(...,package.seeall)
  8. require"pins"
  9. --[[
  10. 有些GPIO需要打开对应的ldo电压域才能正常工作,电压域和对应的GPIO关系如下
  11. pmd.ldoset(x,pmd.LDO_VSIM1) -- GPIO 29、30、31
  12. pmd.ldoset(x,pmd.LDO_VLCD) -- GPIO 0、1、2、3、4
  13. --注意:
  14. --Air724 A11以及之前的开发板丝印有误:
  15. --丝印中的IO_0、IO_1、IO_2、IO_3、IO_4并不对应GPIO0、1、2、3、4
  16. --丝印中的LCD_DIO、LCD_RS、LCD_CLK、LCD_CS对应GPIO0、1、2、3;模块的LCD_SEL引脚对应GPIO4
  17. pmd.ldoset(x,pmd.LDO_VMMC) -- GPIO 24、25、26、27、28
  18. x=0时:关闭LDO
  19. x=1时:LDO输出1.716V
  20. x=2时:LDO输出1.828V
  21. x=3时:LDO输出1.939V
  22. x=4时:LDO输出2.051V
  23. x=5时:LDO输出2.162V
  24. x=6时:LDO输出2.271V
  25. x=7时:LDO输出2.375V
  26. x=8时:LDO输出2.493V
  27. x=9时:LDO输出2.607V
  28. x=10时:LDO输出2.719V
  29. x=11时:LDO输出2.831V
  30. x=12时:LDO输出2.942V
  31. x=13时:LDO输出3.054V
  32. x=14时:LDO输出3.165V
  33. x=15时:LDO输出3.177V
  34. ]]
  35. local level = 0
  36. --GPIO18配置为输出,默认输出低电平,可通过setGpio18Fnc(0或者1)设置输出电平
  37. local setGpio18Fnc = pins.setup(pio.P0_18,0)
  38. sys.timerLoopStart(function()
  39. level = level==0 and 1 or 0
  40. setGpio18Fnc(level)
  41. log.info("testGpioSingle.setGpio18Fnc",level)
  42. end,1000)
  43. --GPIO19配置为输入,可通过getGpio19Fnc()获取输入电平
  44. local getGpio19Fnc = pins.setup(pio.P0_19)
  45. sys.timerLoopStart(function()
  46. log.info("testGpioSingle.getGpio19Fnc",getGpio19Fnc())
  47. end,1000)
  48. --pio.pin.setpull(pio.PULLUP,pio.P0_19) --配置为上拉
  49. --pio.pin.setpull(pio.PULLDOWN,pio.P0_19) --配置为下拉
  50. --pio.pin.setpull(pio.NOPULL,pio.P0_19) --不配置上下拉
  51. function gpio13IntFnc(msg)
  52. log.info("testGpioSingle.gpio13IntFnc",msg,getGpio13Fnc())
  53. --上升沿中断
  54. if msg==cpu.INT_GPIO_POSEDGE then
  55. --下降沿中断
  56. else
  57. end
  58. end
  59. --GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数
  60. getGpio13Fnc = pins.setup(pio.P0_13,gpio13IntFnc)
  61. ---------------------------------------脉冲统计个数功能演示---------------------------------------
  62. --脉冲产生器:GPIO11一直输出1KHz的方波
  63. pio.pin.pwm(pio.P0_11,500,500,-1)
  64. --脉冲检测:GPIO23用来检测,短接GPIO11和GPIO23
  65. sys.taskInit(function()
  66. --关闭软件和硬件防抖功能
  67. pio.pin.setdebounce(0xffffffff)
  68. --配置GPIO23位脉冲检测模式
  69. pio.pin.setdir(pio.INT,pio.P0_23,pio.CONT)
  70. --恢复默认防抖配置20毫秒
  71. pio.pin.setdebounce(20)
  72. --每隔一秒检测一次输入脉冲的数量
  73. --检测1分钟
  74. local seconds = 0
  75. while seconds<60 do
  76. -- 读取检测到的脉冲个数,数据为table类型,格式如下:
  77. -- {
  78. -- low = 10, -- 低电平个数
  79. -- high = 10, -- 高电平个数
  80. -- duration = 2000000, -- 距离上次读取的时间(单位us)
  81. -- }
  82. local tPlusInfo = pio.pin.getval(pio.P0_23)
  83. log.info("testGpioSingle.gpio23 tPlusInfo",tPlusInfo.low,tPlusInfo.high,tPlusInfo.duration)
  84. sys.wait(1000)
  85. seconds = seconds+1
  86. end
  87. --关闭GPIO23脉冲检测功能
  88. pio.pin.close(pio.P0_23)
  89. end)
  90. ---------------------------------------脉冲统计个数功能演示---------------------------------------
  91. --[[
  92. pmd.ldoset(1,pmd.LDO_VMMC)
  93. getGpio24Fnc = pins.setup(24,nil,pio.PULLUP)
  94. getGpio25Fnc = pins.setup(25,nil,pio.PULLUP)
  95. getGpio26Fnc = pins.setup(26,nil,pio.PULLUP)
  96. getGpio27Fnc = pins.setup(27,nil,pio.PULLUP)
  97. sys.timerLoopStart(function()
  98. log.info("getGpio24Fnc",getGpio24Fnc())
  99. log.info("getGpio25Fnc",getGpio25Fnc())
  100. log.info("getGpio26Fnc",getGpio26Fnc())
  101. log.info("getGpio27Fnc",getGpio27Fnc())
  102. end,2000)]]
  103. --[[
  104. pmd.ldoset(0,pmd.LDO_VLCD)
  105. pins.setup(pio.P0_0,1)
  106. levelTest = 0
  107. pmd.ldoset(15,pmd.LDO_VMMC)
  108. pins.setup(pio.P0_27,1)
  109. pmd.ldoset(15,pmd.LDO_VSIM1)
  110. pins.setup(pio.P0_29,1)
  111. pins.setup(pio.P0_30,1)
  112. pins.setup(pio.P0_31,1)
  113. sys.timerLoopStart(function()
  114. pmd.ldoset(levelTest,pmd.LDO_VMMC)
  115. pmd.ldoset(levelTest,pmd.LDO_VLCD)
  116. pmd.ldoset(levelTest,pmd.LDO_VSIM1)
  117. log.info("levelTest",levelTest)
  118. levelTest = levelTest+1
  119. if levelTest>15 then levelTest=0 end
  120. end,10000)
  121. ]]
  122. --[[
  123. local intCnt = 0
  124. sys.taskInit(function()
  125. while true do
  126. local setGpio14Fnc = pins.setup(pio.P0_14,1)
  127. sys.wait(2000)
  128. log.info("intCnt",intCnt)
  129. sys.wait(2000)
  130. intCnt = 0
  131. for i=1,10 do
  132. setGpio14Fnc(0)
  133. sys.wait(3)
  134. setGpio14Fnc(1)
  135. sys.wait(3)
  136. end
  137. end
  138. end)
  139. function gpio15IntFnc(msg)
  140. log.info("testGpioSingle.gpio15IntFnc",msg,getGpio15Fnc())
  141. intCnt = intCnt+1
  142. --上升沿中断
  143. if msg==cpu.INT_GPIO_POSEDGE then
  144. --下降沿中断
  145. else
  146. end
  147. end
  148. pio.pin.setdebounce(2)
  149. --GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数
  150. getGpio15Fnc = pins.setup(pio.P0_15,gpio15IntFnc)
  151. ]]