跳转至

gpio

一、780EPM GPIO 概述

780EPM 有 38 个 GPIO,分别是 GPIO1 - GPIO38。

这 38 个 GPIO 里面, 有 9 个 GPIO 在深度休眠的时候, 是输出受控的,称为 AGPIO, 这 9 个 GPIO 是 从 GPIO20 到 GPIO28;

另外 29 个在深度休眠的时候是不受控的,称为 普通 GPIO。

GPIO 16,17,18,19 这四个 GPIO,可以复用到不同的管脚,其他的 34 个 GPIO, 只能在同一个管脚使用,具体可以参考 780EPM 的管脚复用表:

管脚复用表

二、780EPM GPIO API 说明

780EPM GPIO 库实现的各个 API,是用在 GPIO 单个管脚工作,不和其他的管脚配合使用时候的操作 API。

2.1 常量

LuatOS 的 GPIO 库中定义了一些常量,用于指定管脚的工作模式、中断触发类型以及上拉/下拉配置等。这些常量在使用相关 API 时作为参数传递,具体含义如下:

常量
类型
解释
gpio.NONE
number
无效引脚,一般用于告诉底层某功能引脚不指定
gpio.LOW
number
低电平
gpio.HIGH
number
高电平
gpio.PULLUP
number
上拉
gpio.PULLDOWN
number
下拉
gpio.RISING
number
上升沿触发
gpio.FALLING
number
下降沿触发
gpio.BOTH
number
双向触发,部分设备支持
gpio.HIGH_IRQ
number
高电平触发,部分设备支持
gpio.LOW_IRQ
number
低电平触发,部分设备支持
gpio.WAKEUP0
number
WAKEUP_PAD
gpio.WAKEUP1
number
WAKEUP_PAD
gpio.WAKEUP2
number
WAKEUP_PAD
gpio.WAKEUP3
number
WAKEUP_PAD
gpio.WAKEUP4
number
WAKEUP_PAD
gpio.WAKEUP5
number
WAKEUP_PAD
gpio.CHG_DET
number
WAKEUP_PAD
gpio.PWR_KEY
number
WAKEUP_PAD

2.2 API 函数列表和使用解释

2.2.1 gpio.setup(pin, mode, pull, irq_type, alt)

该函数用于 GPIO 使用前的初始化,把 GPIO 设置为输入模式,输出模式,是否配中断处理。

参数说明:

名称
传入值类型
解释
pin
int
pin gpio编号, 必须是整数值
mode
any
(1)数字0和1代表GPIO设置为推挽输出模式,0 和 1 是设置的初始值,0 是低电平,1是高电平;
(2)nil 代表 GPIO 设置为输入模式;
(3)function 代表 GPIO 设置为中断模式;
(4)如果填 gpio.count,则为中断计数功能,中断时不回调。
pull
int
(1)本参数是设置 GPIO 的内部上拉下拉,只在mode参数设置为为输入模式下有效。
(2)本参数只能设置为三个值之一:gpio.PULLUP, 代表默认启用内部上拉,初始值为高电平;gpio.PULLDOWN,代表启用内部下拉,初始值为低电平;nil: 代表浮空输入,初始值不确定。
irq_type
int
(1)该参数为中断触发模式, 只在mode参数设置为中断模式的时候有效。
(2)该参数只能取如下三个常量之一:上升沿: gpio.RISING下降沿: gpio.FALLING上升和下降都触发: gpio.BOTH。如果该值为nil,则默认为 gpio.BOTH
alt
int
该参数固定设置为nil

返回值

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

说明:

1,该函数只能设置三种模式:

(1)输入,

(2)输入 + 中断,

(3)推挽输出。

不能设置开漏输出模式。

2, pull 参数,只在输入和中断模式下有效,在输出模式下,pull 参数无效;

3,alt 参数为历史原因,保留在这里,但是取任何值都是当做 nil 处理。

例子

-- 设置gpio17为浮空输入
gpio.setup(17, nil)

-- 设置gpio17为输入,初始电平为高
gpio.setup(17, nil, gpio.PULLUP)

-- 设置gpio17为输出,且初始化电平为低
gpio.setup(17, 0)

-- 设置gpio27为中断, 初始电平为高,默认双向触发
gpio.setup(27, function(val,io_num)
    print("io",io_num,val)
    -- 提醒, val并不代表触发方向,
    --仅代表中断后某个时间点的电平, io_num是IO序号
end, gpio.PULLUP)

-- 设置gpio27为中断,  初始电平为低,仅上升沿触发
gpio.setup(27, function(val)
    print("IRQ_27",val)
    -- 提醒, val并不代表触发方向,
    --仅代表中断后某个时间点的电平
end, gpio.PULLDOWN, gpio.RISING)

-- 中断计数 于2024.5.8新增
-- 设置gpio7为中断计数,详细demo见gpio/gpio_irq_count
gpio.setup(7, gpio.count)

2.2.2 gpio.close(pin)

关闭管脚功能。

调用该函数后,该 GPIO 进入高阻态, 同时关闭中断。

参数

名称
传入值类型
解释
pin
int
GPIO编号,必须是数值

返回值

返回值类型
解释
nil
无返回值,总是执行成功

例子

-- 关闭gpio17

gpio.close(17)

2.2.3 gpio.set(pin, value)

设置管脚电平。

该函数只在 GPIO 处于输出模式下有效。

参数

名称
传入值类型
解释
pin
int
GPIO编号,必须是数值
value
int
设置的GPIO电平, 可以是 高电平gpio.HIGH, 低电平gpio.LOW, 或者直接写数值1或0,1是高电平,0是低电平

返回值

返回值类型
解释
nil
无返回值

例子

-- 设置gpio17为低电平
gpio.set(17, 0)

2.2.4 gpio.get(pin)

获取管脚电平。

该函数在 GPIO 为输入和输出模式模式下都有效

参数

名称
传入值类型
解释
pin
int
GPIO编号,必须是数值

返回值

返回值类型
解释
value
电平, 高电平gpio.HIGH, 低电平gpio.LOW, 对应数值1和0

例子

-- 获取gpio17的当前电平gpio.get(17)

2.2.5 gpio.caplevel(pin, level,func)

捕获管脚电平持续时长,单位 us

参数

名称
传入值类型
解释
pin
int
GPIO编号,必须是数值
level
int
需要捕获的电平, 可以是 高电平gpio.HIGH, 低电平gpio.LOW, 或者直接写数值1或0,即管脚上正常时间处于level的反,捕获设定的level持续时间
func
function
完成捕获后的回调函数,仅一个参数,参数为捕获到的时间长度number型数值,单位us

返回值

返回值类型
解释
any
返回获取电平的闭包

例子

-- 捕获pin.PA07为高电平的持续时间
gpio.caplevel(pin.PA07,1,function(val) print(val) end)

2.2.6 gpio.toggle(pin)

变换 GPIO 脚输出电平,仅输出模式可用

参数

名称
传入值类型
解释
pin
int
管脚的GPIO号

返回值

返回值类型
解释
nil
无返回值

例子

-- 本API于 2022.05.17 添加-- 假设GPIO16上有LED,
-- 每500ms切换一次开关

gpio.setup(16, 0)
sys.timerLoopStart(function()
gpio.toggle(16)
end, 500)

2.2.7 gpio.pulse(pin,level,len,delay)

在同一个 GPIO 输出一组脉冲, 注意, len 的单位是 bit, 高位在前.

参数

名称
传入值类型
解释
pin
int
gpio号
level
int/string
数值或者字符串.
len
int
长度 单位是bit, 高位在前.
delay
int
delay 延迟,当前无固定时间单位

返回值

返回值类型
解释
nil
无返回值

例子

-- 通过PB06脚输出输出8个电平变化.
gpio.pulse(pin.PB06,0xA9, 8, 0)

2.2.8 gpio.debounce(pin, ms, mode)

防抖设置, 根据硬件 ticks 进行防抖

参数

名称
传入值类型
解释
pin
int
gpio号, 0~127, 与硬件相关
ms
int
防抖时长,单位毫秒, 最大 65555 ms, 设置为0则关闭
mode
int
模式, 0冷却模式, 1延时模式. 默认是0

返回值

返回值类型
解释
nil
无返回值

例子

-- 消抖模式, 当前支持2种, 2022.12.16开始支持mode=1
-- 0 触发中断后,马上上报一次, 然后冷却N个毫秒后,重新接受中断
-- 1 触发中断后,延迟N个毫秒,期间没有新中断且电平没有变化,上报一次
-- 开启防抖, 模式0-冷却, 中断后马上上报, 但100ms内只上报一次

gpio.debounce(7, 100)
-- 若芯片支持pin库, 可用pin.PA7代替数字7
-- 开启防抖, 模式1-延时, 中断后等待100ms,期间若保持该电平了,
-- 时间到之后上报一次
-- 对应的,如果输入的是一个 50hz的方波,那么不会触发任何上报
gpio.debounce(7, 100, 1)

-- 关闭防抖,时间设置为0就关闭
gpio.debounce(7, 0)

2.2.9 gpio.count(pin)

获取 gpio 中断数量,并清空累计值,类似 air724 的脉冲计数

参数

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

返回值

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

例子

log.info("irq cnt", gpio.count(10))

三、780EPM GPIO 实际开发详细教程

780EPM 的实际开发教程,在如下链接:

GPIO 实际开发详细教程

如果你对 GPIO 已经非常熟悉,可以忽略如上教程。

如果你对 780EPM 的 GPIO 开发还比较陌生,阅读上面的教程,会让你快速建立 780EPM 的 GPIO 开发的技能。

四、780EPM GPIO 的硬件电路设计说明

780EPM 的 GPIO 的电路设计说明,请参考如下链接:

GPIO 的电路设计说明

五、给新手的 GPIO 普及文档

如下内容,是给新手开发者阅读的。

如果你已经熟练掌握嵌入式开发,可以忽略下面的内容。

给合宙用户看的 GPIO 通用教程