Просмотр исходного кода

Merge branch 'master' of https://gitee.com/openLuat/LuatOS

alienwalker 7 месяцев назад
Родитель
Сommit
fbcbdb10e7
42 измененных файлов с 1121 добавлено и 398 удалено
  1. 1 1
      components/network/netdrv/src/luat_netdrv_ch390h.c
  2. 266 0
      luat/demo/netdrv/ch390_wan_lan_spi0/lan_wan.lua
  3. 41 0
      luat/demo/netdrv/ch390_wan_lan_spi0/main.lua
  4. BIN
      module/Air780EGH/core/LuatOS-SoC_V2007_Air780EGH.soc
  5. 29 0
      module/Air780EGH/demo/pwm/breathing_led.lua
  6. 69 0
      module/Air780EGH/demo/pwm/main.lua
  7. 26 0
      module/Air780EGH/demo/pwm/pwm_output.lua
  8. 32 0
      module/Air780EGH/demo/pwm/readme.md
  9. 0 0
      module/Air780EHM/.keep
  10. 0 0
      module/Air780EHM/core/.keep
  11. BIN
      module/Air780EHM/core/LuatOS-SoC_V2007_Air780EHM.soc
  12. BIN
      module/Air780EHV/CORE/LuatOS-SoC_V2007_Air780EHV.soc
  13. 29 0
      module/Air780EHV/DEMO/pwm/breathing_led.lua
  14. 69 0
      module/Air780EHV/DEMO/pwm/main.lua
  15. 26 0
      module/Air780EHV/DEMO/pwm/pwm_output.lua
  16. 32 0
      module/Air780EHV/DEMO/pwm/readme.md
  17. BIN
      module/Air780EPM/core/LuatOS-SoC_V2003_Air780EPM/LuatOS-SoC_V2003_Air780EPM.soc
  18. 0 32
      module/Air780EPM/core/LuatOS-SoC_V2003_Air780EPM/release_note.txt
  19. BIN
      module/Air780EPM/core/LuatOS-SoC_V2004_Air780EPM.soc
  20. BIN
      module/Air780EPM/core/LuatOS-SoC_V2005_Air780EPM.soc
  21. BIN
      module/Air780EPM/core/LuatOS-SoC_V2007_Air780EPM.soc
  22. 38 19
      module/Air8000/core/Air8000_FetchCore&CoreChangeLog.md
  23. BIN
      module/Air8000/core/air8000_core_1-11.png
  24. 80 76
      module/Air8000/core/固件功能列表.md
  25. 50 58
      module/Air8000/demo/ble/ibeacon/main.lua
  26. 1 1
      module/Air8000/demo/ble/ibeacon/readme.md
  27. 19 13
      module/Air8000/demo/ble/master/ble_master.lua
  28. 68 55
      module/Air8000/demo/ble/master/main.lua
  29. 1 1
      module/Air8000/demo/ble/master/readme.md
  30. 1 1
      module/Air8000/demo/ble/peripheral/ble_peripheral.lua
  31. 111 53
      module/Air8000/demo/ble/peripheral/main.lua
  32. 1 1
      module/Air8000/demo/ble/peripheral/readme.md
  33. 67 51
      module/Air8000/demo/ble/scan/main.lua
  34. 1 1
      module/Air8000/demo/ble/scan/readme.md
  35. 1 1
      module/Air8000/project/整机开发板出厂工程/user/airaudio.lua
  36. 3 2
      module/Air8000/project/整机开发板出厂工程/user/airgsensor.lua
  37. 12 11
      module/Air8000/project/整机开发板出厂工程/user/talk.lua
  38. 2 2
      module/Air8101/demo/lowpower/low_power.lua
  39. 1 1
      module/Air8101/demo/lowpower/main.lua
  40. 2 2
      module/Air8101/demo/lowpower/normal.lua
  41. 2 2
      module/Air8101/demo/lowpower/psm+_power.lua
  42. 40 14
      module/Air8101/project/core_accessory_board/AirGPIO_1000/AirGPIO_1000.lua

+ 1 - 1
components/network/netdrv/src/luat_netdrv_ch390h.c

@@ -71,7 +71,7 @@ luat_netdrv_t* luat_netdrv_ch390h_setup(luat_netdrv_conf_t *cfg) {
                 luat_heap_free(ch);
                 return NULL;
             }
-            if (ch390h_drvs[i]->spiid == ch->spiid || ch390h_drvs[i]->cspin == ch->cspin) {
+            if (ch390h_drvs[i]->spiid == ch->spiid  && ch390h_drvs[i]->cspin == ch->cspin) {
                 LLOGE("已经注册过相同的spi+cs %d %d",ch->spiid, ch->cspin);
                 luat_heap_free(ch);
                 return NULL;

+ 266 - 0
luat/demo/netdrv/ch390_wan_lan_spi0/lan_wan.lua

@@ -0,0 +1,266 @@
+--[[
+=======================================================================
+              CH390双网口SPI0复用演示程序核心逻辑
+=======================================================================
+
+功能概述:
+本程序演示如何在单个SPI总线上同时连接两个CH390网络芯片,实现完整的
+WAN+LAN双网口路由器功能。
+
+SPI复用技术原理:
+1. 【总线共享】两个CH390芯片共享SPI0的SCK、MOSI、MISO三条信号线
+2. 【片选分离】通过不同的CS引脚(GPIO8/GPIO12)实现设备选择
+3. 【时序互斥】使用SPI锁定机制确保同一时刻只有一个设备通信
+4. 【驱动隔离】每个CH390有独立的网络适配器和协议栈
+
+硬件连接:
+  MCU (Air780EPM)        CH390-WAN          CH390-LAN
+  ├─ SPI0_SCK     ─────┬─ SCK          ┌─ SCK
+  ├─ SPI0_MOSI    ─────┼─ MOSI         ├─ MOSI  
+  ├─ SPI0_MISO    ─────┼─ MISO         ├─ MISO
+  ├─ GPIO12       ─────┘  CS           │
+  ├─ GPIO8        ─────────────────────┘  CS
+  ├─ GPIO29       ─────── 3.3V供电控制  │
+  └─ GPIO20       ─────────────────────── 3.3V供电控制
+
+网络拓扑:
+  Internet ←→ [WAN口CH390] ←→ [Air780EPM] ←→ [LAN口CH390] ←→ 内网设备
+              CS=GPIO12      4G/路由转发     CS=GPIO8      192.168.4.x
+
+技术特点:
+- ✅ 完全硬件SPI复用,无需软件SPI
+- ✅ 25.6MHz高速SPI通信
+- ✅ 自动SPI总线锁定/解锁机制
+- ✅ 支持并发网络数据处理
+- ✅ 独立的DHCP、DNS、NAT服务
+
+关键点:
+1. 两个网口使用相同的SPI总线(SPI0)
+2. 每个网口使用不同的CS片选引脚(WAN=GPIO12,LAN=GPIO8)
+3. SPI总线只需要配置一次,CS引脚需要单独初始化
+4. 通过LuatOS的SPI锁定机制保证通信安全
+
+=======================================================================
+]]
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+sysplus = require("sysplus")
+
+-- 引入DHCP服务器和DNS代理模块
+dhcps = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+-- 网络配置参数
+local WAN_SPI_ID = 0        -- WAN口使用SPI0(复用)
+local WAN_CS_PIN = 12        -- WAN口片选引脚
+local WAN_SPI_SPEED = 25600000  -- WAN口SPI速度
+
+local LAN_SPI_ID = 0        -- LAN口使用SPI0(复用)
+local LAN_CS_PIN = 8       -- LAN口片选引脚(必须与WAN口不同)
+local LAN_SPI_SPEED = 25600000  -- LAN口SPI速度
+
+local BOTH_SPI_SPEED = 25600000  -- SPI速度
+
+local LAN_IP = "192.168.4.1"       -- LAN口IP地址
+local LAN_MASK = "255.255.255.0"   -- LAN口子网掩码
+local LAN_GW = "192.168.4.1"       -- LAN口网关
+
+-- 网络适配器定义
+local WAN_ADAPTER = socket.LWIP_USER1  -- WAN口适配器
+local LAN_ADAPTER = socket.LWIP_USER0  -- LAN口适配器
+
+-- 网口初始化配置选项
+-- "LAN" - 只初始化LAN口
+-- "WAN" - 只初始化WAN口  
+-- "BOTH" - 同时初始化WAN口和LAN口
+local INIT_MODE = "BOTH"
+
+-- 同时初始化WAN口和LAN口
+local function init_wan_lan()
+    log.info("INIT", "开始初始化网口,模式:" .. INIT_MODE)
+    
+    -- 根据模式选择SPI ID和速度
+    local spi_id, spi_speed
+    if INIT_MODE == "WAN" then
+        spi_id = WAN_SPI_ID
+        spi_speed = WAN_SPI_SPEED
+    elseif INIT_MODE == "LAN" then
+        spi_id = LAN_SPI_ID
+        spi_speed = LAN_SPI_SPEED
+    else -- INIT_MODE == "BOTH"
+        spi_id = WAN_SPI_ID  -- 复用模式使用WAN口的SPI ID
+        spi_speed = BOTH_SPI_SPEED
+    end
+    
+    -- 配置SPI接口(只需要配置一次SPI总线)
+    local result = spi.setup(
+        spi_id,
+        nil,        -- CS由netdrv管理,这里不设置
+        0,          -- CPHA
+        0,          -- CPOL
+        8,          -- 数据宽度
+        spi_speed
+    )
+    if result ~= 0 then
+        log.error("INIT", "SPI配置失败", result)
+        return false
+    end
+    
+    -- 根据配置初始化对应的网口
+    if INIT_MODE == "WAN" or INIT_MODE == "BOTH" then
+        -- 初始化WAN口CS引脚
+        gpio.setup(WAN_CS_PIN, 1)  -- 拉高CS引脚(空闲状态)
+        gpio.setup(LAN_CS_PIN, 1)  -- 拉高CS引脚,防止干扰
+        
+        -- 初始化CH390网络驱动(WAN口)
+        log.info("INIT", "初始化WAN口网络驱动")
+        netdrv.setup(WAN_ADAPTER, netdrv.CH390, {
+            spi = WAN_SPI_ID,
+            cs = WAN_CS_PIN
+        })
+        
+        -- 启用DHCP客户端,从外网获取IP地址
+        netdrv.dhcp(WAN_ADAPTER, true)
+        
+        sys.wait(1000)  -- 等待WAN口初始化稳定
+        log.info("INIT", "WAN口初始化完成,使用SPI", WAN_SPI_ID, "CS引脚", WAN_CS_PIN)
+    end
+    
+    if INIT_MODE == "LAN" or INIT_MODE == "BOTH" then
+        -- 初始化LAN口CS引脚
+        gpio.setup(LAN_CS_PIN, 1)  -- 拉高CS引脚(空闲状态)
+        gpio.setup(WAN_CS_PIN, 1)  -- 拉高CS引脚,防止干扰
+        
+        -- 初始化CH390网络驱动(LAN口)
+        log.info("INIT", "初始化LAN口网络驱动")
+        netdrv.setup(LAN_ADAPTER, netdrv.CH390, {
+            spi = LAN_SPI_ID,
+            cs = LAN_CS_PIN
+        })
+        
+        sys.wait(2000)  -- 等待LAN口初始化稳定
+        
+        -- 配置LAN网络IP地址
+        local ipv4, mask, gw = netdrv.ipv4(LAN_ADAPTER, LAN_IP, LAN_MASK, LAN_GW)
+        log.info("LAN", "IP配置", ipv4, mask, gw)
+        log.info("INIT", "LAN口初始化完成,使用SPI", LAN_SPI_ID, "CS引脚", LAN_CS_PIN)
+    end
+    
+    log.info("INIT", "网口初始化完成,模式:" .. INIT_MODE)
+    return true
+end
+
+-- 等待网络连接并设置服务
+local function setup_network_services()
+    log.info("NET", "开始配置网络服务")
+    
+    -- 根据初始化模式等待对应网口连接
+    if INIT_MODE == "LAN" or INIT_MODE == "BOTH" then
+        -- 等待LAN口以太网连接建立
+        while netdrv.link(LAN_ADAPTER) ~= true do
+            log.info("NET", "等待LAN口以太网连接...")
+            sys.wait(100)
+        end
+        log.info("NET", "LAN口以太网连接已建立")
+    end
+    
+    -- 等待4G网络连接建立(用于NAT转发)
+    if INIT_MODE == "LAN" or INIT_MODE == "BOTH" then
+        while netdrv.link(socket.LWIP_GP) ~= true do
+            log.info("NET", "等待4G网络连接...")
+            sys.wait(100)
+        end
+        log.info("NET", "4G网络连接已建立")
+        
+        -- 启动DHCP服务器,为局域网设备分配IP地址
+        dhcps.create({adapter = LAN_ADAPTER})
+        log.info("NET", "DHCP服务器已启动")
+        
+        -- 启动DNS代理服务,转发DNS查询请求
+        dnsproxy.setup(LAN_ADAPTER, socket.LWIP_GP)
+        log.info("NET", "DNS代理服务已启动")
+        
+        -- 启用NAT转发功能,实现内网与外网的地址转换
+        netdrv.napt(socket.LWIP_GP)
+        log.info("NET", "NAT转发已启用")
+        
+        -- 如果支持iperf,启动网络性能测试服务器
+        if iperf then
+            log.info("NET", "启动iperf服务器端")
+            iperf.server(LAN_ADAPTER)
+        end
+    end
+    
+    log.info("NET", "网络服务配置完成")
+end
+
+-- 网络状态监控
+local function network_monitor()
+    while true do
+        sys.wait(10000)  -- 每10秒检查一次
+        
+        local status_info = {}
+        
+        -- 根据初始化模式检查对应网口状态
+        if INIT_MODE == "WAN" or INIT_MODE == "BOTH" then
+            local wan_link = netdrv.link(WAN_ADAPTER)
+            local wan_ready = netdrv.ready(WAN_ADAPTER)
+            table.insert(status_info, string.format("WAN: link=%s ready=%s", tostring(wan_link), tostring(wan_ready)))
+        end
+        
+        if INIT_MODE == "LAN" or INIT_MODE == "BOTH" then
+            local lan_link = netdrv.link(LAN_ADAPTER)
+            local lan_ready = netdrv.ready(LAN_ADAPTER)
+            table.insert(status_info, string.format("LAN: link=%s ready=%s", tostring(lan_link), tostring(lan_ready)))
+        end
+        
+        -- 检查4G网络状态
+        local gprs_link = netdrv.link(socket.LWIP_GP)
+        local gprs_ready = netdrv.ready(socket.LWIP_GP)
+        table.insert(status_info, string.format("4G: link=%s ready=%s", tostring(gprs_link), tostring(gprs_ready)))
+        
+        log.info("状态", table.concat(status_info, ", "))
+        
+        -- 输出内存使用情况
+        log.info("内存", "Lua:", rtos.meminfo())
+        log.info("内存", "Sys:", rtos.meminfo("sys"))
+    end
+end
+
+-- 主初始化任务
+sys.taskInit(function()
+    if init_wan_lan() then
+        log.info("INIT", "网口初始化成功")
+        -- 初始化成功后,启动网络服务
+        setup_network_services()
+    else
+        log.error("INIT", "网口初始化失败")
+    end
+end)
+
+-- 网络监控任务
+sys.taskInit(network_monitor)
+
+-- 事件处理
+sys.subscribe("IP_READY", function(adapter)
+    log.info("事件", "IP_READY", adapter)
+    if adapter == WAN_ADAPTER and (INIT_MODE == "WAN" or INIT_MODE == "BOTH") then
+        log.info("事件", "WAN口IP就绪")
+    elseif adapter == LAN_ADAPTER and (INIT_MODE == "LAN" or INIT_MODE == "BOTH") then
+        log.info("事件", "LAN口IP就绪")
+    elseif adapter == socket.LWIP_GP then
+        log.info("事件", "4G网络IP就绪")
+    end
+end)
+
+sys.subscribe("IP_LOSE", function(adapter)
+    log.info("事件", "IP_LOSE", adapter)
+    if adapter == WAN_ADAPTER and (INIT_MODE == "WAN" or INIT_MODE == "BOTH") then
+        log.warn("事件", "WAN口IP丢失")
+    elseif adapter == LAN_ADAPTER and (INIT_MODE == "LAN" or INIT_MODE == "BOTH") then
+        log.warn("事件", "LAN口IP丢失")
+    elseif adapter == socket.LWIP_GP then
+        log.warn("事件", "4G网络IP丢失")
+    end
+end)

+ 41 - 0
luat/demo/netdrv/ch390_wan_lan_spi0/main.lua

@@ -0,0 +1,41 @@
+--[[
+CH390双网口SPI0复用演示程序
+功能:通过单个SPI总线连接两个CH390芯片,实现WAN和LAN口功能
+特点:
+- 使用SPI0总线复用两个CH390设备
+- WAN口:CS=GPIO12,用于外网连接
+- LAN口:CS=GPIO8,用于内网管理
+- 通过CS片选信号实现设备选择
+- 支持DHCP、DNS代理、NAT转发等完整网关功能
+]]
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ch390_spi_mux"
+VERSION = "1.0.0"
+
+-- 使用合宙iot平台时需要这个参数
+PRODUCT_KEY = "xxx" -- 到 iot.openluat.com 创建项目,获取正确的项目id
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+sysplus = require("sysplus")
+
+log.info("SPI复用", "CH390双网口演示程序启动")
+log.info("硬件初始化", "配置CH390供电控制")
+
+-- CH390 LAN口供电控制
+log.info("LAN供电", "打开LAN口CH390供电 GPIO20")
+gpio.setup(20, 1)  -- 打开LAN口供电
+
+-- CH390 WAN口供电控制  
+log.info("WAN供电", "打开WAN口CH390供电 GPIO29")
+gpio.setup(29, 1)  -- 打开WAN口供电
+
+-- 加载双网口复用核心逻辑
+require "lan_wan"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!
+

BIN
module/Air780EGH/core/LuatOS-SoC_V2007_Air780EGH.soc


+ 29 - 0
module/Air780EGH/demo/pwm/breathing_led.lua

@@ -0,0 +1,29 @@
+--[[
+@module  breathing_led
+@summary PWM呼吸灯效果模块
+@version 1.0
+@date    2025.07.08
+@author  王世豪
+@usage
+使用Air780EGH核心板的GPIO引脚输出PWM波形,演示呼吸灯效果。
+]]
+
+local PWM_ID = 0
+local function breathing_led()
+    log.info("pwm", "ch", PWM_ID)
+    while 1 do
+        -- 仿呼吸灯效果
+        log.info("pwm", ">>>>>")
+        for i = 10, 1, -1 do 
+            pwm.open(PWM_ID, 1000, i*9) -- 频率1000hz, 占空比从 90% 递减到 9%
+            sys.wait(100 + i*10) 
+        end
+        for i = 10, 1, -1 do 
+            pwm.open(PWM_ID, 1000, 100 - i*9) -- 频率1000hz, 占空比从 10% 递增到 91%
+            sys.wait(100 + i*10)
+        end
+        sys.wait(2000)
+    end
+end
+
+sys.taskInit(breathing_led)

+ 69 - 0
module/Air780EGH/demo/pwm/main.lua

@@ -0,0 +1,69 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.07.08
+@author  王世豪
+@usage
+本demo演示的核心功能为:
+1. 加载pwm输出模块,控制GPIO引脚输出PWM波形
+2. 加载呼吸灯效果模块,控制GPIO引脚输出呼吸灯效果
+
+更多说明参考本目录下的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这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "pwm"
+VERSION = "001.000.000"
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+-- 如果内核固件支持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_output"
+
+-- -- 加载呼吸灯效果模块
+-- require "breathing_led"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 26 - 0
module/Air780EGH/demo/pwm/pwm_output.lua

@@ -0,0 +1,26 @@
+--[[
+@module  pwm_output
+@summary PWM输出模块
+@version 1.0
+@date    2025.07.08
+@author  王世豪
+@usage
+使用Air780EGH核心板的GPIO引脚输出PWM波形,演示不同占空比的PWM波形输出效果。
+]]
+
+local PWM_ID = 0
+local function pwm_output()
+    while true do
+        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为10/1000=1% 持续输出
+        pwm.open(PWM_ID, 1000, 10, 0, 1000)
+        sys.wait(1000)
+        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为500/1000=50% 持续输出
+        pwm.open(PWM_ID, 1000, 500, 0, 1000)
+        sys.wait(1000)
+        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为1000/1000=100% 持续输出
+        pwm.open(PWM_ID, 1000, 1000, 0, 1000)
+        sys.wait(1000)
+    end
+end
+
+sys.taskInit(pwm_output)

+ 32 - 0
module/Air780EGH/demo/pwm/readme.md

@@ -0,0 +1,32 @@
+
+## 演示功能概述
+
+将使用Air780EGH核心板,演示PWM控制GPIO引脚输出PWM波形,以及控制GPIO引脚输出呼吸灯效果。
+
+## 演示硬件环境
+
+1、Air780EGH核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EGH核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到on一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EGH V2008版本固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)(测试使用V2008 1号固件)
+
+## 演示核心步骤
+
+1、搭建好演示硬件环境
+
+2、通过Luatools将demo与固件烧录到核心板中
+
+3、烧录成功后,自动开机运行
+
+4、接下来通过示波器查看波形,使用发光二极管演示呼吸灯效果。

+ 0 - 0
module/Air780EHM/.keep


+ 0 - 0
module/Air780EHM/core/.keep


BIN
module/Air780EHM/core/LuatOS-SoC_V2007_Air780EHM.soc


BIN
module/Air780EHV/CORE/LuatOS-SoC_V2007_Air780EHV.soc


+ 29 - 0
module/Air780EHV/DEMO/pwm/breathing_led.lua

@@ -0,0 +1,29 @@
+--[[
+@module  breathing_led
+@summary PWM呼吸灯效果模块
+@version 1.0
+@date    2025.07.08
+@author  王世豪
+@usage
+使用Air780EHV核心板的GPIO引脚输出PWM波形,演示呼吸灯效果。
+]]
+
+local PWM_ID = 0
+local function breathing_led()
+    log.info("pwm", "ch", PWM_ID)
+    while 1 do
+        -- 仿呼吸灯效果
+        log.info("pwm", ">>>>>")
+        for i = 10, 1, -1 do 
+            pwm.open(PWM_ID, 1000, i*9) -- 频率1000hz, 占空比从 90% 递减到 9%
+            sys.wait(100 + i*10) 
+        end
+        for i = 10, 1, -1 do 
+            pwm.open(PWM_ID, 1000, 100 - i*9) -- 频率1000hz, 占空比从 10% 递增到 91%
+            sys.wait(100 + i*10)
+        end
+        sys.wait(2000)
+    end
+end
+
+sys.taskInit(breathing_led)

+ 69 - 0
module/Air780EHV/DEMO/pwm/main.lua

@@ -0,0 +1,69 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.07.08
+@author  王世豪
+@usage
+本demo演示的核心功能为:
+1. 加载pwm输出模块,控制GPIO引脚输出PWM波形
+2. 加载呼吸灯效果模块,控制GPIO引脚输出呼吸灯效果
+
+更多说明参考本目录下的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这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "pwm"
+VERSION = "001.000.000"
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+-- 如果内核固件支持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_output"
+
+-- -- 加载呼吸灯效果模块
+-- require "breathing_led"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 26 - 0
module/Air780EHV/DEMO/pwm/pwm_output.lua

@@ -0,0 +1,26 @@
+--[[
+@module  pwm_output
+@summary PWM输出模块
+@version 1.0
+@date    2025.07.08
+@author  王世豪
+@usage
+使用Air780EHV核心板的GPIO引脚输出PWM波形,演示不同占空比的PWM波形输出效果。
+]]
+
+local PWM_ID = 0
+local function pwm_output()
+    while true do
+        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为10/1000=1% 持续输出
+        pwm.open(PWM_ID, 1000, 10, 0, 1000) -- 小灯微微发光
+        sys.wait(1000)
+        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为500/1000=50% 持续输出
+        pwm.open(PWM_ID, 1000, 500, 0, 1000) -- 小灯中等亮度
+        sys.wait(1000)
+        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为1000/1000=100% 持续输出
+        pwm.open(PWM_ID, 1000, 1000, 0, 1000) -- 小灯很高亮度
+        sys.wait(1000)
+    end
+end
+
+sys.taskInit(pwm_output)

+ 32 - 0
module/Air780EHV/DEMO/pwm/readme.md

@@ -0,0 +1,32 @@
+
+## 演示功能概述
+
+将使用Air780EHV核心板,演示PWM控制GPIO引脚输出PWM波形,以及控制GPIO引脚输出呼吸灯效果。
+
+## 演示硬件环境
+
+1、Air780EHV核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EHV核心板和数据线的硬件接线方式为
+
+- Air780EHV核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到on一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EHV V2008版本固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)(测试使用V2008 1号固件)
+
+## 演示核心步骤
+
+1、搭建好演示硬件环境
+
+2、通过Luatools将demo与固件烧录到核心板中
+
+3、烧录成功后,自动开机运行
+
+4、接下来通过示波器查看波形,使用发光二极管演示呼吸灯效果。

BIN
module/Air780EPM/core/LuatOS-SoC_V2003_Air780EPM/LuatOS-SoC_V2003_Air780EPM.soc


+ 0 - 32
module/Air780EPM/core/LuatOS-SoC_V2003_Air780EPM/release_note.txt

@@ -1,32 +0,0 @@
-Air780EPM第一版固件V2003
-支持的功能
-1、GPIO 
-2、UART 
-3、I2C  
-4、SPI  
-5、ADC  
-6、PWM  
-7、WDT  
-8、PM  
-9、RTC 
-10、WLAN 
-11、SMS  
-12、CRYPTO  
-13、CJSON  
-14、ZBUFF  
-15、PACK  
-16、MINIZ 
-17、HMETA 
-18、FSKV 
-19、EINK
-20、MQTT 
-21、FTP 
-22、WEBSOCKET 
-23、IOTAUTH 
-24、BIT64 
-25、ICONV 
-26、PROTOBUF 
-27、RSA      
-28、GMSSL    
-29、CAMERA 
-30、LCD

BIN
module/Air780EPM/core/LuatOS-SoC_V2004_Air780EPM.soc


BIN
module/Air780EPM/core/LuatOS-SoC_V2005_Air780EPM.soc


BIN
module/Air780EPM/core/LuatOS-SoC_V2007_Air780EPM.soc


+ 38 - 19
module/Air8000/core/Air8000_FetchCore&CoreChangeLog.md

@@ -2,6 +2,23 @@
 
 ## 最新版本
 
+![image-20250707193502347](air8000_core_1-11.png)
+
+#### 2025.07.07
+
+根据不同的核心库功能,拆分组合成多个固件,通过固件名称后的数字区分。具体每个固件的功能可参考固件版本对应关系的表格。
+
+[Air8000_1-11_20250707.zip](https://docs.openluat.com/cdn2/tmp/Air8000_1-11_20250707.zip)
+
+1. 修复ftp,在wifi环境下无法使用。
+2. 修复蓝牙write发送数据死机。
+3. 修复ch390不能复用一个spi的问题。
+4. 添加支持SFUD库
+5. 添加支持airtalk库
+6. 添加支持U8G2库
+
+## 历史版本
+
 #### 2025.06.27
 
 [LuatOS-SoC_V2008_Air8000_LVGL_0627](https://docs.openluat.com/cdn2/Air8000/LuatOS-SoC_V2008_Air8000_LVGL_0627.soc)
@@ -10,7 +27,12 @@
 
 [LuatOS-SoC_V2008_Air8000_FS_0627](https://docs.openluat.com/cdn2/Air8000/LuatOS-SoC_V2008_Air8000_FS_0627.soc)
 
-## 历史版本
+1. http请求没有加回调函数时添加asset异常提示。
+2. 修复FS版本使用vsim功能出现死机的问题。
+3. 修复蓝牙连接后有概率出现死机的问题。
+4. 蓝牙功能目前已实现主机模式(扫描+主动连接),从机模式(广播+被动连接),仅广播(典型应用ibeacon),仅观察(扫描)
+5. 支持httpdns指定adapter网络适配器id,使用不同的网络进行请求。
+6. 修复tcs3472,读不到元器件时返回空数据,会报错。
 
 #### 2025.06.23
 
@@ -20,12 +42,24 @@
 
 [LuatOS-SoC_V2008_Air8000_FS_0623](https://docs.openluat.com/cdn2/Air8000/LuatOS-SoC_V2008_Air8000_FS_0623.soc)
 
+1. VOLTE固件 修复接收短信死机和电信卡只能接收一条短信的问题。
+2. 修复无法控制GPIO141。
+
 #### 2025.06.21
 
 [LuatOS-SoC_V2008_Air8000_LVGL_0621](https://docs.openluat.com/cdn2/Air8000/LuatOS-SoC_V2008_Air8000_LVGL_0621.soc)
 
 [LuatOS-SoC_V2008_Air8000_FS_0621](https://docs.openluat.com/cdn2/Air8000/LuatOS-SoC_V2008_Air8000_FS_0621.soc)
 
+1. 目前可支持ble低功耗蓝牙广播、从机模式、扫描蓝牙功能。(当前的蓝牙api功能仍处于调试阶段,后续可能还会对api做改动)
+2. gpio.get接口支持获取>128gpio输入输出模式的电平状态。
+3. 添加airlink.power接口,可控制wifi供电和运行状态。
+4. 修复sms.send发送超长短信会死机。限制短信发送长度超过140字节,会直接拒绝发送。
+5. 修复Air8000G读不到充电ic。
+6. fs 兼容a+b模式打开文件。
+7. 支持wifi进入休眠 light和deep模式。
+8. 支持使用pm.wakeupPin接口配置唤醒wifi休眠的gpio。
+
 #### 2025.06.10
 
 [LuatOS-SoC_V2007_Air8000_LVGL_0610](https://docs.openluat.com/cdn2/Air8000/LuatOS-SoC_V2007_Air8000_LVGL_0610.soc)
@@ -56,34 +90,19 @@
 
 ## 固件更新记录
 
-#### 2025.06.27
-
-1. http请求没有加回调函数时添加asset异常提示。
-2. 修复FS版本使用vsim功能出现死机的问题。
-3. 修复蓝牙连接后有概率出现死机的问题。
-4. 蓝牙功能目前已实现主机模式(扫描+主动连接),从机模式(广播+被动连接),仅广播(典型应用ibeacon),仅观察(扫描)
-5. 支持httpdns指定adapter网络适配器id,使用不同的网络进行请求。
-6. 修复tcs3472,读不到元器件时返回空数据,会报错。
+6. 
 
 
 
 #### 2025.06.23
 
-1. VOLTE固件 修复接收短信死机和电信卡只能接收一条短信的问题。
-2. 修复无法控制GPIO141。
+1. 
 
 
 
 #### 2025.06.21
 
-1. 目前可支持ble低功耗蓝牙广播、从机模式、扫描蓝牙功能。(当前的蓝牙api功能仍处于调试阶段,后续可能还会对api做改动)
-2. gpio.get接口支持获取>128gpio输入输出模式的电平状态。
-3. 添加airlink.power接口,可控制wifi供电和运行状态
-4. 修复sms.send发送超长短信会死机。限制短信发送长度超过140字节,会直接拒绝发送。
-5. 修复Air8000G读不到充电ic。
-6. fs 兼容a+b模式打开文件。
-7. 支持wifi进入休眠 light和deep模式。
-8. 支持使用pm.wakeupPin接口配置唤醒wifi休眠的gpio。
+1. 
 
 
 

BIN
module/Air8000/core/air8000_core_1-11.png


+ 80 - 76
module/Air8000/core/固件功能列表.md

@@ -1,82 +1,86 @@
 
 # 1.不同版本的区别
 
-| 序号 | 核心库名称                      | 简介                                | 类别     | 8000_FS | 8000_VOLTE | 8000_LVGL |
-| ---- | ------------------------------- | ----------------------------------- | -------- | ------- | ---------- | --------- |
-| 1    | [adc](adc.md)                   | 模数转换                            | 外设驱动 | √       | √          | √         |
-| 2    | [arlink](arlink.md)             | 多网融合协议                        | 协议组件 | √       | √          | √         |
-| 3    | [audio](audio.md)               | 模数转换                            | 外设驱动 | ×       | √          | √         |
-| 4    | [bit64](bit64.md)               | 模数转换                            | 外设驱动 | √       | √          | √         |
-| 5    | [ble](ble.md)                   | 蓝牙功能                            | 通信组件 | √       | √          | √         |
-| 6    | [camera](camera.md)             | 模数转换                            | 外设驱动 | √       | √          | √         |
-| 7    | [can](can.md)                   | can操作库                           | 外设驱动 | √       | √          | √         |
-| 8    | [cc](cc.md)                     | VoLTE通话功能                       | 通信组件 | ×       | √          | ×         |
-| 9    | [codec](codec.md)               | 多媒体-编解码                       | 基础软件 | ×       | √          | √         |
-| 10   | [crypto](crypto.md)             | 加解密和hash函数                    | 加密解密 | √       | √          | √         |
-| 11   | [eink](eink.md)                 | 墨水屏操作库                        | 外设驱动 | √       | √          | √         |
-| 12   | [errDump](errDump.md)           | 错误上报                            | 基础软件 | √       | √          | √         |
-| 13   | [fastlz](fastlz.md)             | FastLZ压缩                          | 基础软件 | ×       | √          | √         |
-| 14   | [fatfs](fatfs.md)               | SD卡的接口                          | 基础软件 | ×       | √          | √         |
-| 15   | [fonts](fonts.md)               | 字体库                              | 基础软件 | √       | √          | √         |
-| 16   | [fota](fota.md)                 | 底层固件升级                        | 基础软件 | √       | √          | √         |
-| 17   | [fs](fs.md)                     | 文件系统额外操作                    | 基础软件 | √       | √          | √         |
-| 18   | [fskv](fskv.md)                 | kv数据库,掉电不丢数据               | 基础软件 | √       | √          | √         |
-| 19   | [ftp](ftp.md)                   | ftp 客户端                          | 协议组件 | √       | √          | √         |
-| 20   | [gmssl](gmssl.md)               | 国密算法(SM2/SM3/SM4)               | 加密解密 | √       | √          | √         |
-| 21   | [gpio](gpio.md)                 | GPIO操作                            | 外设驱动 | √       | √          | √         |
-| 22   | [gtfont](gtfont.md)             | 高通字库芯片                        | 外设驱动 | ×       | √          | √         |
-| 23   | [hmeta](hmeta.md)               | 硬件元数据                          | 通信组件 | √       | √          | √         |
-| 24   | [ht1621](ht1621.md)             | 断码屏                              | 外设驱动 | ×       | √          | √         |
-| 25   | [http](http.md)                 | http 客户端                         | 协议组件 | √       | √          | √         |
-| 26   | [httpsrv](httpsrv.md)           | http服务端                          | 协议组件 | √       | √          | √         |
-| 27   | [i2c](i2c.md)                   | I2C操作                             | 外设驱动 | √       | √          | √         |
-| 28   | [i2s](i2s.md)                   | 数字音频                            | 外设驱动 | ×       | √          | √         |
-| 29   | [iconv](iconv.md)               | iconv操作                           | 基础软件 | √       | √          | √         |
-| 30   | [io](io.md)                     | io操作(扩展)                        | 基础软件 | √       | √          | √         |
-| 31   | [ioqueue](ioqueue.md)           | io序列操作                          | 基础软件 | √       | √          | √         |
-| 32   | [iotauth](iotauth.md)           | IoT鉴权库, 用于生成各种云平台的参数 | 协议组件 | √       | √          | √         |
-| 33   | [iperf](iperf.md)               | 吞吐量测试                          | 通信组件 | √       | √          | √         |
-| 34   | [json](json.md)                 | json生成和解析库                    | 基础软件 | √       | √          | √         |
-| 35   | [lcd](lcd.md)                   | lcd驱动模块                         | 外设驱动 | √       | √          | √         |
-| 36   | [libgnss](libgnss.md)           | NMEA数据处理                        |          | √       | √          | √         |
-| 37   | [little_flash](little_flash.md) | NAND flash操作                      | 协议组件 | ×       | √          | √         |
-| 38   | [log](log.md)                   | 日志库                              | 基础软件 | √       | √          | √         |
-| 39   | [lora2](lora2.md)               | lora2驱动模块(支持多挂)             | 外设驱动 | ×       | √          | √         |
-| 40   | [lvgl](lvgl.md)                 | LVGL图像库                          | 基础软件 | ×       | ×          | √         |
-| 41   | [mcu](mcu.md)                   | 封装mcu一些特殊操作                 | 基础软件 | √       | √          | √         |
-| 42   | [miniz](miniz.md)               | 简易zlib压缩                        | 基础软件 | √       | √          | √         |
-| 43   | [mobile](mobile.md)             | 蜂窝网络                            | 通信组件 | √       | √          | √         |
-| 44   | [mqtt](mqtt.md)                 | mqtt客户端                          | 协议组件 | √       | √          | √         |
-| 45   | [modbus](modbus.md)             | modbus RTU和TCP                     | 协议组件 | √       | √          | √         |
-| 46   | [netdrv](netdrv.md)             | 网络设备管理                        | 外设驱动 | √       | √          | √         |
-| 47   | [onewire](onewire.md)           | 单总线协议驱动                      | 外设驱动 | √       | √          | √         |
-| 48   | [os](os.md)                     | os操作                              | 基础软件 | √       | √          | √         |
-| 49   | [otp](otp.md)                   | OTP操作库                           | 基础软件 | ×       | √          | √         |
-| 50   | [pack](pack.md)                 | 打包和解包格式串                    | 基础软件 | √       | √          | √         |
-| 51   | [pins](pins.md)                 | 管脚复用                            | 外设驱动 | √       | √          | √         |
-| 52   | [pm](pm.md)                     | 电源管理                            | 基础软件 | √       | √          | √         |
-| 53   | [protobuf](protobuf.md)         | ProtoBuffs编解码                    | 基础软件 | √       | √          | √         |
-| 54   | [pwm](pwm.md)                   | PWM模块                             | 外设驱动 | √       | √          | √         |
-| 55   | [rsa](rsa.md)                   | RSA加密解密                         | 加密解密 | √       | √          | √         |
-| 56   | [rtc](rtc.md)                   | 实时时钟                            | 基础软件 | √       | √          | √         |
-| 57   | [rtos](rtos.md)                 | RTOS底层操作库                      | 基础软件 | √       | √          | √         |
-| 58   | [sfud](sfud.md)                 | 开源sfud软件包,复杂SPI操作          | 外设驱动 | ×       | √          | √         |
-| 59   | [sms](sms.md)                   | 短信                                | 通信组件 | √       | √          | √         |
-| 60   | [socket](socket.md)             | 网络接口                            | 协议组件 | √       | √          | √         |
-| 61   | [spi](spi.md)                   | spi操作库                           | 外设驱动 | √       | √          | √         |
-| 62   | [string](string.md)             | 字符串操作函数                      | 基础软件 | √       | √          | √         |
-| 63   | [sys](sys.md)                   | sys库                               | 基础软件 | √       | √          | √         |
-| 64   | [sysplus](sysplus.md)           | sys库的强力补充                     | 基础软件 | √       | √          | √         |
-| 65   | [tp](tp.md)                     | 触摸库                              | 外设驱动 | √       | √          | √         |
-| 66   | [u8g2](u8g2.md)                 | u8g2                                | 外设驱动 | √       | √          | √         |
-| 67   | [uart](uart.md)                 | 串口操作库                          | 外设驱动 | √       | √          | √         |
-| 68   | [wdt](wdt.md)                   | watchdog操作库                      |          | √       | √          | √         |
-| 69   | [websocket](websocket.md)       | websocket客户端                     | 基础软件 | √       | √          | √         |
-| 70   | [wlan](wlan.md)                 | 局域网操作                          | 协议组件 | √       | √          | √         |
-| 71   | [xxtea](xxtea.md)               | xxtea加密解密                       | 加密解密 | √       | √          | √         |
-| 72   | [yhm27xx](yhm27xx.md)           | yhm27xx充电芯片                     | 外设驱动 | ×       | √          | √         |
-| 73   | [ymodem](ymodem.md)             | ymodem协议                          | 基础软件 | ×       | √          | √         |
-| 74   | [zbuff](zbuff.md)               | c内存数据操作库                     | 基础软件 | √       | √          | √         |
+| 核心库名称                                            | 简介                                | 类别     | 1     | 2     | 3     | 4      | 5      | 6      | 7      | 8      | 9      | 10     | 11        |
+| ----------------------------------------------------- | ----------------------------------- | -------- | ----- | ----- | ----- | ------ | ------ | ------ | ------ | ------ | ------ | ------ | --------- |
+| [airui](typora://app/typemark/lvgl.md)                | airui 人机交互处理界面              | 基础软件 | **x** | √     | √     | √      | **x**  | √      | **x**  | **x**  | **x**  | **x**  | **x**     |
+| [tts](typora://app/typemark/tts.md)                   | 文字转语音                          | 基础软件 | √     | **x** | √     | **x**  | √      | **x**  | √      | **x**  | **x**  | **x**  | **x**     |
+| [cc](typora://app/typemark/cc.md)                     | VoLTE通话功能                       | 通信组件 | √     | √     | **x** | **x**  | **x**  | **x**  | **x**  | √      | **x**  | **x**  | **x**     |
+| talk                                                  | 对讲                                | 通信组件 | **x** | **x** | **x** | √      | √      | **x**  | **x**  | **x**  | √      | **x**  | **x**     |
+| 脚本区                                                | 代码空间                            | 基础软件 | 512KB | 512KB | 512KB | 512KB  | 512KB  | 512KB  | 512KB  | 512KB  | 512KB  | 512KB  | **256KB** |
+| [fs](typora://app/typemark/fs.md)                     | 文件系统                            | 基础软件 | 768KB | 640KB | 512KB | 1280KB | 1408KB | 1408KB | 1536KB | 1792KB | 2304KB | 2432KB | 3584KB    |
+| [adc](typora://app/typemark/adc.md)                   | 模数转换                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [arlink](typora://app/typemark/arlink.md)             | 多网融合协议                        | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [audio](typora://app/typemark/audio.md)               | 模数转换                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [bit64](typora://app/typemark/bit64.md)               | 模数转换                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [ble](typora://app/typemark/ble.md)                   | 蓝牙功能                            | 通信组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [camera](typora://app/typemark/camera.md)             | 模数转换                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
+| [can](typora://app/typemark/can.md)                   | can操作库                           | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [codec](typora://app/typemark/codec.md)               | 多媒体-编解码                       | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
+| [crypto](typora://app/typemark/crypto.md)             | 加解密和hash函数                    | 加密解密 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [eink](typora://app/typemark/eink.md)                 | 墨水屏操作库                        | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [errDump](typora://app/typemark/errDump.md)           | 错误上报                            | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [fastlz](typora://app/typemark/fastlz.md)             | FastLZ压缩                          | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
+| [fatfs](typora://app/typemark/fatfs.md)               | SD&TF卡的接口                       | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
+| [fonts](typora://app/typemark/fonts.md)               | 字体库                              | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [fota](typora://app/typemark/fota.md)                 | 底层固件升级                        | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [fskv](typora://app/typemark/fskv.md)                 | kv数据库,掉电不丢数据               | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [ftp](typora://app/typemark/ftp.md)                   | ftp 客户端                          | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [gmssl](typora://app/typemark/gmssl.md)               | 国密算法(SM2/SM3/SM4)               | 加密解密 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [gpio](typora://app/typemark/gpio.md)                 | GPIO操作                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [gtfont](typora://app/typemark/gtfont.md)             | 高通字库芯片                        | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
+| [hmeta](typora://app/typemark/hmeta.md)               | 硬件元数据                          | 通信组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [ht1621](typora://app/typemark/ht1621.md)             | 断码屏                              | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [http](typora://app/typemark/http.md)                 | http 客户端                         | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [httpsrv](typora://app/typemark/httpsrv.md)           | http服务端                          | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [i2c](typora://app/typemark/i2c.md)                   | I2C操作                             | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [i2s](typora://app/typemark/i2s.md)                   | 数字音频                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [iconv](typora://app/typemark/iconv.md)               | iconv操作                           | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [io](typora://app/typemark/io.md)                     | io操作(扩展)                        | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [ioqueue](typora://app/typemark/ioqueue.md)           | io序列操作                          | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [iotauth](typora://app/typemark/iotauth.md)           | IoT鉴权库, 用于生成各种云平台的参数 | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [iperf](typora://app/typemark/iperf.md)               | 吞吐量测试                          | 通信组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [json](typora://app/typemark/json.md)                 | json生成和解析库                    | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [lcd](typora://app/typemark/lcd.md)                   | lcd驱动模块                         | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [libgnss](typora://app/typemark/libgnss.md)           | NMEA数据处理                        |          | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [little_flash](typora://app/typemark/little_flash.md) | NAMD flash操作                      | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
+| [log](typora://app/typemark/log.md)                   | 日志库                              | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [lora2](typora://app/typemark/lora2.md)               | lora2驱动模块(支持多挂)             | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [mcu](typora://app/typemark/mcu.md)                   | 封装mcu一些特殊操作                 | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [miniz](typora://app/typemark/miniz.md)               | 简易zlib压缩                        | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [mobile](typora://app/typemark/mobile.md)             | 蜂窝网络                            | 通信组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [mqtt](typora://app/typemark/mqtt.md)                 | mqtt客户端                          | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [modbus](typora://app/typemark/modbus.md)             | modbus RTU和TCP                     | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [netdrv](typora://app/typemark/netdrv.md)             | 网络设备管理                        | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [onewire](typora://app/typemark/onewire.md)           | 单总线协议驱动                      | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [os](typora://app/typemark/os.md)                     | os操作                              | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [otp](typora://app/typemark/otp.md)                   | OTP操作库                           | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [pack](typora://app/typemark/pack.md)                 | 打包和解包格式串                    | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [pins](typora://app/typemark/pins.md)                 | 管脚复用                            | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [pm](typora://app/typemark/pm.md)                     | 电源管理                            | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [protobuf](typora://app/typemark/protobuf.md)         | ProtoBuffs编解码                    | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [pwm](typora://app/typemark/pwm.md)                   | PWM模块                             | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [rsa](typora://app/typemark/rsa.md)                   | RSA加密解密                         | 加密解密 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [rtc](typora://app/typemark/rtc.md)                   | 实时时钟                            | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [rtos](typora://app/typemark/rtos.md)                 | RTOS底层操作库                      | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [sfud](typora://app/typemark/sfud.md)                 | 开源sfud软件包,复杂SPI操作          | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [sms](typora://app/typemark/sms.md)                   | 短信                                | 通信组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [socket](typora://app/typemark/socket.md)             | 网络接口                            | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [spi](typora://app/typemark/spi.md)                   | spi操作库                           | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [string](typora://app/typemark/string.md)             | 字符串操作函数                      | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [sys](typora://app/typemark/sys.md)                   | sys库                               | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [sysplus](typora://app/typemark/sysplus.md)           | sys库的强力补充                     | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [tp](typora://app/typemark/tp.md)                     | 触摸库                              | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [u8g2](typora://app/typemark/u8g2.md)                 | u8g2                                | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [uart](typora://app/typemark/uart.md)                 | 串口操作库                          | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [wdt](typora://app/typemark/wdt.md)                   | watchdog操作库                      | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [websocket](typora://app/typemark/websocket.md)       | websocket客户端                     | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [wlan](typora://app/typemark/wlan.md)                 | 局域网操作                          | 协议组件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [xxtea](typora://app/typemark/xxtea.md)               | xxtea加密解密                       | 加密解密 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [yhm27xx](typora://app/typemark/yhm27xx.md)           | yhm27xx充电芯片                     | 外设驱动 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [ymodem](typora://app/typemark/ymodem.md)             | ymodem协议                          | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| [zbuff](typora://app/typemark/zbuff.md)               | c内存数据操作库                     | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | √         |
+| 12号中文字库                                          | 中文字库                            | 基础软件 | √     | √     | √     | √      | √      | √      | √      | √      | √      | √      | **x**     |
 
 # 2. 可用空间区别
 

+ 50 - 58
module/Air8000/demo/ble/ibeacon/main.lua

@@ -1,70 +1,62 @@
---[[
-@module  main
-@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
-@version 1.0
-@date    2025.07.01
-@author  wangshihao
-@usage
-本demo演示的核心功能为:
-Air8000核心板演示ibeacon功能;
-iBeacon是一种基于蓝牙低功耗(BLE)技术的室内定位和近场通信技术,
-它允许设备在一定范围内周期性广播ibeacon信息,从而实现位置感知和交互功能。
-本demo中,Air8000核心板作为ibeacon设备,定期广播ibeacon信号,
-其他支持ibeacon的设备可以接收这些信号并进行相应的处理。
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
 
-更多说明参考本目录下的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这三位数字必须存在,但是没有任何用处,可以一直写为000
-        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-]]
-PROJECT = "ble_ibeacon"
-VERSION = "001.000.000"
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
 
 log.info("main", "project name is ", PROJECT, "version is ", VERSION)
 
--- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
--- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
-if wdt then
-    --配置喂狗超时时间为9秒钟
-    wdt.init(9000)
-    --启动一个循环定时器,每隔3秒钟喂一次狗
-    sys.timerLoopStart(wdt.feed, 3000)
-end
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val) gpio.set(23, val) end
 
--- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
--- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
--- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
--- 启动errDump日志存储并且上传功能,600秒上传一次
--- if errDump then
---     errDump.config(true, 600)
--- end
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
 
--- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
--- 可以使用合宙的iot.openluat.com平台进行远程升级
--- 也可以使用客户自己搭建的平台进行远程升级
--- 远程升级的详细用法,可以参考fota的demo进行使用
+function ble_callback()
+    -- 无事可做
+end
 
--- 启动一个循环定时器
--- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
--- 方便分析内存使用是否有异常
--- sys.timerLoopStart(function()
---     log.info("mem.lua", rtos.meminfo())
---     log.info("mem.sys", rtos.meminfo("sys"))
--- end, 3000)
+sys.taskInit(function()
+    local ret = 0
+    sys.wait(500)
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    sys.wait(100)
 
--- 如果需要升级WIFI固件,请打开下面注释
-require "check_wifi"
+    sys.wait(100)
+    log.info("开始设置广播内容")
+    local adv_data = string.char(0x4C, 0x00,
+                                0x02, 0x15, 0x01, 0x02, 0x03, 0x04, 0x05,
+                                        0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
+                                        0x00, 0x01,
+                                        0x00, 0x02,
+                                        0x00)
+    ble_device:adv_create({
+        addr_mode = ble.PUBLIC,
+        channel_map = ble.CHNLS_ALL,
+        intv_min = 120,
+        intv_max = 120,
+        adv_data = {
+            {ble.FLAGS, string.char(0x06)},
+            {ble.MANUFACTURER_SPECIFIC_DATA, adv_data}
+        }
+    })
 
--- 加载 ibeacon 蓝牙功能模块
-require "ble_ibeacon"
+    sys.wait(100)
+    log.info("开始广播")
+    ble_device:adv_start()
+end)
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 1 - 1
module/Air8000/demo/ble/ibeacon/readme.md

@@ -11,7 +11,7 @@
 
 3、Air8000核心板和数据线的硬件接线方式为
 
-- Air8000核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到 "充电" 一端
+- Air8000核心板通过TYPE-C USB口供电;(正常测试时核心板背面的功耗测试开关拨到ON,正面的白色拨码(供电,充电选择脚)开关拨到供电.
 
 - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
 

+ 19 - 13
module/Air8000/demo/ble/master/ble_master.lua

@@ -1,11 +1,11 @@
 --[[
 @module  ble_ibeacon
-@summary Air8000演示ibeacon功能模块
+@summary Air8000演示BLE主机模式功能模块
 @version 1.0
 @date    2025.07.01
 @author  wangshihao
 @usage
-本文件为Air8000核心板演示master功能的代码示例,核心业务逻辑为:
+本文件为Air8000核心板演示BLE主机模式的代码示例,核心业务逻辑为:
 1. 初始化蓝牙底层框架
     bluetooth_device = bluetooth.init()
 2. 创建BLE对象实例
@@ -36,17 +36,17 @@
 local scan_count = 0
 
 local function ble_callback(ble_device, ble_event, ble_param)
-    if ble_event == ble.EVENT_CONN then
+    if ble_event == ble.EVENT_CONN then -- 连接成功
         log.info("ble", "connect 成功")
-    elseif ble_event == ble.EVENT_DISCONN then
+    elseif ble_event == ble.EVENT_DISCONN then -- 断开连接,并打印断开原因
         log.info("ble", "disconnect", ble_param.reason)
-        sys.timerStart(function() ble_device:scan_start() end, 1000)
-    elseif ble_event == ble.EVENT_WRITE then
+        sys.timerStart(function() ble_device:scan_start() end, 1000) -- 1秒后重新开始扫描
+    elseif ble_event == ble.EVENT_WRITE then --收到写请求
         log.info("ble", "write", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex())
         log.info("ble", "data", ble_param.data:toHex())
-    elseif ble_event == ble.EVENT_READ_VALUE then
-        log.info("ble", "read", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex(),ble_param.data:toHex())
-    elseif ble_event == ble.EVENT_SCAN_REPORT then
+    elseif ble_event == ble.EVENT_READ_VALUE then -- 收到读请求
+        log.info("ble", "read", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex(),ble_param.data)
+    elseif ble_event == ble.EVENT_SCAN_REPORT then -- 扫描到设备
         print("ble scan report",ble_param.addr_type,ble_param.rssi,ble_param.adv_addr:toHex(),ble_param.data:toHex())
         scan_count = scan_count + 1
         if scan_count > 100 then
@@ -61,18 +61,24 @@ local function ble_callback(ble_device, ble_event, ble_param)
             ble_device:scan_stop()
             ble_device:connect(ble_param.adv_addr,ble_param.addr_type)
         end
-    elseif ble_event == ble.EVENT_GATT_ITEM then
-        -- 读取GATT完成, 打印出来
+    elseif ble_event == ble.EVENT_GATT_ITEM then -- 读取GATT信息
+        -- 读取GATT完成打印出来
         log.info("ble", "gatt item", ble_param)
-    elseif ble_event == ble.EVENT_GATT_DONE then
+    elseif ble_event == ble.EVENT_GATT_DONE then -- GATT操作完成
+        -- GATT操作完成,打印服务数量
         log.info("ble", "gatt done", ble_param.service_num)
+
+        -- 开启指定服务和特征值的通知
         local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA01")}
         ble_device:notify_enable(wt, true) -- 开启通知
 
         -- 主动写入数据, 但不带通知, 带通知是 write_notify
         local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA02")}
-        ble_device:write_value(wt,string.fromHex("1234"))
+        ble_device:write_value(wt, string.fromHex("1234")) -- 写入数据, 这里是写入十六进制数据"1234"
+        log.info("ble", "write value", wt.uuid_service:toHex(), wt.uuid_characteristic:toHex(), "1234")
 
+        -- 读取特征值数据
+        -- 注意, 这里是读取另外一个设备的特征值数据
         local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA03")}
         ble_device:read_value(wt)
     end

+ 68 - 55
module/Air8000/demo/ble/master/main.lua

@@ -1,68 +1,81 @@
---[[
-@module  main
-@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
-@version 1.0
-@date    2025.07.01
-@author  wangshihao
-@usage
-本demo演示的核心功能为:
-演示了Air8000核心板作为BLE Master的核心功能。
-主要功能是扫描周围的BLE设备,当发现设备名称中包含"LuatOS"的设备时,自动连接该设备,然后进行GATT操作(如开启通知、写入数据、读取数据)等。
 
-更多说明参考本目录下的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这三位数字必须存在,但是没有任何用处,可以一直写为000
-        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-]]
-PROJECT = "ble_master"
-VERSION = "001.000.000"
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
 
 log.info("main", "project name is ", PROJECT, "version is ", VERSION)
 
--- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
--- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
-if wdt then
-    --配置喂狗超时时间为9秒钟
-    wdt.init(9000)
-    --启动一个循环定时器,每隔3秒钟喂一次狗
-    sys.timerLoopStart(wdt.feed, 3000)
-end
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val) gpio.set(23, val) end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
 
--- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
--- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
--- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
--- 启动errDump日志存储并且上传功能,600秒上传一次
--- if errDump then
---     errDump.config(true, 600)
--- end
+local scan_count = 0
 
+local function ble_callback(ble_device, ble_event, ble_param)
+    if ble_event == ble.EVENT_CONN then
+        log.info("ble", "connect 成功")
+    elseif ble_event == ble.EVENT_DISCONN then
+        log.info("ble", "disconnect", ble_param.reason)
+        sys.timerStart(function() ble_device:scan_start() end, 1000)
+    elseif ble_event == ble.EVENT_WRITE then
+        log.info("ble", "write", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex())
+        log.info("ble", "data", ble_param.data:toHex())
+    elseif ble_event == ble.EVENT_READ_VALUE then
+        log.info("ble", "read", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex(),ble_param.data:toHex())
+    elseif ble_event == ble.EVENT_SCAN_REPORT then
+        print("ble scan report",ble_param.addr_type,ble_param.rssi,ble_param.adv_addr:toHex(),ble_param.data:toHex())
+        scan_count = scan_count + 1
+        if scan_count > 100 then
+            log.info("ble", "扫描次数超过100次, 停止扫描, 15秒后重新开始")
+            scan_count = 0
+            ble_device:scan_stop()
+            sys.timerStart(function() ble_device:scan_start() end, 15000)
+        end
+        -- 注意, 这里是连接到另外一个设备, 设备名称带LuatOS字样
+        if ble_param.addr_type == 0 and ble_param.data:find("LuatOS") then
+            log.info("ble", "停止扫描, 连接设备", ble_param.adv_addr:toHex(), ble_param.addr_type)
+            ble_device:scan_stop()
+            ble_device:connect(ble_param.adv_addr,ble_param.addr_type)
+        end
+    elseif ble_event == ble.EVENT_GATT_ITEM then
+        -- 读取GATT完成, 打印出来
+        log.info("ble", "gatt item", ble_param)
+    elseif ble_event == ble.EVENT_GATT_DONE then
+        log.info("ble", "gatt done", ble_param.service_num)
+        local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA01")}
+        ble_device:notify_enable(wt, true) -- 开启通知
+
+        -- 主动写入数据, 但不带通知, 带通知是 write_notify
+        local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA02")}
+        ble_device:write_value(wt,string.fromHex("1234"))
+
+        local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA03")}
+        ble_device:read_value(wt)
+    end
+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)
+sys.taskInit(function()
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
 
--- 如果需要升级WIFI固件,请打开下面注释
-require "check_wifi"
+    -- master
+    ble_device:scan_create({})
+    ble_device:scan_start()
+    -- ble_device:scan_stop()
+end)
 
--- 加载 master 蓝牙功能模块
-require "ble_master"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 1 - 1
module/Air8000/demo/ble/master/readme.md

@@ -11,7 +11,7 @@
 
 3、Air8000核心板和数据线的硬件接线方式为
 
-- Air8000核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到 "充电" 一端
+- Air8000核心板通过TYPE-C USB口供电;(正常测试时核心板背面的功耗测试开关拨到ON,正面的白色拨码(供电,充电选择脚)开关拨到供电.
 
 - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
 

+ 1 - 1
module/Air8000/demo/ble/peripheral/ble_peripheral.lua

@@ -81,7 +81,7 @@ function ble_peripheral()
         intv_max = 120,
         adv_data = {
             {ble.FLAGS, string.char(0x06)},
-            {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
+            {ble.COMPLETE_LOCAL_NAME, "LuatOS"},
             {ble.SERVICE_DATA, string.fromHex("FE01")},
             {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")}
         }

+ 111 - 53
module/Air8000/demo/ble/peripheral/main.lua

@@ -1,67 +1,125 @@
---[[
-@module  main
-@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
-@version 1.0
-@date    2025.07.01
-@author  wangshihao
-@usage
-本demo演示的核心功能为:
-Air8000的BLE从机模式,通过示例演示了如何发送通知,以及如何通过手机对从机设备进行读写操作。
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
 
-更多说明参考本目录下的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这三位数字必须存在,但是没有任何用处,可以一直写为000
-        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-]]
-PROJECT = "ble_peripheral"
-VERSION = "001.000.000"
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
 
 log.info("main", "project name is ", PROJECT, "version is ", VERSION)
 
--- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
--- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
-if wdt then
-    --配置喂狗超时时间为9秒钟
-    wdt.init(9000)
-    --启动一个循环定时器,每隔3秒钟喂一次狗
-    sys.timerLoopStart(wdt.feed, 3000)
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val) gpio.set(23, val) end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+local att_db = { -- Service
+    string.fromHex("FA00"), -- Service UUID
+    -- Characteristic
+    { -- Characteristic 1
+        string.fromHex("EA01"), -- Characteristic UUID Value
+        ble.NOTIFY | ble.READ | ble.WRITE -- Properties
+    }, { -- Characteristic 2
+        string.fromHex("EA02"), ble.WRITE
+    }, { -- Characteristic 3
+        string.fromHex("EA03"), ble.READ
+    }, { -- Characteristic 4
+        string.fromHex("EA04"), ble.IND | ble.READ
+    }
+}
+
+ble_stat = false
+
+local function ble_callback(dev, evt, param)
+    if evt == ble.EVENT_CONN then
+        log.info("ble", "connect 成功", param, param and param.addr and param.addr:toHex() or "unknow")
+        ble_stat = true
+    elseif evt == ble.EVENT_DISCONN then
+        log.info("ble", "disconnect")
+        ble_stat = false
+        -- 1秒后重新开始广播
+        sys.timerStart(function() dev:adv_start() end, 1000)
+    elseif evt == ble.EVENT_WRITE then
+        -- 收到写请求
+        log.info("ble", "接收到写请求", param.uuid_service:toHex(), param.uuid_characteristic:toHex(), param.data:toHex())
+    end
 end
 
--- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
--- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
--- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
--- 启动errDump日志存储并且上传功能,600秒上传一次
--- if errDump then
---     errDump.config(true, 600)
--- end
+local bt_scan = false -- 是否扫描蓝牙
+
+sys.taskInit(function()
+    local ret = 0
+    sys.wait(500)
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    if ble_device == nil then
+        log.error("当前固件不支持完整的BLE")
+        return
+    end
+    sys.wait(100)
 
+    log.info('开始创建GATT')
+    ret = ble_device:gatt_create(att_db)
+    log.info("创建的GATT", ret)
 
--- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
--- 可以使用合宙的iot.openluat.com平台进行远程升级
--- 也可以使用客户自己搭建的平台进行远程升级
--- 远程升级的详细用法,可以参考fota的demo进行使用
+    sys.wait(100)
+    log.info("开始设置广播内容")
+    ble_device:adv_create({
+        addr_mode = ble.PUBLIC,
+        channel_map = ble.CHNLS_ALL,
+        intv_min = 120,
+        intv_max = 120,
+        adv_data = {
+            {ble.FLAGS, string.char(0x06)},
+            {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
+            {ble.SERVICE_DATA, string.fromHex("FE01")},
+            {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")}
+        }
+    })
 
--- 启动一个循环定时器
--- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
--- 方便分析内存使用是否有异常
--- sys.timerLoopStart(function()
---     log.info("mem.lua", rtos.meminfo())
---     log.info("mem.sys", rtos.meminfo("sys"))
--- end, 3000)
+    sys.wait(100)
+    log.info("开始广播")
+    ble_device:adv_start()
 
--- 如果需要升级WIFI固件,请打开下面注释
-require "check_wifi"
+        
+    -- 放入预设值, 注意是有READ属性的特性才能读取
+    -- 手机APP设置MTU到256
+    local wt = {
+        uuid_service = string.fromHex("FA00"),
+        uuid_characteristic = string.fromHex("EA01"), 
+    }
+    ble_device:write_value(wt, "12345678901234567890")
 
--- 加载 peripheral 蓝牙功能模块
-require "ble_peripheral"
+    while 1 do
+        sys.wait(3000)
+        if ble_stat then
+            local wt = {
+                uuid_service = string.fromHex("FA00"),
+                uuid_characteristic = string.fromHex("EA01"), 
+            }
+            local result = ble_device:write_notify(wt, "123456" .. os.date())
+            log.info("ble", "发送数据", result)
+        else
+            -- log.info("等待连接成功之后发送数据")
+        end
+        
+        local wt = {
+            uuid_service = string.fromHex("FA00"),
+            uuid_characteristic = string.fromHex("EA03"), 
+        }
+        ble_device:write_value(wt, "8888 123454")
+    end
+end)
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 1 - 1
module/Air8000/demo/ble/peripheral/readme.md

@@ -11,7 +11,7 @@
 
 3、Air8000核心板和数据线的硬件接线方式为
 
-- Air8000核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到 "充电" 一端
+- Air8000核心板通过TYPE-C USB口供电;(正常测试时核心板背面的功耗测试开关拨到ON,正面的白色拨码(供电,充电选择脚)开关拨到供电.
 
 - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
 

+ 67 - 51
module/Air8000/demo/ble/scan/main.lua

@@ -1,67 +1,83 @@
---[[
-@module  main
-@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
-@version 1.0
-@date    2025.07.01
-@author  wangshihao
-@usage
-本demo演示的核心功能为:
-Air8000的BLE的观察者模式(SCAN),通过示例演示了如何开启蓝牙设备的观察者模式(SCAN),扫描附近的蓝牙设备信息并打印出来。
 
-更多说明参考本目录下的readme.md文件
-]]
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
 
---[[
-必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
-PROJECT:项目名,ascii string类型
-        可以随便定义,只要不使用,就行
-VERSION:项目版本号,ascii string类型
-        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
-            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
-            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
-        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-]]
-PROJECT = "ble_scan"
-VERSION = "001.000.000"
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
 
 log.info("main", "project name is ", PROJECT, "version is ", VERSION)
 
--- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
--- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
-if wdt then
-    --配置喂狗超时时间为9秒钟
-    wdt.init(9000)
-    --启动一个循环定时器,每隔3秒钟喂一次狗
-    sys.timerLoopStart(wdt.feed, 3000)
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
 end
 
--- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
--- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
--- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
--- 启动errDump日志存储并且上传功能,600秒上传一次
--- if errDump then
---     errDump.config(true, 600)
--- end
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
 
+local function ble_callback(ble_device, ble_event, ble_param)
+    if ble_event == ble.EVENT_SCAN_INIT then
+        log.info("ble", "scan init")
+    elseif ble_event == ble.EVENT_SCAN_REPORT then
+        log.info("ble", "scan report", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- 解析广播数据, 日志很多, 按需使用
+        -- local adv_data = ble_device:adv_decode(ble_param.data)
+        -- if adv_data then
+        --     for k, v in pairs(adv_data) do
+        --         log.info("ble", "adv data", v.len, v.tp, v.data:toHex())
+        --     end
+        -- end
+        -- if ble_param.data:byte(1) == 0x1A then
+        --     log.info("ble", "ibeacon数据", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- end
+    elseif ble_event == ble.EVENT_SCAN_STOP then
+        log.info("ble", "scan stop")
+    end
+end
+
+local bt_scan = false   -- 是否扫描蓝牙
+
+sys.taskInit(function()
+    sys.wait(500)
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    if ble_device == nil then
+        log.error("当前固件不支持完整的BLE")
+        return
+    end
+    sys.wait(100)
+    -- 扫描模式
+    sys.wait(1000)
+    ble_device:scan_create() -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
+    -- ble_device:scan_create(0, 10, 10) -- 使用自定义参数
+    sys.wait(100)
+    log.info("开始扫描")
+    ble_device:scan_start()
 
--- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
--- 可以使用合宙的iot.openluat.com平台进行远程升级
--- 也可以使用客户自己搭建的平台进行远程升级
--- 远程升级的详细用法,可以参考fota的demo进行使用
+    -- sys.wait(15000)
+    -- log.info("停止扫描")
+    -- ble_device:scan_stop()
+
+end)
 
--- 启动一个循环定时器
--- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
--- 方便分析内存使用是否有异常
 -- sys.timerLoopStart(function()
---     log.info("mem.lua", rtos.meminfo())
---     log.info("mem.sys", rtos.meminfo("sys"))
+--     print("hi, LuatOS")
+--     print("mem.lua", rtos.meminfo())
+--     print("mem.sys", rtos.meminfo("sys"))
+--     print("mem.psram", rtos.meminfo("psram"))
 -- end, 3000)
 
--- 如果需要升级WIFI固件,请打开下面注释
-require "check_wifi"
-
--- 加载 scan 蓝牙功能模块
-require "ble_scan"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 1 - 1
module/Air8000/demo/ble/scan/readme.md

@@ -11,7 +11,7 @@
 
 3、Air8000核心板和数据线的硬件接线方式为
 
-- Air8000核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到 "充电" 一端
+- Air8000核心板通过TYPE-C USB口供电;(正常测试时核心板背面的功耗测试开关拨到ON,正面的白色拨码(供电,充电选择脚)开关拨到供电.
 
 - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
 

+ 1 - 1
module/Air8000/project/整机开发板出厂工程/user/airaudio.lua

@@ -20,7 +20,7 @@ local pa_on_level = 1           -- PA打开电平 1 高电平 0 低电平
 local power_delay = 3           -- 在DAC启动前插入的冗余时间,单位100ms
 local pa_delay = 100            -- 在DAC启动后,延迟多长时间打开PA,单位1ms
 local power_on_level = 1        -- 电源控制IO的电平,默认拉高
-local power_time_delay = 100    -- 音频播放完毕时,PA与DAC关闭的时间间隔,单位1ms
+local power_time_delay = 600    -- 音频播放完毕时,PA与DAC关闭的时间间隔,单位1ms
 local taskName = "task_tts"
 
 local play_string = "降功耗,找合宙"

+ 3 - 2
module/Air8000/project/整机开发板出厂工程/user/airgsensor.lua

@@ -112,12 +112,13 @@ local function ind()
         end       
     end
 end    
-gpio.setup(intPin, ind)
+
 
 
 local function da221_init()
     log.info("da221 init...")
     --关闭i2c
+    gpio.setup(intPin, ind)
     i2c.close(i2cId)            ------初始化i2c
     --重新打开i2c,i2c速度设置为低速
     i2c.setup(i2cId, i2c.SLOW)
@@ -157,7 +158,7 @@ local function da221_init()
     sys.wait(5)
 end
 
-function da221_run()
+local function da221_run()
     -- 轮询读取三轴速度
     log.info("interrupt_state123",is_da221_init,interrupt_state )
     da221_init()

+ 12 - 11
module/Air8000/project/整机开发板出厂工程/user/talk.lua

@@ -6,12 +6,12 @@ httpplus = require("httpplus")
 local run_state = false -- 判断本UI DEMO 是否运行
 local airaudio  = require "airaudio"
 local speech_topic = ""  --  填写手机号,需要保证所有对讲设备,网页都是同一个号码   
-local mqtt_host = "lbsmqtt.airm2m.com"
-local mqtt_port = 1884
+local mqtt_host = "lbsmqtt.openluat.com"
+local mqtt_port = 1886
 local mqtt_isssl = false
 local client_id = nil
-local user_name = "user"
-local password = "password"
+local user_name = "mqtt_hz_test_1"
+local password = "Ck8WpNCp"
 local mqttc = nil
 local message = ""
 local event = ""
@@ -19,7 +19,7 @@ local talk_state = ""
 
 
 
-local function talk_event_cb(event, param)
+local function airtalk_event_cb(event, param)
     log.info("talk event", event, param)
     event  = event
 end
@@ -35,11 +35,10 @@ local function init_talk()
     airaudio.init() 
 
     client_id = mobile.imei()
-    
 
     mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, {rxSize = 4096})
     airtalk.config(airtalk.PROTOCOL_DEMO_MQTT_8K, mqttc, 200) -- 缓冲至少200ms播放
-    airtalk.on(talk_event_cb)
+    airtalk.on(airtalk_event_cb)
     airtalk.start(client_id, speech_topic)
 
     mqttc:auth(client_id,user_name,password) -- client_id必填,其余选填
@@ -68,8 +67,8 @@ function talk.run()
     log.info("talk.run")
     lcd.setFont(lcd.font_opposansm12_chinese) -- 设置中文字体
     run_state = true
+    sys.taskInit(init_talk)
 
-    init_talk() -- 初始化电话功能相关配置
 
     while true do
         sys.wait(10)
@@ -77,11 +76,13 @@ function talk.run()
         if speech_topic == "" then
             lcd.drawStr(0, 80, "请填入speech_topic,并保证所有终端topic 一致")
         else
-            lcd.drawStr(0, 80, "对讲测试,测试topic:"..speech_topic .. ",所有终端或者网页都要使用同一个topic")
-            lcd.drawStr(0, 100, talk_state)
+            lcd.drawStr(0, 80, "对讲测试,测试topic:"..speech_topic )
+            lcd.drawStr(0, 120, "所有终端或者网页都要使用同一个topic")
+
+            lcd.drawStr(0, 140, talk_state)
             
 
-            lcd.drawStr(0, 120, "事件:" .. event)
+            lcd.drawStr(0, 160, "事件:" .. event)
             lcd.showImage(130, 350, "/luadb/start.jpg") -- 对讲开始按钮
             lcd.showImage(130, 397, "/luadb/stop.jpg") -- 对讲停止按钮
             

+ 2 - 2
module/Air8101/demo/lowpower/low_power.lua

@@ -1,11 +1,11 @@
 --[[
 @module  low_power
-@summary lowpower主应用功能模块 
+@summary 低功耗模式主应用功能模块 
 @version 1.0
 @date    2025.07.01
 @author  陈取德
 @usage
-本文件为lowpower主应用功能模块,核心业务逻辑为:
+本文件为低功耗模式主应用功能模块,核心业务逻辑为:
 1、进入低功耗模式
 2、判断是否在低功耗模式下连接网络和发送平台心跳包
 使用前请根据需要,变更功能变量。条件不同,功耗体现不同。

+ 1 - 1
module/Air8101/demo/lowpower/main.lua

@@ -65,7 +65,7 @@ end
 -- end, 3000)
 
 
---选择需要体验的功耗模式,注释另外两个代码即可!快捷键Ctrl + ?
+--选择需要体验的功耗模式,注释另外两个代码即可!快捷键Ctrl + /
 -- require "normal"
 -- require "low_power"
 require "psm+_power"

+ 2 - 2
module/Air8101/demo/lowpower/normal.lua

@@ -1,11 +1,11 @@
 --[[
 @module  normal
-@summary lowpower主应用功能模块 
+@summary 常规模式主应用功能模块 
 @version 1.0
 @date    2025.07.01
 @author  陈取德
 @usage
-本文件为lowpower主应用功能模块,核心业务逻辑为:
+本文件为常规模式主应用功能模块,核心业务逻辑为:
 1、进入常规模式
 2、判断是否连接网络和发送平台心跳包
 使用前请根据需要,变更功能变量。条件不同,功耗体现不同。

+ 2 - 2
module/Air8101/demo/lowpower/psm+_power.lua

@@ -1,11 +1,11 @@
 --[[
 @module  psm+_power
-@summary lowpower主应用功能模块 
+@summary psm+超低功耗模式主应用功能模块 
 @version 1.0
 @date    2025.07.01
 @author  陈取德
 @usage
-本文件为lowpower主应用功能模块,核心业务逻辑为:
+本文件为psm+超低功耗模式主应用功能模块,核心业务逻辑为:
 1、进入低功耗模式
 2、判断是否在低功耗模式下连接网络和发送平台心跳包
 使用前请根据需要,变更功能变量。条件不同,功耗体现不同。

+ 40 - 14
module/Air8101/project/core_accessory_board/AirGPIO_1000/AirGPIO_1000.lua

@@ -220,23 +220,49 @@ function AirGPIO_1000.deinit()
     end
 end
 
+--[[
+配置AirGPIO_1000上的扩展GPIO管脚功能;
+支持配置为输出,输入和中断三种模式;
+
+@api AirGPIO_1000.setup(gpio_id, gpio_mode)
+
+@number
+gpio_id
+表示AirGPIO_1000上的扩展GPIO ID;
+取值范围:0x00到0x07,0x10到0x17,一共16种,分别对应16个扩展GPIO引脚;
+必须传入,不允许为空或者nil;
+
+@number or function or nil or 空
+gpio_mode
+number类型时,表示输出模式,取值范围为0和1,0表示默认输出低电平,1表示默认输出高电平;
+nil或者空类型时,表示输入模式;
+function类型时,表示中断模式,此function为中断回调函数,函数的定义格式如下:
+function cb_func(id, level)
+    --id:表示触发中断的AirGPIO_1000上的扩展GPIO ID,取值范围为0x00到0x07,0x10到0x17,一共16种,分别对应16个扩展GPIO引脚;
+    --level:触发中断后,某一时刻,扩展GPIO输入的电平状态,高电平为1, 低电平为0;并不是指触发中断的电平状态;
+end
 
---配置AirGPIO_1000上的扩展GPIO管脚功能
+@return bool
+成功返回true,失败返回false
 
---gpio_id:number类型;
---         表示AirGPIO_1000上的扩展GPIO ID;
---         取值范围:0x00到0x07,0x10到0x17,一共16种,分别对应16个扩展GPIO引脚;
---         必须传入,不允许为空;
---gpio_mode:number类型,nil或者空类型,function类型;
---           number类型时,表示输出模式,取值范围为0和1,0表示默认输出低电平,1表示默认输出高电平;
---           nil或者空类型时,表示输入模式;
---           function类型时,表示中断模式,此function为中断回调函数,函数的定义格式如下:
---                           function cb_func(id, level)
---                               --id:表示触发中断的AirGPIO_1000上的扩展GPIO ID,取值范围为0x00到0x07,0x10到0x17,一共16种,分别对应16个扩展GPIO引脚;
---                               --level:触发中断后,某一时刻,扩展GPIO输入的电平状态,高电平为1, 低电平为0;
---                           end
+@usage
+-- GPIO ID 0x00配置为输出模式,默认输出低电平
+AirGPIO_1000.setup(0x00, 0)
 
---返回值:成功返回true,失败返回false
+-- GPIO ID 0x11配置为输入模式
+AirGPIO_1000.setup(0x11)
+
+
+--P04引脚中断处理函数
+--id:0x04
+--level:触发中断后,某一时刻,扩展GPIO输入的电平状态,高电平为1, 低电平为0
+local function P04_int_cbfunc(id, level)
+    log.info("P04_int_cbfunc", id, level)
+end
+
+-- GPIO ID 0x04配置为中断模式,中断处理函数为P04_int_cbfunc
+AirGPIO_1000.setup(0x04, P04_int_cbfunc)
+]]
 function AirGPIO_1000.setup(gpio_id, gpio_mode)
     --检查参数的合法性
     if not check_gpio_id_valid(gpio_id) then