基础资料
基于Air103开发板:🚗 Air103 - LuatOS 文档
探讨重点
对官方社区库接口GPIO库使用及示例进行复现及分析,了解该的基本原理及操作方法。
软件及工具版本
LuatOS@AIR103 base 22.12 bsp V0016 32bit
硬件准备
Air103开发板1块,按键开关,面包板各一个,导线若干。
参考:AIR系列|板载LED|gpio引脚选择|GPIO|流水灯|LuatOS-SOC接口|官方demo|学习(20-1):GPIO库基础_打酱油的工程师的博客-CSDN博客
AIR103|gpio|gpio.debounce防抖|gpio.setup|LuatOS-SOC接口|官方demo|学习(20-2):GPIO_irq_打酱油的工程师的博客-CSDN博客基于air103开发板接线:
执行效果:
中断函数执行时,板载LEDB灯亮作为指示,且调试软件中打印“pass”(点动)或“long pass”(连动)。
[2023-03-01 00:14:55.567] I/main LuatOS@AIR103 base 22.12 bsp V0016 32bit
[2023-03-01 00:14:55.567] I/main ROM Build: Feb 12 2023 22:01:50
[2023-03-01 00:14:55.567] D/main loadlibs luavm 180208 11584 12264
[2023-03-01 00:14:55.567] D/main loadlibs sys 12288 4720 4720
[2023-03-01 00:14:55.567] I/user.main gpio2demo 1.0.0
[2023-03-01 00:14:57.959] pass
[2023-03-01 00:15:00.137] pass
[2023-03-01 00:15:01.333] pass
[2023-03-01 00:15:03.080] long pass
[2023-03-01 00:15:03.112] long pass
[2023-03-01 00:15:03.116] long pass
[2023-03-01 00:15:03.116] long pass
[2023-03-01 00:15:03.142] long pass
[2023-03-01 00:15:03.144] long pass
[2023-03-01 00:15:03.144] long pass
[2023-03-01 00:15:03.173] long pass
[2023-03-01 00:15:03.176] long pass
[2023-03-01 00:15:03.176] long pass
GPIO_button-demo程序分析:
1、初始化
local button_timer_outtime = 10 --按键定时器: 10ms
local button_shake_time = 1 --按键消抖时间: button_shake_time*button_timer_outtime
local button_long_time = 100 --按键长按时间: button_long_time*button_timer_outtime
local LEDA= gpio.setup(42, 0, gpio.PULLUP)
local LEDB= gpio.setup(41, 0, gpio.PULLDOWN)
local LEDC= gpio.setup(40, 0, gpio.PULLUP)
local button_detect = true
local button_state = false
local button_cont = 0
local BTN_PIN = pin.PB14 -- 按实际开发板选取
2、按键防抖
if gpio.debounce then
gpio.debounce(BTN_PIN, 100)
else
log.info("not support gpio.debounce!")
end
3、button设置
将gpio配制成function模式(中断模式)
--输出模式返回设置电平的闭包, 输入模式和中断模式返回获取电平的闭包
button = gpio.setup(BTN_PIN, function()
if not button_detect then return end
button_detect = false
button_state = true
LEDB(1)
end,
gpio.PULLUP,
gpio.FALLING)
4、sys.timerLoopStart
--function代表中断模式,button()获取返回值
button_timer = sys.timerLoopStart(function()
if button_state then
if button() == 0 then
button_cont = button_cont + 1
if button_cont > button_long_time then
print("long pass")
LEDB(0)
end
else
if button_cont < button_shake_time then
else
if button_cont < button_long_time then
print("pass")
else
print("long pass")
end
end
LEDB(0)
button_cont = 0
button_state = false --
button_detect = true --
end
end
end,button_timer_outtime)
5、基于官方demo修改的用例:
local button_timer_outtime = 10 --按键定时器: 10ms
local button_shake_time = 1 --按键消抖时间: button_shake_time*button_timer_outtime
local button_long_time = 100 --按键长按时间: button_long_time*button_timer_outtime
local LEDA= gpio.setup(42, 0, gpio.PULLUP)
local LEDB= gpio.setup(41, 0, gpio.PULLDOWN)
local LEDC= gpio.setup(40, 0, gpio.PULLUP)
local button_detect = true
local button_state = false
local button_cont = 0
local BTN_PIN = pin.PB14 -- 按实际开发板选取
-- 若固件支持防抖, 启用防抖
--[[-- 消抖模式, 当前支持2种, 2022.12.16开始支持mode=1
-- 0 触发中断后,马上上报一次, 然后冷却N个毫秒后,重新接受中断
-- 1 触发中断后,延迟N个毫秒,期间没有新中断且电平没有变化,上报一次
-- 开启防抖, 模式0-冷却, 中断后马上上报, 但100ms内只上报一次
gpio.debounce(7, 100) -- 若芯片支持pin库, 可用pin.PAx代替数字7
-- 开启防抖, 模式1-延时, 中断后等待100ms,期间若保持该电平了,时间到之后上报一次
-- 对应的,如果输入的是一个 50hz的方波,那么不会触发任何上报
gpio.debounce(7, 100, 1)
-- 关闭防抖,时间设置为0就关闭
gpio.debounce(7, 0)]]
if gpio.debounce then
gpio.debounce(BTN_PIN, 100)
else
log.info("not support gpio.debounce!")
end
--输出模式返回设置电平的闭包, 输入模式和中断模式返回获取电平的闭包
button = gpio.setup(BTN_PIN, function()
if not button_detect then return end
button_detect = false
button_state = true
LEDB(1)
end,
gpio.PULLUP,
gpio.FALLING)
--function代表中断模式,button()获取返回值
button_timer = sys.timerLoopStart(function()
if button_state then
if button() == 0 then
button_cont = button_cont + 1
if button_cont > button_long_time then
print("long pass")
LEDB(0)
end
else
if button_cont < button_shake_time then
else
if button_cont < button_long_time then
print("pass")
else
print("long pass")
end
end
LEDB(0)
button_cont = 0
button_state = false --
button_detect = true --
end
end
end,button_timer_outtime)