基础资料
基于Air103开发板:🚗 Air103 - LuatOS 文档
探讨重点
对官方社区库接口GPIO库使用及示例进行复现及分析,了解该的基本原理及操作方法。
软件及工具版本
LuatOS@AIR103 base 22.12 bsp V0016 32bit
硬件准备
Air103开发板1块,按键开关,LED(红),面包板各一个,导线若干。
参考:AIR系列|板载LED|gpio引脚选择|GPIO|流水灯|LuatOS-SOC接口|官方demo|学习(20-1):GPIO库基础_打酱油的工程师的博客-CSDN博客
基于air103开发板接线:
执行效果:
中断函数执行时,led灯亮作为指示,且调试软件中打印“gpio CTR_PIN”。
[2023-02-28 23:31:06.451] I/main LuatOS@AIR103 base 22.12 bsp V0016 32bit
[2023-02-28 23:31:06.451] I/main ROM Build: Feb 12 2023 22:01:50
[2023-02-28 23:31:06.451] D/main loadlibs luavm 180208 11584 12264
[2023-02-28 23:31:06.451] D/main loadlibs sys 12288 4720 4720
[2023-02-28 23:31:06.451] I/user.main gpio2demo 1.0.0
[2023-02-28 23:31:06.480] I/user.gpio_setup 1
[2023-02-28 23:31:07.847] I/user.gpio CTR_PIN
[2023-02-28 23:31:14.667] I/user.gpio CTR_PIN
[2023-02-28 23:31:24.649] I/user.gpio CTR_PIN
[2023-02-28 23:31:26.067] I/user.gpio CTR_PIN
[2023-02-28 23:31:29.482] I/user.gpio CTR_PIN
GPIO irqdemo程序分析:
1、设置防抖
-- 消抖模式, 当前支持2种, 2022.12.16开始支持mode=1
-- 0 触发中断后,马上上报一次, 然后冷却N个毫秒后,重新接受中断
-- 1 触发中断后,延迟N个毫秒,期间没有新中断且电平没有变化,上报一次
-- 开启防抖, 模式0-冷却, 中断后马上上报, 但100ms内只上报一次
--gpio.debounce(pin, ms, mode)
if gpio.debounce then
gpio.debounce(CTR_PIN, 50)
end
2、将gpio配制成function模式(中断模式)
result=gpio.setup(CTR_PIN, function()
log.info("gpio", "CTR_PIN")
end, gpio.PULLUP) --gpio.PULLUP时,短接GND和CTR_PIN,CTR_PIN相对于GND处于高位(拉高),触发中断执行function
--gpio.PULLDOWN时,短接3.3V和CTR_PIN,CTR_PIN相对于3.3V处于低位(拉低),触发中断执行function
3、gpio.setup的返回值读取
log.info("gpio_setup",result())
4、基于官方demo修改的完整用例:
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "gpio2demo"
VERSION = "1.0.0"
log.info("main", PROJECT, VERSION)
-- sys库是标配
_G.sys = require("sys")
if wdt then
--添加硬狗防止程序卡死,在支持的设备上启用这个功能
wdt.init(9000)--初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
local CTR_PIN = pin.PB14 -- 按实际开发板选取
-- 消抖模式, 当前支持2种, 2022.12.16开始支持mode=1
-- 0 触发中断后,马上上报一次, 然后冷却N个毫秒后,重新接受中断
-- 1 触发中断后,延迟N个毫秒,期间没有新中断且电平没有变化,上报一次
-- 开启防抖, 模式0-冷却, 中断后马上上报, 但100ms内只上报一次
--gpio.debounce(pin, ms, mode)
if gpio.debounce then
gpio.debounce(CTR_PIN, 50)
end
--配置PB14(gpio30)为输入模式,下拉,并会触发中断
--请根据实际需求更改gpio编号和上下拉
--gpio.setup(pin, mode, pull, irq), pull及irq可省略,
result=gpio.setup(CTR_PIN, function()
log.info("gpio", "CTR_PIN")
end, gpio.PULLUP) --gpio.PULLUP时,短接GND和CTR_PIN,CTR_PIN相对于GND处于高位(拉高),触发中断执行function
--gpio.PULLDOWN时,短接3.3V和CTR_PIN,CTR_PIN相对于3.3V处于低位(拉低),触发中断执行function
log.info("gpio_setup",result())
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
5、LOG: