GPIO
一、GPIO 概述
GPIO 是通用型输入输出的简称,一个 GPIO 引脚可以用于输入、输出或其他特殊功能。
二、演示功能概述
本文将介绍 Air8101 GPIO 的输入与输出 demo 讲解与效果演示。
三、准备硬件环境
TODO
四、软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools 工具;
2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V10001_Air8101.soc;
3. luatOS 需要的脚本和资源文件 :脚本和资源文件点我浏览所有文件
五、GPIO 软硬件参考
5.1 API 接口介绍
本教程使用 API 接口为:
注意:luatos 的 api 接口是通用的。
5.2 GPIO 硬件设计
5.2.1 GPIO 复用表
Air8101 用于 LuatOS 二次开发方式时的 GPIO 引脚复用表
六、GPIO 简介
认识工业引擎 GPIO 管脚:Air8101 工业引擎的 GPIO 与其他 MCU 类的芯片一样,也可以配置为输入/输出/上拉/下拉/中断等状态,只有在硬件设计手册上注明带 GPIO 功能的管脚才能作为 GPIO 使用。
6.1 输出模式简介
GPIO 的输出模式是指将 GPIO 配置为向外界输出高低电平的模式。
6.1.1 输出模式示例
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "GPIO_out"
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 = 0
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.1.2 示例效果展示:
可以通过日志和示波器截图看到当前 GPIO 是按照代码中 500ms 变换一次输出状态
通过示波器查看 GPIO 输出模式波形:
6.2 输入模式简介
GPIO 的输入模式是指将 GPIO 配置为接收外部信号的模式。
6.2.1 输入模式测试 demo
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "GPIO_int"
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
-- 请根据实际需求更改GPIO编号和上下拉
local inputpin = 0
--设置GPIO为输入模式
local input = GPIO.setup(inputpin,nil)
-- 设置GPIO为上拉输入模式
--GPIO.setup(inputpin, nil, GPIO.PULLUP)
-- 设置GPIO为下拉输入模式
--GPIO.setup(inputpin, nil, GPIO.PULLDOWN)
--循环打印GPIO当前输入状态,为1是高电平,为0是低电平
sys.taskInit(function ()
while true do
log.info("GPIO_int 电平输入状态",input())
sys.wait(999)
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
6.1.2 示例效果展示:
可以通过日志和示波器看到,第一次拉高 4s,第二次拉高 5s,示波器波形和日志显示都是对的上的
6.3 中断模式简介
当 GPIO 检测到电平变化且满足触发条件时,触发中断,CPU 就会暂停当前任务,执行中断回调函数中的内容,当中断回调函数中的内容执行完毕时,再继续执行之前没有执行完的任务。
6.3.1 中断模式测试 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
-- 配置GPIO为中断模式,上升沿(GPIO.RISING)和下降沿(GPIO.FALLING)均触发(GPIO.BOTH)
-- 请根据实际需求更改GPIO编号和触发模式
-- 在测试中,可以手动拉高VDD管脚给此GPIO一个上升沿,就会产生一个上升沿中断;然后将此GPIO拉低到GND,就会有一个下降沿,此时就产生一个下降沿中断
local GPIO_pin = 1
GPIO.debounce(GPIO_pin, 100)
GPIO.setup(GPIO_pin, function()
log.info("GPIO", GPIO_pin, "被触发")
end,GPIO.PULLDOWN,GPIO.BOTH)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
6.3.2 示例效果展示:
可以通过日志和示波器看到,日志打印是触发了 10 次,示波器上升沿和下降沿也是 10 次
七、总结
本节我们学习了有关 GPIO 的知识。其中包括输入模式,输出模式,中断模式。
我们可以通过具体应用场景来判断使用哪种模式:
-
LED 控制
-
阐述:通过 GPIO 配置为输出模式,实现 LED 的通断。
- 使用:用于显示系统状态指示灯或警告灯等。
-
按键
-
阐述:GPIO 被配置为中断输入,用于响应外部事件。
- 使用:包括外部设备通知、实时事件检测及按键去抖动等。
-
单总线
-
阐述:一种特定的通信协议。
- 使用:适用于温度监控、身份验证及设备配置等多种场景。如 DS18B20 温度传感器。
八、注意事项与常见问题
8.1 注意事项
- 注意主控设备与连接的设备要保持同一个地(GND),避免 GPIO 连接超过电压范围的电压,导致损坏
- 当 GPIO 设置为输入模式时,确保不要向其输出电压;通常建议使用上拉或下拉电阻,避免悬空状态的输入引脚可能会读取随机值
- 当引脚设置为输出模式时,避免对其施加外部电压。不能将两个都是输出模式的 GPIO 相连,避免输出不同的电压,可能会导致短路
- 中断回调里面避免复杂操作,回调函数尽量简洁
- GPIO 做按键或开关等应用场景时,会出现抖动,可以采用硬件消抖或者软件消抖,软件可通过 gpio.debounce 接口防抖
8.2 常见问题
- IO 复用功能以及哪些管脚可以作为 GPIO,可参考下表: