main.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "pmdemo"
  3. VERSION = "1.0.0"
  4. log.info("main", PROJECT, VERSION)
  5. -- sys库是标配
  6. _G.sys = require("sys")
  7. -- 注意:本demo使用luatools下载!!!
  8. -- 注意:本demo使用luatools下载!!!
  9. -- 注意:本demo使用luatools下载!!!
  10. -- 启动时对rtc进行判断和初始化
  11. local t = rtc.get()
  12. log.info("rtc", json.encode(t))
  13. if t["year"] == 1900 then
  14. -- 对air101/air103来说
  15. -- 若复位启动, 那rtc时间必然是1900年, 设置时间就行
  16. -- 若为唤醒, 那rtc时间必然已经设置过, 肯定不是1900, 就不用设置了
  17. rtc.set({year=2022,mon=9,day=1,hour=0,min=0,sec=0})
  18. end
  19. t = nil -- 释放t这个变量
  20. --添加硬狗防止程序卡死
  21. wdt.init(9000)--初始化watchdog设置为9s
  22. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  23. local LEDA = gpio.setup(24, 0, gpio.PULLUP) -- PB8输出模式
  24. local LEDB = gpio.setup(25, 0, gpio.PULLUP) -- PB9输出模式
  25. local LEDC = gpio.setup(26, 0, gpio.PULLUP) -- PB10输出模式
  26. -- 这里启动的task也是闪灯, 用于展示休眠状态
  27. sys.taskInit(function()
  28. local count = 0
  29. local uid = mcu.unique_id() or ""
  30. while 1 do
  31. -- 一闪一闪亮晶晶
  32. LEDA(count & 0x01 == 0x01 and 1 or 0)
  33. LEDB(count & 0x02 == 0x02 and 1 or 0)
  34. LEDC(count & 0x03 == 0x03 and 1 or 0)
  35. log.info("gpio", "Go Go Go", uid:toHex(), count)
  36. sys.wait(1000)
  37. count = count + 1
  38. end
  39. end)
  40. sys.taskInit(function()
  41. -- 对于air101/air103来说, request之后马上就会休眠
  42. -- 如果没有休眠, 请检查wakeup脚的电平
  43. -- 休眠分2种情况, RAM不掉电的LIGHT 和 RAM掉电的HIB
  44. -- 这里的sys.wait是为了开机后不会马上休眠
  45. -- 实际情况是跑业务代码, 条件符合后休眠,这里是sys.wait只是演示业务执行
  46. sys.wait(3000)
  47. -- 先演示LIGHT模式休眠, RAM不掉电, IO保持, 唤醒后代码继续跑
  48. -- 设置休眠时长
  49. log.info("pm", "轻休眠15秒", "要么rtc唤醒,要么wakeup唤醒", "RAM不掉电")
  50. log.info("rtc", json.encode(rtc.get()))
  51. pm.dtimerStart(0, 15000)
  52. pm.request(pm.LIGHT)
  53. -- 后面的语句, 正常情况下会在15000ms后执行
  54. log.info("pm", "轻睡眠唤醒", "代码继续跑")
  55. -- 这里等待3000ms,模拟业务执行,期间gpio的闪灯task将继续运行
  56. log.info("rtc", json.encode(rtc.get()))
  57. sys.wait(3000)
  58. -- 测试一下RTC唤醒
  59. local t = rtc.get()
  60. if t.sec < 30 then
  61. log.info("rtc", "轻唤醒测试", "5秒后唤醒")
  62. t.sec = t.sec + 5
  63. rtc.timerStart(0, t)
  64. pm.request(pm.LIGHT)
  65. log.info("rtc", "轻唤醒测试", "唤醒成功")
  66. -- RTC深度休眠+唤醒
  67. -- t.sec = t.sec + 5
  68. -- rtc.timerStart(0, t)
  69. -- log.info("rtc", "深唤醒测试", "5秒后唤醒")
  70. -- pm.request(pm.DEEP)
  71. end
  72. -- 接着演示 DEEP模式休眠, RAM掉电, IO失效, 唤醒相当于复位重启
  73. -- 因为已经唤醒过,dtimer已经失效, 重新设置一个
  74. log.info("rtc", json.encode(rtc.get()))
  75. log.info("pm", "深休眠5秒", "要么rtc唤醒,要么wakeup唤醒", "RAM掉电")
  76. pm.dtimerStart(0, 5000)
  77. pm.request(pm.DEEP)
  78. -- 后面代码都不会执行, 如果执行了, 那100%是wakeup电平有问题
  79. log.info("pm", "这里的代码不会被执行")
  80. log.info("rtc", json.encode(rtc.get()))
  81. end)
  82. -- 用户代码已结束---------------------------------------------
  83. -- 结尾总是这一句
  84. sys.run()
  85. -- sys.run()之后后面不要加任何语句!!!!!