main.lua 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "ioqueue"
  3. VERSION = "1.0.0"
  4. -- 仅支持ioqueue的平台能使用!!
  5. -- sys库是标配
  6. _G.sys = require("sys")
  7. local rtos_bsp = rtos.bsp()
  8. function pinx() -- 根据不同开发板,给LED赋值不同的gpio引脚编号
  9. if rtos_bsp == "AIR105" then
  10. mcu.setXTAL(true) --为了测试更准确,调整到外部时钟
  11. return 1, pin.PD06, pin.PD07
  12. elseif string.find(rtos_bsp,"EC718") then -- Air780E开发板引脚
  13. gpio.setup(12,nil,nil)
  14. gpio.setup(13,nil,nil)
  15. return 1, 12,13
  16. else
  17. log.info("main", "define led pin in main.lua")
  18. return 255,255
  19. end
  20. end
  21. sys.taskInit(function()
  22. local _,tick_us = mcu.tick64()
  23. local hw_timer_id, capture_pin,out_pin = pinx()
  24. local buff1 = zbuff.create(100)
  25. local buff2 = zbuff.create(100)
  26. local cnt1,cnt2,i,lastTick,bit1Tick,nowTick,j,bit
  27. mcu.hardfault(0)
  28. sys.wait(2000)
  29. bit1Tick = 100 * tick_us
  30. while 1 do
  31. log.info('start dht11')
  32. --测试单总线DHT11
  33. ioqueue.stop(hw_timer_id) --确保硬件定时器1是空闲的
  34. ioqueue.init(hw_timer_id,100,1) --io队列设置100个命令,重复1次,实际上用不到那么多命令
  35. ioqueue.setgpio(hw_timer_id, capture_pin, true, gpio.PULLUP) --数据线拉高,上拉输入
  36. ioqueue.setdelay(hw_timer_id, 10000, 0, false) --单次延迟10ms
  37. ioqueue.setgpio(hw_timer_id, capture_pin, false, 0, 0) --数据线拉低
  38. ioqueue.setdelay(hw_timer_id, 18000, 0, false) --单次延迟18ms
  39. ioqueue.set_cap(hw_timer_id, capture_pin, gpio.PULLUP, gpio.FALLING, 100000 * tick_us) --设置成下降沿中断捕获,最大计时100000us, 上拉输入,这里已经代替了输出20~40us高电平
  40. for i = 1,42,1 do
  41. ioqueue.capture(hw_timer_id) --捕获42次外部中断发生时的tick值,2个start信号+40bit数据
  42. end
  43. ioqueue.cap_done(hw_timer_id, capture_pin) --停止捕获
  44. ioqueue.setgpio(hw_timer_id, capture_pin, true, gpio.PULLUP) --数据线拉高,上拉输入
  45. ioqueue.start(hw_timer_id)
  46. sys.waitUntil("IO_QUEUE_DONE_"..hw_timer_id)
  47. ioqueue.stop(hw_timer_id)
  48. --开始解析捕获的数据
  49. cnt1,cnt2 = ioqueue.get(hw_timer_id, buff1, buff2)
  50. if cnt2 ~= 42 then
  51. log.info('test fail')
  52. goto TEST_OUT
  53. end
  54. lastTick = buff2:query(6 + 2, 4, false) --以第二次中断的tick作为起始tick,第一次的tick没有用
  55. j = 0
  56. bit = 8
  57. buff1[0] = 0
  58. for i = 2,41,1 do
  59. --检查一下是不是对应pin的下降沿中断,不过也不太需要
  60. if buff2[i * 6 + 0] ~= capture_pin or buff2[i * 6 + 1] ~= 0 then
  61. log.error("capture", i, buff2[i * 6 + 0], buff2[i * 6 + 1])
  62. end
  63. --通过计算tick差值来确定是bit1还是bit0
  64. nowTick = buff2:query(i * 6 + 2, 4, false)
  65. buff1[j] = buff1[j] << 1
  66. if (nowTick - lastTick) > bit1Tick then
  67. buff1[j] = buff1[j] + 1
  68. end
  69. bit = bit - 1
  70. if bit == 0 then
  71. j = j + 1
  72. bit = 8
  73. end
  74. lastTick = nowTick
  75. end
  76. buff1[5] = buff1[0] + buff1[1] + buff1[2] + buff1[3]
  77. if buff1[4] ~= buff1[5] then
  78. log.info('check fail', buff1[4], buff1[5])
  79. else
  80. log.info("湿度", buff1[0] .. '.' .. buff1[1], "温度", buff1[2] .. '.' .. buff1[3])
  81. end
  82. ::TEST_OUT::
  83. ioqueue.release(hw_timer_id)
  84. log.info('output 1 start')
  85. --测试高精度固定间隔定时输出,1us间隔翻转电平
  86. ioqueue.init(hw_timer_id, 100, 100)
  87. ioqueue.setgpio(hw_timer_id, out_pin, false,0,1) --设置成输出口,电平1
  88. ioqueue.setdelay(hw_timer_id, 0, tick_us - 3, true) --设置成连续延时,每次1个us,如果不准,对time_tick微调,延时开始
  89. for i = 0,40,1 do
  90. ioqueue.output(hw_timer_id, out_pin, 0)
  91. ioqueue.delay(hw_timer_id) --连续延时1次
  92. ioqueue.output(hw_timer_id, out_pin, 1)
  93. ioqueue.delay(hw_timer_id) --连续延时1次
  94. end
  95. ioqueue.start(hw_timer_id)
  96. sys.waitUntil("IO_QUEUE_DONE_"..hw_timer_id)
  97. log.info('output 1 done')
  98. ioqueue.stop(hw_timer_id)
  99. ioqueue.release(hw_timer_id)
  100. sys.wait(500)
  101. log.info('output 2 start')
  102. --测试高精度可变间隔定时输出
  103. ioqueue.init(hw_timer_id, 100, 100)
  104. ioqueue.setgpio(hw_timer_id, out_pin, false,0,1) --设置成输出口,电平1
  105. ioqueue.setdelay(hw_timer_id, 0, tick_us - 3) --单次延迟1us,如果不准,对time_tick微调
  106. ioqueue.output(hw_timer_id, out_pin, 0) --低电平
  107. ioqueue.setdelay(hw_timer_id, 1, tick_us - 3) --单次延迟2us
  108. ioqueue.output(hw_timer_id, out_pin, 1) --高电平
  109. ioqueue.setdelay(hw_timer_id, 2, tick_us - 3) --单次延迟3us
  110. ioqueue.output(hw_timer_id, out_pin, 0) --低电平
  111. ioqueue.setdelay(hw_timer_id, 3, tick_us - 3) --单次延迟4us
  112. ioqueue.output(hw_timer_id, out_pin, 1) --高电平
  113. ioqueue.setdelay(hw_timer_id, 4, tick_us - 3) --单次延迟5us
  114. ioqueue.output(hw_timer_id, out_pin, 0) --低电平
  115. ioqueue.setdelay(hw_timer_id, 5, tick_us - 3) --单次延迟6us
  116. ioqueue.output(hw_timer_id, out_pin, 1) --高电平
  117. ioqueue.start(hw_timer_id)
  118. sys.waitUntil("IO_QUEUE_DONE_"..hw_timer_id)
  119. log.info('output 2 done')
  120. ioqueue.stop(hw_timer_id)
  121. ioqueue.release(hw_timer_id)
  122. sys.wait(500)
  123. end
  124. end)
  125. -- 用户代码已结束---------------------------------------------
  126. -- 结尾总是这一句
  127. sys.run()
  128. -- sys.run()之后后面不要加任何语句!!!!!