AIR103|GPIO_button|debounce防抖|LuatOS-SOC接口|官方demo|学习(20-3):GPIO_button

基础资料

基于Air103开发板:🚗 Air103 - LuatOS 文档

上手:开发上手 - 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)

6、LOG:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打酱油的工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值