跳转至

GPIO

一、GPIO 概述

gpio 是通用型输入输出的简称,一个 gpio 引脚可以用于输入、输出或其他特殊功能。

二、演示功能概述

本文将介绍 Air780EP gpio 的输入与输出 demo 讲解与效果演示。

三、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools工具

2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件

3. luatos需要的脚本和资源文件

脚本和资源文件点我浏览所有文件

lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。

五、GPIO 软硬件参考

5.1 API 接口介绍

本教程使用 api 接口为:

https://docs.openluat.com/Air780EP/luatos/api/core/gpio/

5.2 GPIO 硬件设计

5.2.1 GPIO 复用表

!!!一定要仔细阅读这里的GPIO使用注意事项!!!

六、GPIO 简介

认识模块 GPIO 管脚:Air780EP 模块的 gpio 与其他 MCU 类的芯片一样,也可以配置为输入/输出/上拉/下拉/中断等状态,只有在硬件设计手册上注明带 GPIO 功能的管脚才能作为 GPIO 使用。

Air780EP 及其系列模组,有两种 GPIO,一种叫做普通 GPIO,一种叫做 AGPIO

下面是普通 GPIO 和 AGPIO 的区别


休眠后状态
驱动能力
输入输出
中断
普通 GPIO
掉电且伴随网络状态可能会有不定周期的波动
单个 <10mA
总计 <200mA
支持
支持
AGPIO
保持原设置状态

单个 <5mA
总计 <5mA
支持
支持

6.2 输出模式简介

GPIO 的输出模式是指将 GPIO 配置为向外界输出高低电平的模式。

6.2.1 输出模式示例

输出模式测试 demo

这里粘贴的代码相比较 demo 中删减了一些判断板子型号的功能,更加精简,最终效果还是一样的。

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "gpiodemo"
VERSION = "1.0.1"

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

-- Air780EP的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
    pm.power(pm.PWK_MODE, false)
end

local gpio_number = 27

LED = gpio.setup(gpio_number, 1)

sys.taskInit(function()
    -- 开始呼吸灯
    local count = 0
    while 1 do
        -- 呼吸灯程序
        LED(1)
        log.info("GPIO", "Go Go Go", count, rtos.bsp())
        sys.wait(500)--点亮时间 500ms
        LED(0)
        sys.wait(500)--熄灭时间 500ms
        count = count + 1
    end
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.2.2 示例效果展示:

每隔 1 秒亮 0.5 秒。

6.2 输入模式简介

GPIO 的输入模式是指将 GPIO 配置为接收外部信号的模式。

6.2.1 输入模式测试 demo

输入模式测试 demo

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "gpio_irq"
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

-- 配置gpio24为输入模式
-- 配置GPIO27(即开发板上LED灯)为输出模式

-- 请根据实际需求更改gpio编号和上下拉
local inputpin = 24
local ledpin = 27

local input = gpio.setup(inputpin,nil)
local led = gpio.setup(ledpin, 1)

--GPIO24检测到有高低电平输入后,会返回GPIO24当前获取到的电平为高还是低,高返回值为1,低返回值为0
--将这个返回值,传给GPIO27(LED),为0 则GPIO27输出低电平(LED灯灭),为1则输出高电平(LED灯亮)
sys.taskInit(function ()
    while true do
        led(input())
        sys.wait(50)
    end
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.2.2 硬件连接

本文使用的是 Air780EP 核心板,需要准备一根杜邦线将开发板上的 RI 引脚(即下图标明的 18 脚)在 GND/3.3V 引脚中间切换起来(模块的屏蔽盖也是 GND)。

6.2.3 示例效果展示

6.3 中断模式简介

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

除了中断回调方式,还有中断计数模式。中断计数模式时,中断时不回调

6.3.1 中断模式(触发)测试 demo

测试 demo 链接

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "gpio_irq"
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

-- 配置gpio24为中断模式,上升沿(gpio.RISING)和下降沿(gpio.FALLING)均触发(gpio.BOTH)
-- 请根据实际需求更改gpio编号和触发模式
local gpio_pin = 24
gpio.debounce(gpio_pin, 100)
gpio.setup(gpio_pin, function()
    log.info("gpio", gpio_pin, "被触发")
end, gpio.PULLUP, gpio.BOTH)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.3.2 硬件链接

将下图中的 18 脚也就是 GPIO24,在红框的 GND 和 3.3V 之间来回切换,即可在日志中看到打印

6.3.3 示例效果展示

6.3.4 中断模式(计数)简介

中断计数模式时,中断时不回调,中断结束后打印来的中断次数(高低电平变化次数)

6.3.5 硬件链接

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

硬件上我们需要找到 GPIO24 和 GPIO27(PWM 通道 4,如下图所示),然后将 PWM4 与 GPIO24 连接起来

通过 PWM4 输出中断(高低电平变化的方波),再通过 GPIO24 统计输出的中断数。

6.3.6 示例效果展示

示例 demo 链接

6.4 AGPIO 简介

AGPIO 管脚休眠模式下可保持,保持高或低(由用户自行决定)。

AONGPIO 输出驱动能力单管脚:可以复用为 WAKEUP3/WAKEUP4/WAKEUP5 的前三个 AONGPIO<=30uA,其余 AONGPIO<=5mA;所有 AONGPIO 驱动电流总和也不能超过 5mA

AGPIO3 芯片内部本身是默认拉低的,AT 固件当前是通过软件开机初始改为拉高

6.4.1 AGPIO 测试 demo

AGPIO 测试 demo 链接

-- 本示例对比了普通GPIO和AGPIO的进入休眠模式前后的区别。
-- 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

local gpio_number = 11 -- 普通GPIO GPIO号为11,休眠后掉电
local Agpio_number = 27 -- AGPIO GPIO号为27,也是核心板上的绿灯,休眠后可保持电平(休眠后绿灯常亮)

gpio.setup(gpio_number, 1)
gpio.setup(Agpio_number, 1)

sys.taskInit(function()
    sys.wait(8000)
    -- 关闭USB电源
    -- pm.power(pm.USB, false)
    -- 进入低功耗模式
    pm.power(pm.WORK_MODE, 3)

end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.4.2 硬件链接

由于核心板上有多个元器件影响模块休眠,其中最影响休眠的器件为 USB 下方的 DCDC,所以测试前,需要将 USB 下方的 DCDC 拆掉,VBUS 会阻止模块休眠,所以供电不能走 USB 供了,需要走最上方的 5V 脚供电,这个 5V 脚实际接的是模块的 VBAT,丝印有误,不能直接接 5V,需要接 4.2V-3.3V 的电源(本文采用的是 Air9000P 手持电源)。

6.4.3 示例效果展示

普通 GPIO11 测试为 0V,而 GPIO27(AGPIO/灯)正常输出高电平(绿灯常亮)

6.5 IO 翻转速度简介

IO 翻转速度即 IO 电平变化一次所需的时间

6.5.1 IO 翻转测试 demo

测试 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

-- Air780EP的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
    pm.power(pm.PWK_MODE, false)
end

local test_gpio_number = 27

gpio.setup(test_gpio_number, 0, gpio.PULLUP)

sys.taskInit(function()
    sys.wait(100)
    while true do
        sys.wait(100)
        -- 通过GPIO27脚输出输出8组电平变化
        -- 0xA9就是输出的电平高低状态,即 0000000010101001
        gpio.pulse(test_gpio_number, 0xA9, 8, 0)
        log.info("gpio----------->pulse2")
    end
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.5.2 硬件链接

将 GPIO27 链接到示波器上即可

6.5.3 示例效果展示

由下图测试可知,翻转一次所需时间大概 100ns

6.6 Air780EP 所有 GPIO 初始化电平高低表

GPIO口 实测状态 波形图 备注
GPIO1 图1
GPIO2 图1
GPIO3 图1
GPIO4 图2
GPIO5 图3
GPIO6 图4
GPIO7 图1
GPIO14 图1
GPIO15 图1
GPIO18 图5
GPIO19 图5
GPIO29 图1
GPIO30 图1
GPIO31 图1
GPIO32 图1
GPIO33 图1
GPIO34 图1
GPIO35 图1
GPIO36 图1
GPIO37 图1
GPIO38 图1
GPIO24 图1
GPIO25 图1
GPIO26 图1
GPIO27 图1
GPIO28 图1
GPIO20 图1
GPIO21 图1
GPIO22 图1

图1 图2 图3 图4 图5

七、常见问题

7.1 如果我不需要 UART2 ,能将对应引脚复用为 GPIO 吗?

答:可以,但是有限制,详细可以看下面的讲述

7.1.1 IO 复用简介

由于固件特性的存在, LuatOS 的 io 复用默认是固定的, 通过 mcu.iomux 函数可以部分修改映射.

不同模块的外部管脚布局不一样, 但 PAD(paddr)值是一致的, 要对应 “PIN/GPIO 对应表格” 文档, 该文档可以在此处找到

由于芯片的引脚少,存在大量复用的场景,有很多功能是会冲突的。

7.1.2 Air780EP 复用参考文档

参考文档:GPIO 复用说明

Air780EP 引脚 table

读者的话

本篇文章由 黄何 开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请先登录合宙技术交流论坛,然后点击右边链接文档找错赢奖金--Air780EP-LuatOS-软件指南-硬件驱动-GPIO

用截图标注 + 文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!