init: Air780EPM 官方 LuatOS 项目代码基线

- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码
- 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等)
- 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
wangfq
2026-08-31 08:53:49 +08:00
commit 173dd6874f
813 changed files with 125484 additions and 0 deletions
@@ -0,0 +1,33 @@
--[[
@module agpio_task
@summary Air780EPM演示agpio功能模块
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为Air780EPM开发板演示 AGPIO 功能的代码示例,核心业务逻辑为:
AGPIO与普通GPIO在PSM+模式下的区别演示
1. 初始化普通GPIO和AGPIO
- 配置普通GPIO1为输出模式并设置为高电平
- 配置AGPIO27为输出模式并设置为高电平
2. 等待一段时间让GPIO状态稳定
3. 关闭USB电源以降低功耗
4. 进入深度休眠模式(PSM+模式),此时RAM 掉电,唤醒后程序从初始状态运行。
5. 观察结果:通过示波器或逻辑分析仪等设备观察进入PSM+模式后普通GPIO为掉电状态,而AGPIO保持了休眠前的电平状态
]]
local gpio_number = 1 -- 普通GPIO GPIO号为1,休眠后掉电。
local Agpio_number = 27 -- AGPIO GPIO号为27,休眠后可保持电平。
gpio.setup(gpio_number, 1)
gpio.setup(Agpio_number, 1)
local function enterlowpower()
sys.wait(10000)
-- 关闭USB电源
pm.power(pm.USB, false)
-- 进入PSM+模式
pm.power(pm.WORK_MODE, 3)
end
sys.taskInit(enterlowpower)
@@ -0,0 +1,41 @@
--[[
@module gpio_input_task
@summary Air780EPM演示GPIO输入检测与LED联动示例
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为Air780EPM开发板演示GPIO输入检测功能的代码示例,核心业务逻辑为:
1. 初始化GPIO24为输入模式(可用杜邦线接稳压电源,高电平接3.3V,低电平接地)
2. 初始化GPIO27(板载LED)为输出模式,默认高电平(亮)
3. 启用输入消抖,消抖时间50 ms
4. 每500 ms读取一次GPIO24电平,并同步控制LED亮灭
5. 高电平→LED亮,低电平→LED灭
]]
-- 配置gpio24为输入模式
-- 配置GPIO27(即开发板上LED灯)为输出模式
-- 请根据实际需求更改gpio编号和上下拉
local inputpin = 24
local ledpin = 27
gpio.setup(inputpin, nil, gpio.PULLDOWN)
gpio.setup(ledpin, 1)
gpio.debounce(inputpin, 50)
--GPIO24检测到有高低电平输入后,会返回GPIO24当前获取到的电平为高还是低,高返回值为1,低返回值为0
--将这个返回值,传给GPIO27(LED),为0 则GPIO27输出低电平(LED灯灭),为1则输出高电平(LED灯亮)
-- 定义一个函数用于循环读取输入引脚电平并控制LED灯
local function controlLed()
local level = 0
while true do
level = gpio.get(inputpin)
log.info("gpio","set netled level: ",level)
gpio.set(ledpin, level)
sys.wait(500)
end
end
sys.taskInit(controlLed)
@@ -0,0 +1,57 @@
--[[
@module gpio_irq_task
@summary Air780EPM演示GPIO中断功能模块
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为Air780EPM开发板演示 GPIO 按键短按和长按检测的代码示例,核心业务逻辑为:
1. 配置GPIO24为中断模式,上升沿和下降沿均触发
2. 实现按键短按(小于3秒)和长按(大于等于3秒)的检测功能
3. 可连接按键或直接用杜邦线轻触GND进行测试
4. 注意:使用杜邦线测试时,因为脉冲可能无法控制,所以不要加防抖防止程序测试异常
]]
-- 配置gpio24为中断模式,上升沿(gpio.RISING)和下降沿(gpio.FALLING)均触发(gpio.BOTH)
local gpio_pin = 24
-- gpio.debounce(gpio_pin, 100) -- 实际设计板子时,根据自己的需求可以更改防抖配置以及打开防抖
-- 按键状态变量
local long_press_threshold = 3000 -- 长按判断阈值,3秒
local current_state = 1 -- 跟踪当前按键状态,1为释放,0为按下
-- 定时器回调函数,处理长按事件
local function timer_callback(gpio_id)
log.info("按键检测", "长按事件", gpio_id)
end
-- 定义GPIO中断处理函数
local function gpio_irq_handler()
local pin_state = gpio.get(gpio_pin) -- 获取GPIO当前状态
-- 只有当状态发生变化时才处理
if pin_state ~= current_state then
current_state = pin_state -- 更新当前状态
if pin_state == 0 then
-- 按键按下
log.info("按键检测", "按键按下")
if not sys.timerIsActive(timer_callback, gpio_pin) then
-- 启动定时器,3秒后触发长按事件
sys.timerStart(timer_callback, long_press_threshold, gpio_pin)
end
elseif pin_state == 1 then
-- 按键释放
log.info("按键检测", "按键释放")
-- 如果定时器还在运行,说明是短按
if sys.timerIsActive(timer_callback, gpio_pin) then
sys.timerStop(timer_callback, gpio_pin)
log.info("按键检测", "短按事件")
end
end
end
end
-- 配置GPIO中断
gpio.setup(gpio_pin, gpio_irq_handler, gpio.PULLUP, gpio.BOTH)
@@ -0,0 +1,29 @@
--[[
@module gpio_irqcount_task
@summary Air780EPM演示GPIO中断计数功能
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为Air780EPM开发板演示GPIO中断计数功能的代码示例,核心业务逻辑为:
1. 配置GPIO24为中断计数模式,用于统计外部信号触发次数
2. 每1秒读取并打印一次中断触发次数
3. 可用杜邦线轻触3.3V电源正极,即可观察中断触发效果。
]]
-- 配置gpio24为中断计数模式
-- 设置好后系统会自动记录中断触发次数。
local gpio_pin = 24
-- gpio.setup(gpio_pin, gpio.count, gpio.PULLUP, gpio.FALLING)
gpio.setup(gpio_pin, gpio.count)
-- 每隔1S统计一次中断触发的次数
local function countIrq()
while true do
sys.wait(1000)
-- 返回从上次调用该函数后到当前时刻的中断触发次数
log.info("irq cnt", gpio.count(gpio_pin)) -- 调用函数时会自动清空中断累计值
end
end
sys.taskInit(countIrq)
@@ -0,0 +1,35 @@
--[[
@module gpio_output_task
@summary Air780EPM演示GPIO输出功能模块
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为Air780EPM开发板演示 GPIO 输出功能的代码示例,核心业务逻辑为:
通过GPIO27控制开发板载网络指示灯(蓝灯)实现闪烁效果
1. 初始化GPIO27为输出模式
2. 在任务循环中周期性地拉高/拉低GPIO27
3. 通过500ms亮灭间隔实现简单的闪烁效果
]]
local gpio_number = 27 -- Air780EPM开发板上的网络指示灯(蓝灯)与GPIO27相连
gpio.setup(gpio_number, 1) -- 设置GPIO27为输出模式
-- 定义任务函数
local function ledlight_task()
local count = 0
while 1 do
-- 闪烁灯程序
gpio.set(gpio_number, 1)
log.info("GPIO", "点亮 LED")
sys.wait(500)--点亮时间 500ms
gpio.set(gpio_number, 0)
log.info("GPIO", "熄灭 LED")
sys.wait(500)--熄灭时间 500ms
count = count + 1
end
end
-- 执行闪烁灯任务函数
sys.taskInit(ledlight_task)
@@ -0,0 +1,32 @@
--[[
@module gpio_pull_task
@summary Air780EPM演示GPIO上下拉功能模块
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为Air780EPM开发板演示 GPIO 上下拉功能的代码示例,核心业务逻辑为:
1. 配置GPIO7为上拉输入模式
2. 配置GPIO27为下拉输入模式
3. 定时读取并打印两个GPIO的电平状态
4. 将GPIO7和GPIO27引脚接地或接3.3V来控制GPIO7和GPIO27的电平变化,验证上拉/下拉配置是否生效
]]
local gpio_pin1 = 7
local gpio_pin2 = 27
-- 按键防抖函数
gpio.debounce(gpio_pin1, 50)
gpio.debounce(gpio_pin2, 50)
-- 设置GPIO7引脚为上拉输入模式
gpio.setup(gpio_pin1, nil, gpio.PULLUP)
-- 设置GPIO27引脚为下拉输入模式
gpio.setup(gpio_pin2, nil, gpio.PULLDOWN)
local function gpiopulltask()
log.info("GPIO",gpio_pin1,"电平",gpio.get(gpio_pin1))
log.info("GPIO",gpio_pin2,"电平",gpio.get(gpio_pin2))
end
sys.timerLoopStart(gpiopulltask,1000)
@@ -0,0 +1,33 @@
--[[
@module gpio_toggle
@summary Air780EPM演示波形翻转功能模块
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本文件为 Air780EPM 开发板演示 GPIO 翻转(脉冲)输出的代码示例,核心业务逻辑为:
GPIO 快速翻转测速与波形观测
1. 配置 GPIO27 为输出模式并上拉初始化;
2. 在任务中循环调用 gpio.pulse() 按给定模式输出脉冲序列;
- 演示模式为 0xA9(二进制 10101001),每次输出 8 组电平变化;
3. 使用示波器或逻辑分析仪连接到 GPIO27,观察翻转波形与频率,翻转一次所需时间大概 50ns;
4. 可根据需要修改 `test_gpio_number`、`0xA9`(翻转模式)和 `8`(组数),以测试不同引脚和模式;
5. 注意:高频翻转请勿直接驱动重负载,推荐用于逻辑检测或带限流的 LED 演示。
]]
local test_gpio_number = 27
gpio.setup(test_gpio_number, 0, gpio.PULLUP)
local function gpiotoggletask()
sys.wait(100)
while true do
sys.wait(100)
-- 通过GPIO27脚输出输出8组电平变化
-- 0xA9就是输出的电平高低状态,即 10101001
gpio.pulse(test_gpio_number, 0xA9, 8, 0)
log.info("gpio----------->pulse")
end
end
sys.taskInit(gpiotoggletask)
@@ -0,0 +1,76 @@
--[[
@module main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date 2025.10.21
@author 拓毅恒
@usage
本demo演示的核心功能为:
演示GPIO的多种功能模式,包括输出模式、输入模式、上拉下拉模式、中断触发模式、中断计数模式、AGPIO低功耗模式以及GPIO翻转测速功能。
用户可通过取消注释相应的require语句来启用不同的功能模块进行测试。
更多说明参考本目录下的readme.md文件
]]
--[[
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
PROJECT:项目名,ascii string类型
可以随便定义,只要不使用,就行
VERSION:项目版本号,ascii string类型
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为999
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
]]
PROJECT = "GPIO_testdemo"
VERSION = "001.999.000"
log.info("main", "project name is ", PROJECT, "version is ", VERSION)
-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
-- 启动errDump日志存储并且上传功能,600秒上传一次
-- if errDump then
-- errDump.config(true, 600)
-- end
-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
-- 可以使用合宙的iot.openluat.com平台进行远程升级
-- 也可以使用客户自己搭建的平台进行远程升级
-- 远程升级的详细用法,可以参考fota的demo进行使用
-- 启动一个循环定时器
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
-- log.info("mem.lua", rtos.meminfo())
-- log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)
-- 加载 gpio 输出功能模块
require "gpio_output_task"
-- 加载 gpio 输入功能模块
-- require "gpio_input_task"
-- 加载 gpio 上下拉功能模块
-- require "gpio_pull_task"
-- 加载 gpio 中断功能模块
-- require "gpio_irq_task"
-- 加载 gpio 中断计数功能模块
-- require "gpio_irqcount_task"
-- 加载 agpio 功能模块
-- require "agpio_task"
-- 加载 gpio 翻转功能模块
-- require "gpio_toggle_task"
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
@@ -0,0 +1,131 @@
## 功能模块介绍
1、main.lua:主程序入口,负责初始化系统并启动各个GPIO功能任务;
2、gpio_output_task.luaGPIO输出模式功能模块,演示GPIO输出控制方法;
3、gpio_input_task.luaGPIO输入模式功能模块,演示GPIO输入读取方法;
4、gpio_pull_task.luaGPIO上拉下拉模式功能模块,演示GPIO上拉下拉配置;
5、gpio_irq_task.luaGPIO中断(触发)模式功能模块,演示GPIO中断触发、回调处理及按键短按长按检测;
6、gpio_irqcount_task.luaGPIO中断(计数)模式功能模块,演示GPIO中断计数功能;
7、agpio_task.luaAGPIO功能模块,演示低功耗GPIO在休眠模式下的特性;
8、gpio_toggle_task.luaGPIO翻转测速功能模块,演示GPIO脉冲输出功能;
## 演示功能概述
1、gpio_output_taskGPIO输出模式功能演示
- 配置GPIO27为输出模式,控制开发板上的网络指示灯(蓝灯)
- 实现简单的灯闪烁效果,LED灯交替点亮和熄灭
- 演示gpio.setup的输出模式配置和状态控制方法
2、gpio_input_taskGPIO输入模式功能演示
- 配置GPIO24为输入模式,配置GPIO27为输出模式
- 实现输入信号读取,并将读取到的电平状态实时反映到LED灯上
- 演示gpio.debounce防抖功能的使用
- 展示如何通过输入GPIO的状态控制输出GPIO
3、gpio_pull_taskGPIO上拉下拉模式功能演示
- 配置GPIO7为上拉输入模式,GPIO27为下拉输入模式
- 演示gpio.debounce防抖功能在不同上下拉模式下的应用
- 展示如何通过输入GPIO的状态控制输出GPIO
4、gpio_irq_taskGPIO中断(触发)模式功能演示
- 配置GPIO24为中断模式,支持上升沿和下降沿触发(双边沿触发)
- 实现中断触发时的回调函数,打印触发信息
- 演示gpio.debounce防抖功能在中断模式下的应用
- 实现按键短按(小于3秒)和长按(大于等于3秒)的检测功能
- 可连接按键或直接用杜邦线轻触GND进行测试
5、gpio_irqcount_taskGPIO中断(计数)模式功能演示
- 配置GPIO24为中断计数模式,用于统计信号触发次数
- 配置PWM4输出1kHz、占空比50%的方波作为计数信号源
- 实现周期性(1秒)统计和打印中断触发次数
- 展示gpio.count函数在计数模式下的使用方法
6、agpio_taskAGPIO功能演示
- 演示普通GPIO和AGPIO在进入休眠模式前后的区别
- 普通GPIO(GPIO1)在休眠后会掉电,而AGPIO(GPIO27)可保持电平状态
- 演示如何通过pm.power控制系统进入低功耗模式
- 展示休眠前后GPIO电平状态的变化情况
7、gpio_toggle_taskGPIO翻转测速功能演示
- 配置GPIO27为输出模式,初始电平为低电平
- 演示gpio.pulse函数生成指定模式的电平变化序列
- 输出8组电平变化(0xA9,即二进制10101001
- 展示如何通过快速电平翻转实现特定信号模式的输出
## 演示硬件环境
1、Air780EPM V1.3版本开发板一块:
- 确保开发板正常供电
- 开发板上的网络指示灯(蓝灯)与GPIO27相连
- GPIO24可用于输入信号检测或中断触发测试
2、TYPE-C USB数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
- TYPE-C USB数据线直接插到开发板的TYPE-C USB座子,另外一端连接电脑USB口;
3、可选硬件(根据需要):
- 外部按键或信号源:用于GPIO输入模式和中断模式的信号输入测试
- 面包板、杜邦线:用于连接外部信号源和开发板GPIO
## 演示软件环境
1、Luatools下载调试工具
2、[Air780EPM 版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
## 演示核心步骤
在main.lua中,可以根据需要启用或禁用特定的GPIO功能任务:
- 通过注释或取消注释相应的require语句来控制功能模块的加载
- 每个功能模块作为独立的任务运行,可以单独测试或组合测试
### 1、GPIO输出模式
1. 搭建好硬件环境
2. 打开main.lua,确保保留`require "gpio_output_task"`这一行
3. 将代码下载到开发板并运行
4. **演示效果**:开发板上的蓝色网络指示灯(GPIO27)将按照设定的时间间隔交替点亮和熄灭,实现呼吸灯效果
### 2、GPIO输入模式
1. 搭建好硬件环境
2. 打开main.lua,确保保留`require "gpio_input_task"`这一行语句
3. 将代码下载到开发板并运行
4. **演示效果**:当GPIO24输入为高电平时,GPIO27上的蓝色LED灯会点亮;当GPIO24输入为低电平时,蓝色LED灯会熄灭
### 3、GPIO上拉下拉模式
1. 搭建好硬件环境
2. 打开main.lua,确保只保留`require "gpio_pull_task"`这一行语句
3. 将代码下载到开发板并运行
4. **演示效果**:串口日志中会周期性显示GPIO7(上拉输入)和GPIO27(下拉输入)的当前电平状态
### 4、GPIO中断(触发)模式
1. 搭建好硬件环境
2. 打开main.lua,确保保留`require "gpio_irq_task"`这一行语句
3. 将代码下载到开发板并运行
4. **演示效果**:当GPIO24的电平发生变化时,会触发中断并检测按键动作,在串口日志中打印短按(小于3秒)或长按(大于等于3秒)事件
### 5、GPIO中断(计数)模式
1. 搭建好硬件环境
2. 打开main.lua,确保保留`require "gpio_irqcount_task"`这一行语句
3. 将代码下载到开发板并运行
4. **演示效果**:PWM4输出方波信号到GPIO24,串口日志中每秒显示一次中断触发的计数值
### 6、AGPIO功能
1. 搭建好硬件环境
2. 打开main.lua,确保保留`require "agpio_task"`这一行语句
3. 将代码下载到开发板并运行
4. **演示效果**:系统进入低功耗模式后,普通GPIO(GPIO1)电平会掉电,而AGPIO(GPIO27)可以保持其电平状态,通过示波器或逻辑分析仪等工具可以查看示例效果展示
### 7、GPIO翻转测速
1. 搭建好硬件环境
2. 打开main.lua,确保保留`require "gpio_toggle_task"`这一行语句
3. 将代码下载到开发板并运行
4. **演示效果**GPIO27会根据gpio.pulse函数的配置快速输出特定模式的电平变化序列(二进制10101001),通过示波器或逻辑分析仪等工具可以查看示例效果展示