跳转至

GPIO

一、GPIO 概述

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

二、演示功能概述

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

三、准备硬件环境

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

3.1 Air201模组

本次使用的开发板为 Air201模组,如下图所示:

点击链接购买:合宙Air201模组淘宝购买链接

此模组的详细使用说明参考:Air201 产品手册

3.2 SIM 卡

请准备一张可正常上网的 SIM 卡,该卡可以是物联网卡或您的个人手机卡。

特别提醒:请确保 SIM 卡未欠费且网络功能正常,以便顺利进行后续操作。

3.3 PC 电脑

请准备一台配备 USB 接口且能够正常上网的电脑。

电脑操作系统为:WIN10以及以上版本的WINDOWS系统。

3.4 数据通信线

请准备一根用于连接 Air201模组和 PC 电脑的数据线,该数据线将实现业务逻辑的控制与交互。

  • USB 数据线(其一端为 Type-C 接口,用于连接 Air201模组)。通常,这种数据线的外观如下示意图所示:

普通的手机 USB 数据线一般都可以直接使用;

在本教程中,我们将采用 USB 数据线配置进行测试和数据查看:

  • USB 数据线:此数据线不仅用于为测试板供电,还用于查看数据日志。其一端为 Type-C 接口,连接 Air201模组;另一端为标准 USB 接口,连接 PC 电脑。

3.5 组装硬件环境

3.5.1 请按照 SIM 卡槽上的指示方向正确插入 SIM 卡,务必确保插入方向正确,避免插反导致损坏!

通常,插入 SIM 卡的步骤如下:

  • 将 SIM 卡的金属接触面朝下,对准卡槽的开口。
  • 用力平稳地将 SIM 卡推入卡槽,直至推到最底部,表示 SIM 卡已正确安装到位。

3.5.2 USB 数据线,连接电脑和 Air201模组,如下图所示:

四、GPIO 软硬件参考

4.1 API 接口介绍

本教程使用 api 接口为:

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

4.2 GPIO 硬件设计

4.2.1 GPIO 复用表

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

五、准备软件环境

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

5.1 Luatools 工具

要想烧录 LuatOS 固件到 4G 模组中,需要用到合宙的强大的调试工具:Luatools;

下载地址:Luatools v3 下载调试工具

Luatools 工具集具备以下几大核心功能:

  • 一键获取最新固件:自动连接合宙服务器,轻松下载最新的合宙模组固件。
  • 固件与脚本烧录:便捷地将固件及脚本文件烧录至目标模组中。
  • 串口日志管理:实时查看模组通过串口输出的日志信息,并支持保存功能。
  • 串口调试助手:提供简洁的串口调试界面,满足基本的串口通信测试需求。

Luatools 下载之后, 无需安装, 解压到你的硬盘,点击 Luatools_v3.exe 运行,出现如下界面,就代表 Luatools 安装成功了:

5.2 烧录代码

首先要说明一点: 脚本代码, 要和固件的LuatOS-SoC_V2002_Air201.soc 文件一起烧录。

5.2.1 找到烧录的固件文件

官网下载,底层 core 下载地址:LuatOS 底层 core 注:本demo使用如图所示固件

5.2.2 脚本文件

脚本demo 下载地址: https://gitee.com/openLuat/LuatOS-Air201/tree/master/demo/gpio

5.2.3 正确连接电脑和 4G 模组电路板

使用带有数据通信功能的数据线,不要使用仅有充电功能的数据线;

5.2.4 识别 4G 模组的 BOOT 引脚

Air201进入boot下载模式,烧录固件和程序,需要将预留的测试点(Air201板子 B面图) 的BOOT 上拉到vdd_ext(A面USB旁边),之后上电开机,即可进入下载模式,下载完程序后将boot脚悬空。

Air201板子 A面图

Air201板子 B面图

5.2.5 识别电脑的正确端口

判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:

5.2.6 创建项目并烧录

首先,确保你的 Luatools 的版本大于或者等于 3.0.6 版本.

Luatools 版本没问题的话, 就点击 Luatools 右上角的“项目管理测试”按钮,如下图所示:

创建项目

点击下载后,我们需要进入 BOOT 模式才能正常下载。

下载成功

六、GPIO 简介

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

Air201及其系列模组,有两种 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

local gpio_number = 1

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

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

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

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

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

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

6.2.2 硬件连接

本文使用的是 Air201 扩展板,需要准备一根杜邦线将扩展板上的 GPIO5 引脚(即com_pwdn管脚)在悬空和 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

-- 配置gpio5为中断模式,上升沿(gpio.RISING)和下降沿(gpio.FALLING)均触发(gpio.BOTH)
-- 请根据实际需求更改gpio编号和触发模式
local gpio_pin = 5
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 硬件链接

本文使用的是 Air201 扩展板,需要准备一根杜邦线将扩展板上的 GPIO5 引脚(即com_pwdn管脚)在悬空和 GND 引脚中间切换起来。

6.3.3 示例效果展示

6.3.4 中断模式(计数)简介

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

6.3.5 硬件链接

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

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

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

6.3.6 示例效果展示

示例 demo 链接

七、常见问题

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

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

7.1.1 IO 复用简介

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

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

参考文档:GPIO 复用说明

Air780EPS 引脚 table