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 已经非常熟悉,可以忽略如上教程。
如果你对 780EPM 的 GPIO 开发还比较陌生,阅读上面的教程,会让你快速建立 780EPM 的 GPIO 开发的技能。
四、780EPM GPIO 的硬件电路设计说明
780EPM 的 GPIO 的电路设计说明,请参考如下链接:
五、给新手的 GPIO 普及文档
如下内容,是给新手开发者阅读的。
如果你已经熟练掌握嵌入式开发,可以忽略下面的内容。