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,85 @@
--[[
@module main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date 2025.11.05
@author 马梦阳
@usage
本demo演示的核心功能为:
1. 旧风格 PWM 演示:
使用 pwm.open() 完成 PWM 通道的配置与启动
使用 pwm.close() 关闭 PWM 通道
旧风格 PWM 接口不支持单独配置和动态调整占空比和信号频率
2. 新风格 PWM 演示:
使用 pwm.setup() 完成 PWM 通道的配置
使用 pwm.start() 启动 PWM 输出
使用 pwm.setDuty() 动态调整占空比
使用 pwm.setFreq() 动态调整信号频率
使用 pwm.stop() 停止 PWM 输出
新风格 PWM 接口支持在运行中动态调整占空比和信号频率
注意事项:
1. 本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27PIN16);
2. 该引脚需要通过 LuatIO 工具进行复用配置,pins_Air780EPM.json 文件即复用配置后生成的文件;
3. 关于 LuatIO 工具的使用介绍以及如何生成 json 文件,请参考 https://docs.openluat.com/air780epm/common/luatio/
3. 将通过 LuatIO 工具配置好复用关系后生成的 json 文件与脚本文件一同烧录到模组中即可实现 PWM 输出功能;
注意!!!!pwm.setFreq() 函数目前出现一些 BUG,调用成功后无法正常输出波形,正在紧急修复,时间 2025.10.29
更多说明参考本目录下的 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 = "PWM"
VERSION = "001.999.000"
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, 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)
-- 加载 PWM 应用模块
require "pwm_app"
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
@@ -0,0 +1,52 @@
{
"model": "Air780EPM",
"pins": [
[7, "PWR_KEY", ""],
[16, "PWM4", ""],
[17, "UART1_RXD", ""],
[18, "UART1_TXD", ""],
[19, "GPIO22", ""],
[20, "PWM1", ""],
[22, "PWM0", ""],
[23, "ONEWIRE", ""],
[25, "CAN_TXD", ""],
[26, "GPIO33", ""],
[28, "UART2_RXD", ""],
[29, "UART2_TXD", ""],
[30, "GPIO29", ""],
[31, "GPIO30", ""],
[32, "GPIO31", ""],
[33, "GPIO32", ""],
[38, "DBG_RXD", ""],
[39, "DBG_TXD", ""],
[49, "LCD_RST", ""],
[50, "LCD_SDA", ""],
[51, "LCD_RS", ""],
[52, "LCD_CS", ""],
[53, "LCD_CLK", ""],
[54, "CAM_MCLK", ""],
[55, "CAM_RX0", ""],
[56, "CAM_RX1", ""],
[57, "UART3_TXD", ""],
[58, "UART3_RXD", ""],
[61, "VBUS", ""],
[66, "I2C1_SDA", ""],
[67, "I2C1_SCL", ""],
[78, "GPIO28", ""],
[79, "USIM_DET", ""],
[80, "CAM_BCLK", ""],
[81, "CAM_CS", ""],
[82, "USB_BOOT", ""],
[83, "SPI0_CS", ""],
[84, "SPI0_MISO", ""],
[85, "SPI0_MOSI", ""],
[86, "SPI0_CLK", ""],
[97, "GPIO16", ""],
[99, "GPIO23", ""],
[100, "GPIO17", ""],
[101, "WAKEUP0", ""],
[102, "GPIO20", ""],
[106, "CAN_RXD", ""],
[107, "GPIO21", ""]
]
}
@@ -0,0 +1,181 @@
--[[
@module pwm_app
@summary PWM 输出功能模块
@version 1.0
@date 2025.11.05
@author 马梦阳
@usage
本功能模块演示的内容为:
1. 旧风格 PWM 演示:
使用 pwm.open() 完成 PWM 通道的配置与启动
使用 pwm.close() 关闭 PWM 通道
旧风格 PWM 接口不支持单独配置和动态调整占空比和信号频率
2. 新风格 PWM 演示:
使用 pwm.setup() 完成 PWM 通道的配置
使用 pwm.start() 启动 PWM 输出
使用 pwm.setDuty() 动态调整占空比
使用 pwm.setFreq() 动态调整信号频率
使用 pwm.stop() 停止 PWM 输出
新风格 PWM 接口支持在运行中动态调整占空比和信号频率
3. 综合任务调度:顺序运行上述两种风格示例,并在关键节点进行日志输出
注意事项:
1. 本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27PIN16);
2. 该引脚需要通过 LuatIO 工具进行复用配置,pins_Air780EPM.json 文件即复用配置后生成的文件;
3. 关于 LuatIO 工具的使用介绍以及如何生成 json 文件,请参考 https://docs.openluat.com/air780epm/common/luatio/
3. 将通过 LuatIO 工具配置好复用关系后生成的 json 文件与脚本文件一同烧录到模组中即可实现 PWM 输出功能;
本文件没有对外接口,直接在 main.lua 中 require "pwm_app" 就可以加载运行;
]]
--[[
旧风格 PWM 演示函数
使用 pwm.open() 一次性完成配置和启动
适合固定频率/占空比、无需中途调整的场景
]]
local function task1_old_pwm()
log.info("PWM", "旧风格 PWM 示例开始")
-- 选择 PWM 通道 4
-- 注意:本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27PIN16);
-- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
local pwm_channel = 4
-- 第一次输出:1 kHz,45% 占空比,分频精度 100
local pwm_success = pwm.open(pwm_channel, 1000, 45, 0, 100)
if pwm_success then
log.info("PWM", "PWM4 通道开启成功: 信号频率 1000 Hz, 分频精度 100, 占空比 45%")
else
log.info("PWM", "PWM4 通道开启失败")
end
-- 持续 1 s 后关闭
sys.wait(1000)
pwm.close(pwm_channel)
log.info("PWM", "PWM4 通道已关闭")
-- 增加 1 秒的间隔时间
sys.wait(1000)
-- 第二次输出:500 Hz,60% 占空比,分频精度 100
local pwm_success = pwm.open(pwm_channel, 500, 60, 0, 100)
if pwm_success then
log.info("PWM", "PWM4 通道开启成功: 信号频率 500 Hz, 分频精度 100, 占空比 60%")
else
log.info("PWM", "PWM4 通道开启失败")
end
-- 持续 2 s 后关闭
sys.wait(2000)
pwm.close(pwm_channel)
log.info("PWM", "PWM4 通道已关闭")
-- 增加 1 秒的间隔时间
sys.wait(1000)
-- 第三次输出:300 Hz,80% 占空比,分频精度 100
local pwm_success = pwm.open(pwm_channel, 300, 80, 0, 100)
if pwm_success then
log.info("PWM", "PWM4 通道开启成功: 信号频率 300 Hz, 分频精度 100, 占空比 80%")
else
log.info("PWM", "PWM4 通道开启失败")
end
-- 持续 3 s 后关闭
sys.wait(3000)
pwm.close(pwm_channel)
log.info("PWM", "PWM4 通道已关闭")
log.info("PWM", "旧风格 PWM 示例结束")
end
--[[
新风格 PWM 演示函数
使用 pwm.setup() 分步完成配置与启动,支持运行中动态修改频率和占空比
适合需要实时调节输出参数的场景
]]
local function task2_new_pwm()
log.info("PWM", "新风格 PWM 示例开始")
-- 选择 PWM 通道 4
-- 注意:本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27PIN16);
-- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
local pwm_channel = 4
-- 配置 PWM 参数:频率 1000 Hz、占空比 50%、分频精度 100
local setup_success = pwm.setup(pwm_channel, 1000, 50, 0, 100)
if setup_success then
log.info("PWM", "PWM4 配置成功: 信号频率 1000 Hz, 分频精度 100, 占空比 50%")
else
log.info("PWM", "PWM4 配置失败")
end
-- 启动 PWM 输出
local pwm_success = pwm.start(pwm_channel)
if pwm_success then
log.info("PWM", "PWM4 启动成功")
else
log.info("PWM", "PWM4 启动失败")
end
-- 持续输出 2 秒
sys.wait(2000)
-- 动态调整占空比至 25%
local setduty_success = pwm.setDuty(pwm_channel, 25)
if setduty_success then
log.info("PWM", "PWM4 占空比更新为 25%")
else
log.info("PWM", "PWM4 占空比设置失败")
end
-- 持续输出 2 秒
sys.wait(2000)
-- 动态调整信号频率为 2000 Hz
local setfreq_success = pwm.setFreq(pwm_channel, 2000)
if setfreq_success then
log.info("PWM", "PWM4 频率更新为 2000 Hz")
else
log.error("PWM", "PWM4 频率设置失败")
end
-- 持续输出 2 秒
sys.wait(2000)
-- 停止 PWM 输出
local pwm_success = pwm.stop(pwm_channel)
if pwm_success then
log.info("PWM", "PWM4 停止成功")
else
log.info("PWM", "PWM4 停止失败")
end
log.info("PWM", "新风格 PWM 示例结束")
end
--[[
主演示任务:
顺序调用旧风格与新风格 PWM 示例函数
并在两者之间插入 3 秒间隔方便区分新旧风格示例输出情况
]]
local function pwm_demo_task()
log.info("PWM", "PWM 综合演示任务开始")
-- 运行旧风格 PWM 示例
task1_old_pwm()
-- 间隔 3 秒
sys.wait(3000)
-- 运行新风格 PWM 示例
task2_new_pwm()
log.info("PWM", "PWM 综合演示任务结束")
end
-- 创建并启动一个 task
-- 用于运行 pwm_demo_task 函数
sys.taskInit(pwm_demo_task)
@@ -0,0 +1,81 @@
## 演示模块概述
1、main.lua:主程序入口;
2、pwm_app.luaPWM 输出功能模块;
3、pins_Air780EPM.json:用于配置管脚复用功能的 json 文件;
- 关于如何生成 json 文件参考:https://docs.openluat.com/air780epm/common/luatio/
- 示例代码中使用的是 Air780EPM 模组的 PWM4 通道(GPIO27,PIN16),参考完上述文档后通过 LuatIO 工具配置好并保存,最后连同脚本一起烧录到 Air780EPM 模组中即可实现 PWM 输出功能;
## 演示功能概述
使用 Air780EPM 核心板搭配 PWM 库演示 PWM 输出功能;
PWM 库目前有两套 API 风格:
1、旧风格 PWM 演示:
- 使用 pwm.open() 函数一次性完成 PWM 通道的配置与启动
- 使用 pwm.close() 函数关闭 PWM 通道
- 旧风格 PWM 接口不支持动态调整参数
2、新风格 PWM 演示:
- 使用 pwm.setup() 函数进行 PWM 参数配置
- 使用 pwm.start() 函数开启 PWM 通道进行 PWM 输出
- 使用 pwm.setDuty() 函数动态调整占空比,支持在开启 PWM 通道后调用
- 使用 pwm.setFreq() 函数动态调整信号频率,支持在开启 PWM 通道后调用
- 新风格 PWM 接口支持实时动态调整占空比和信号频率
## 演示硬件环境
1、Air780EPM 核心板一块
2、TYPE-C USB数据线一根
3、杜邦线若干
4、逻辑分析仪或者示波器,用于观察 PWM 输出的波形
5、代码中选用的 PWM 通道是 Air780EPM 模组的 PWM4GPIO27PIN16
## 演示软件环境
1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
2、[Air780EPM V2016 版本](https://docs.openluat.com/air780epm/luatos/firmware/version/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录 V2016-1 固件对比验证)
## 演示核心步骤
1、搭建好硬件环境
2、Luatools 工具烧录内核固件和 demo 脚本代码
3、烧录成功后,自动开机运行
4、正常运行情况时的日志如下:
```
[000000000.427] I/user.main PWM 001.000.000
[000000000.434] I/user.PWM PWM 综合演示任务开始
[000000000.434] I/user.PWM 旧风格 PWM 示例开始
[000000000.435] I/user.PWM PWM4 通道开启成功: 信号频率 1000 Hz, 分频精度 100, 占空比 45%
[000000001.435] I/user.PWM PWM4 通道已关闭
[000000002.435] I/user.PWM PWM4 通道开启成功: 信号频率 500 Hz, 分频精度 100, 占空比 60%
[000000004.436] I/user.PWM PWM4 通道已关闭
[000000005.436] I/user.PWM PWM4 通道开启成功: 信号频率 300 Hz, 分频精度 100, 占空比 80%
[000000008.437] I/user.PWM PWM4 通道已关闭
[000000008.437] I/user.PWM 旧风格 PWM 示例结束
[000000011.437] I/user.PWM 新风格 PWM 示例开始
[000000011.438] I/user.PWM PWM4 配置成功: 信号频率 1000 Hz, 分频精度 100, 占空比 50%
[000000011.438] I/user.PWM PWM4 启动成功
[000000013.438] I/user.PWM PWM4 占空比更新为 25%
[000000015.439] I/user.PWM PWM4 频率更新为 2000 Hz
[000000017.439] I/user.PWM PWM4 停止成功
[000000017.440] I/user.PWM 新风格 PWM 示例结束
[000000017.440] I/user.PWM PWM 综合演示任务结束
```
5、使用逻辑分析仪或者示波器观察 PWM 输出波形是否与配置的参数一致