跳转至

GPIO

一、GPIO 概述

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

二、演示功能概述

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

三、准备硬件环境

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

3.1 Air700ECQ 开发板

使用 Air700ECQ 开发板,如下图所示:

淘宝购买链接:Air700ECQ 开发板淘宝购买链接

此开发板的详细使用说明参考:Air700ECQ 产品手册 中的 《开发板EVB-Air700ECQ-IO使用手册VX.X.X.pdf》,写这篇文章时最新版本的使用说明为:开发板EVB-Air700ECQ-IO使用手册V1.0.0.pdf ;开发板使用过程中遇到任何问题,可以直接参考这份使用说明 pdf 文档。

3.2 SIM 卡

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

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

3.3 PC 电脑

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

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

3.4 数据通信线

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

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

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

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

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

3.5 组装硬件环境

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

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

  • 将 SIM 卡的金属接触面朝下,对准卡槽的开口。
  • 用力平稳地将 SIM 卡推入卡槽,直至听到“咔嚓”一声,表示 SIM 卡已正确安装到位。

3.5.2 USB 数据线,连接电脑和 Air700ECQ 开发板,如下图所示:

四、GPIO 软硬件参考

概述

本文所介绍的 GPIO 设计指导,都是针对 Air700ECQ 用于 LuatOS 开发方式时的一些注意事项,AT 指令开发版本不支持 GPIO 操作;

Air700ECQ 模块共支持 GPIO0~GPIO31 合计 32 个 GPIO 和 WAKEUP0~5 合计 6 个唤醒管脚,其中:

32 个 GPIO 口本身有多重复用功能,大家需要根据实际应用进行选择配置;

32 个 GPIO 中,又可分为普通 GPIO 和 AGPIO,在后面的表格中,会详细介绍这两种 GPIO 的定义和区别;

6 个 WAKEUP 管脚中,部分也可以配置为 GPIO 功能,在后面的表格中,也将详细介绍 WAKEUP 管脚的注意事项;

4.1 API 接口介绍

本教程使用 api 接口为:

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

4.2 GPIO 硬件设计

4.2.1 GPIO 复用表

https://docs.openluat.com/air700ecq/luatos/hardware/design/gpio/

4.2.2 GPIO 特性

Air700ECQ 的 GPIO 口根据不同的特性,可以分为三种类型:普通 IO,AGPIO, Wakeup IO;

不同特性的 GPIO,其驱动能力以及在低功耗模式/PSM+ 模式下的表现区别比较大,在使用这些特性的 GPIO 时尤其要注意;

AGPIO 也常被写作为 AONGPIO、AON_GPIO,以下均以 AGPIO 的写法进行描述;

  • 普通 IO

Air700ECQ 大部分管脚为普通 GPIO(上图 GPIO 复用表格中灰色底色的 IO);

Air700ECQ 系统为了在休眠模式下有极致的低功耗性能,会在模块进入休眠/深休眠模式时,关闭 GPIO 供电(VDD_EXT),因此会导致所有以 VDD_EXT 为电源域的 GPIO 会进入下电状态。因此在使用普通 GPIO 时,要尤其注意在休眠状态下 GPIO 的掉电状态对控制外设造成的误动作风险。

特性:

  • AGPIO

AGPIO 管脚为休眠可保持管脚(GPIO 复用表格中绿色底色 IO 管脚);

这类管脚电源域为长保持的 LDO_AONIO 电源(为内部电源,模块外部不可测量),这类电源在模块低功耗模式/PSM+ 下,仍然能够保持供电,因此 AGPIO 管脚在休眠状态下能够保持电平。AGPIO 管脚可以用于休眠状态下仍然需要保持工作状态的外设。

特性:

  • Wakeup IO Air700ECQ 包含 6 个特殊管脚 WAKEUP0~WAKEUP5, 此类型 IO 为中断唤醒管脚,能够在模块休眠状态下响应外部中断从而使模块退出休眠状态,因此这类 IO 管脚在休眠状态下也能保持供电; 注意:Wakeup IO 仅支持输入,不能配置为输出,且固定电平不可配置。

特性:

4.2.3 GPIO 应用注意事项

  • 普通 GPIO 以及相应的电压域 VDD_EXT 在休眠时会输出频繁百 ms 级别的高脉冲,极易导致连接的外设误动作。

原因:Air700ECQ 的休眠特性,VDD_EXT 在休眠状态下会关闭,但是 Air700ECQ 系统在休眠的整个时期内并不是一直保持稳定休眠状态,需要不定时唤醒起来与 4G 网络交互以保持网络连接,因此 VDD_EXT 会随着模块唤醒而打开。而大部分普通 GPIO 默认是 i&PU 状态,就会被 VDD_EXT 拉高,导致输出高脉冲。

设计建议: - 在一些需要休眠状态下正常工作的外设的控制(比如 LED 控制)不建议使用普通 GPIO,可以使用 AGPIO。 - 由于 AGPIO 数量有限,在必须用普通 GPIO 的情况下,可以在普通 GPIO 上做外接 10K 电阻下拉(如下图 R23),可以大幅减小休眠时输出的高脉冲幅值,使得减小到外设的高电平判别门限以下,也可以避免误动作的情况,但是相应的在某些情况下,会增加功耗,请根据实际情况酌情做出选择 - Wakeup IO 类型的 GPIO 不要用 VDD_EXT 或者普通 GPIO 上拉,会导致系统无法进入休眠。

原因:Air700ECQ 的休眠特性使得普通 GPIO 管脚和 VDD_EXT 会在休眠状态下输出高脉冲,会使得 Wakeup IO 收到中断而导致系统被唤醒,无法进入休眠模式。

设计建议: - 使用内部的上下拉; - Wakeup IO 类型的 GPIO 不要直接连接主控 MCU IO 管脚,会导致电平不一致而影响系统稳定性。

原因:Wakeup IO 管脚电平是 2V 左右,这个与大多数 MCU 的 IO 电平不匹配,而且 Wakeup IO 的供电为内部的 LDO_AON,而这个供电会给系统启动相关的部分供电,比如 reset 管脚,因此 Wakeup IO 上由于电平不匹配而导致的漏洞有可能会影响系统稳定性。

设计建议: - 使用二极管或者三极管来隔离(如下图)

五、准备软件环境

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

5.1 Luatools 工具

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

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

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

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

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

5.2 烧录代码

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

5.2.1 压缩文件:完整文件包

5.2.2 压缩包内部文件

文件夹一:Core 固件(底层文件)

文件夹二:AGPIO 测试脚本

文件夹三:GPIO 翻转测速脚本

文件夹四:GPIO 上拉下拉模式测试脚本

文件夹五:GPIO 输出模式测试脚本

文件夹六:GPIO 输入模式测试脚本

文件夹七:GPIO 中断(触发)模式测试脚本

文件夹八:GPIO 中断(计数)模式测试脚本

文件夹九:IO 复用测试脚本

5.2.3 找到烧录的固件文件

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

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

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

5.2.5 识别 4G 模组的 BOOT 引脚

在下载之前,要用模组的 BOOT 引脚触发下载, 也就是说,要把 4G 模组的 BOOT 引脚拉到 1.8v,或者直接把 BOOT 引脚和 VDD_EXT 引脚相连。我们要在按下 BOOT 按键时让模块开机,就可以进入下载模式了。

具体到 Air700ECQ 开发板,

  • 当我们模块没开机时,按着 BOOT 键然后长按 PWR 开机。
  • 当我们模块开机时,按着 BOOT 键然后点按重启键即可。

5.2.6 识别电脑的正确端口

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

如果设备管理器出现了 3 个连续数字的 com 端口,这时候, 证明硬件连接就绪,模块正常开机且端口识别正常

此时按住 BOOT 按键,再按下重启按键就可以重启进入boot下载模式,然后就可以烧录了!

5.2.7 新建项目

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

在 Luatools 的左上角上有版本显示的,如图所示:

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

这时会弹出项目管理和烧录管理的对话框,如下图:

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

六、GPIO 简介

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

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

-- Air780E的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 硬件连接

本文使用的是 Air700ECQ 开发板,需要准备一根杜邦线将开发板上的 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

-- Air780E的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 Air780E 所有 GPIO 初始化电平高低表

七、常见问题

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

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

7.1.1 IO 复用简介

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

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

由于芯片的引脚少,存在大量复用的场景,有很多功能是会冲突的,若使用 SIM2, 会占用 4 个 IO(gpio4/5/6/23)

7.1.2 Air780E 复用参考文档

参考文档:GPIO 复用说明

Air780E 引脚 table

7.1.3 IO 复用测试 demo

测试 demo 地址

本 demo 展示了将 UART2 复用到 IO6 和 IO7(注:因为开发板没有 GPIO6 和 GPIO7 所以用户需要使用全 IO 大板进行测试,点击此处购买全 IO 板)

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

-- 将UART2RX和TX复用到GPIO6和GPIO7
mcu.iomux(mcu.UART,2,2)

local uart_id = 2

-- 设置串口2
uart.setup(uart_id,115200,8,1)

-- 注册串口接收事件回调
uart.on(uart_id,"receive",function(id,len)
    local data = uart.read(id,len)
    log.info("uart2 receive data:",data)
end)

sys.taskInit(function()
    local buff = "uart2 send data"
    while true do
        sys.wait(3000)
        -- 循环发送数据
        uart.write(uart_id,buff)
    end
end)
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

7.1.4 硬件链接

串口工具----------Air780E全IO开发板

串口工具 RXD ---- 开发板 GPIO6

串口工具 TXD ---- 开发板 GPIO7

串口工具 GND ---- 开发板 GND

7.1.5 示例效果展示

7.2 怎么没看见上拉/下拉输入模式的介绍?

上拉/下拉输入需要接入上拉/下拉电阻和一个按键,在 Air780E 开发板上不方便演示,需要用全 IO 板进行演示,下面是上拉下拉输入模式的简介

7.2.1 上拉/下拉模式测试 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

--配置gpio27为中断下拉模式
--配置gpio24为中断下拉模式
--请根据实际需求更改gpio编号和上下拉
local gpio_pin1 = 7
local gpio_pin2 = 6
-- 按键防抖函数
gpio.debounce(gpio_pin1, 50)
gpio.debounce(gpio_pin2, 50)

-- 设置GPIO24引脚为上拉输入模式
gpio.setup(gpio_pin1, nil, gpio.PULLUP)

-- 设置GPIO27引脚为下拉输入模式
gpio.setup(gpio_pin2, nil, gpio.PULLDOWN)

sys.timerLoopStart(function ()
    log.info("GPIO",gpio_pin1,"电平",gpio.get(gpio_pin1))
    log.info("GPIO",gpio_pin2,"电平",gpio.get(gpio_pin2))
end,1000)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

7.2.2 硬件链接

上拉输入:连接上拉电阻,当电路未连接时,引脚读取电平是稳定的高电平。在没有外部信号(或外部信号为高阻态)时,通过上拉电阻将输入端拉至一个确定的电平(通常是高电平)

下拉输入:连接下拉电阻,当电路未连接时,引脚读取电平是稳定的低电平。通过将输入引脚连接到地(GND)通过一个下拉电阻,当没有外部信号连接时,下拉电阻将把输入引脚拉低到逻辑低电平。下拉电阻的存在形成了一个电流路径,从输入引脚通过下拉电阻到地,从而保持输入引脚在低电平状态

7.2.3 示例效果展示

<!-- ## 给读者的话

本篇文章由 黄何 开发; 本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题; 请先登录合宙技术交流论坛,然后点击右边链接文档找错赢奖金--Air700ECQ-LuatOS-软件指南-硬件驱动-GPIO 用截图标注 + 文字描述的方式跟帖回复,记录清楚您发现的问题; 我们会迅速核实并且修改文档; 同时也会为您累计找错积分,您还可能赢取月度找错奖金! -->