跳转至

GPIO

一、GPIO 概述

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

二、演示功能概述

本文将介绍 724UG GPIO 的输入与输出 DEMO 讲解与效果演示。

三、准备硬件环境

3.1 开发板准备

使用 Air724UG-NFM 开发板,如下图所示:

淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接

此开发板的详细使用说明参考:Air724UG 产品手册 中的 《EVB_Air724UG_AXX开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。

3.2 数据通信线

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

  • USB 数据线(其一端为 micro-B 接口(俗称老安卓口),用于连接 Air724UG-NFM 开发板)。通常,这种数据线的外观如下示意图所示:

USB 数据线:此数据线不仅用于为测试板供电,还可用于查看抓取 lua 脚本上层和底层 core 日志。其一端为 micro-B 接口,连接 Air724UG-NFM 开发板;另一端为标准 USB 接口,连接 PC 电脑。

3.3 PC 电脑

WINDOWS 系统,其他暂无特别要求;

四、准备软件环境

4.1 源码和工具

下载最新版本的底层 CORE,解压后会出现多个版本的固件,本教程使用的是 LuatOS-Air_V4030_RDA8910_TTS_NOLVGL_FLOAT.dfota.bin。

4.2 烧录代码

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

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

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

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

选择对应的项目烧录代码。

五、GPIO 软硬件资料

5.1 相关硬件接口

Air724UG 模块引脚共支持 28 个 GPIO,部分引脚上电前后状态不同,如使用这些管脚,需根据实际情况使用。

管脚定义:

VLCD、VMMC、VSIM1相关引脚电压域会根据外部硬件,其内部自动调整其输出电压,为1.8V/3V/3.3V
At reset, after reset 都默认指的就是function 0功能的状态(即GPIO 配置还没生效前的状态)
GPIO0~5 电压域默认关闭,所以at reset, after reset状态都是L
GPIO29~31 电压域默认关闭,所以at reset, after reset状态都是L

参考硬件设计手册中的管脚描述

5.2 相关 API 介绍

GPIO 相关 API: https://doc.openluat.com/wiki/21?wiki_page_id=2286

六、功能示例

6.1 GPIO 简介

GPIO(General-Purpose Input/Output) 指通用输入输出口。在软件运行期间能够动态配置和控制的通用引脚,实现某时刻电平状态的输出与输入,即可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。

6.2 输入模式简介

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

6.2.1 核心代码

--GPIO19配置为输入,可通过getGpio19Fnc()获取输入电平
local getGpio19Fnc = pins.setup(pio.P0_19)
--循环输出GPIO19电平
sys.timerLoopStart(function()
    log.info("testGpioSingle.getGpio19Fnc",getGpio19Fnc())
end,1000)

6.2.2 示例效果展示

使用杜邦线短接 VDD1V8 和 GPIO19。

使用杜邦线短接 GND 和 GPIO19。

6.3 输出模式简介

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

6.3.1 核心代码

local level = 0
--GPIO18配置为输出,默认输出低电平,可通过setGpio18Fnc(0或者1)设置输出电平
local setGpio18Fnc = pins.setup(pio.P0_18,0)
--循环设置GPIO18电平为0,1
sys.timerLoopStart(function()
    level = level==0 and 1 or 0
    setGpio18Fnc(level)
    log.info("testGpioSingle.setGpio18Fnc",level)
end,1000)

6.3.2 示例效果展示:

6.4 中断模式简介

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

6.4.1 核心代码

function gpio13IntFnc(msg)
    log.info("testGpioSingle.gpio13IntFnc",msg,getGpio13Fnc())
    --上升沿中断
    if msg==cpu.INT_GPIO_POSEDGE then
    --下降沿中断
    else
    end
end

--GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数
getGpio13Fnc = pins.setup(pio.P0_13,gpio13IntFnc)

6.4.2 示例效果展示:

使用杜邦线将 GPIO13 短接下 VDD1V8.

七、总结

本节我们学习了有关 GPIO 的知识。其中包括输入模式,输出模式,中断模式。

合宙 Cat.1 模块具有多种不同的 GPIO 接口,部分 GPIO 口同时可复用为其他功能,并且模块的 GPIO 管脚输入输出电压能力按照不同的电压域区分,特珠管脚的使用需要打开对应的电压域方能使用。

八、常见问题

1. 为什么 GPIO4 管脚操作没反应?

答:GPIO4 管脚为 VCC_LCD 电压域,需要先配置 pmd.ldoset(2,pmd.LDO_VLCD)打开,才能正常操作该管脚。

九、扩展

脉冲统计个数:

使用杜邦线短接 GPIO23 和 GPIO11

---------------------------------------脉冲统计个数功能演示---------------------------------------
--脉冲产生器:GPIO11一直输出1KHz的方波
pio.pin.pwm(pio.P0_11,500,500,-1)

--脉冲检测:GPIO23用来检测,短接GPIO11和GPIO23
sys.taskInit(function()
    --关闭软件和硬件防抖功能
    pio.pin.setdebounce(0xffffffff)
    --配置GPIO23位脉冲检测模式
    pio.pin.setdir(pio.INT,pio.P0_23,pio.CONT)
    --恢复默认防抖配置20毫秒
    pio.pin.setdebounce(20)

    --每隔一秒检测一次输入脉冲的数量
    --检测1分钟
    local seconds = 0
    while seconds<60 do
        -- 读取检测到的脉冲个数,数据为table类型,格式如下:
        -- {
        --     low = 10, -- 低电平个数
        --     high = 10, -- 高电平个数
        --     duration = 2000000, -- 距离上次读取的时间(单位us)
        -- }
        local tPlusInfo = pio.pin.getval(pio.P0_23)
        log.info("testGpioSingle.gpio23 tPlusInfo",tPlusInfo.low,tPlusInfo.high,tPlusInfo.duration)
        sys.wait(1000)
        seconds = seconds+1
    end

    --关闭GPIO23脉冲检测功能
    pio.pin.close(pio.P0_23)
end)
---------------------------------------脉冲统计个数功能演示---------------------------------------

示例效果展示:

给读者的话

本篇文章由魏健强开发;

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

请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-硬件驱动-GPIO

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

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

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