跳转至

中断模式

中断简介:

    当GPIO检测到电平变化且满足触发条件时,触发中断,CPU就会暂停当前任务,执行中断回调函数中的内容,当中断回调函数中的内容执行完毕时,再继续执行之前没有执行完的任务。
    除了中断回调方式,还有中断计数模式。中断计数模式时,中断时不回调

实现方式

    gpio.set()函数中介绍,当传入的第二个参数是回调函数或gpio.count时,代表中断功能。然后通过设置第三个参数和第四个参数,来确定中断触发的方式。

gpio.setup(pin, mode, pull, irq, alt)

设置管脚功能

参数

传入值类型 解释
int pin gpio编号,必须是数值
any mode 输入输出模式: 数字0/1代表输出模式 nil代表输入模式 function代表中断模式,如果填gpio.count,则为中断计数功能,中断时不回调
int pull 上拉下拉模式, 可以是上拉模式 gpio.PULLUP 或下拉模式 gpio.PULLDOWN, 或者开漏模式 0. 需要根据实际硬件选用
int irq 中断触发模式,默认gpio.BOTH。中断触发模式 上升沿gpio.RISING 下降沿gpio.FALLING 上升和下降都触发gpio.BOTH
int alt 复用选项,目前只有EC618平台需要这个参数,有些GPIO可以复用到不同引脚上,可以选择复用选项(0或者4)从而复用到对应的引脚上

返回值

返回值类型 解释
any 输出模式返回设置电平的闭包, 输入模式和中断模式返回获取电平的闭包

gpio.count(pin)

获取gpio中断数量,并清空累计值

参数

传入值类型 解释
int gpio号, 0~127, 与硬件相关

返回值

返回值类型 解释
int 返回从上次获取中断数量后到当前的中断计数

demo示例

此demo实现了检测中断触发次数。

硬件上我们需要找到IO24(PWM通道1),然后将IO7与IO24连接起来:

aa

源demo地址:gpio_count_irq

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

--配置gpio7为输入模式,下拉,并会触发中断
--请根据实际需求更改gpio编号和上下拉
local gpio_pin = 7
gpio.setup(gpio_pin, gpio.count, gpio.PULLUP, gpio.FALLING)
pwm.open(1,2000,50) --2k 50%占空比作为触发源
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.taskInit(function()
    while true do
        sys.wait(999)
        log.info("irq cnt", gpio.count(gpio_pin))
    end
end)
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

效果展示

每秒获取一次中断触发次数。

aa