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

add:添加air780系列、air8000系列、air8101的mcu的demo

mw 4 месяцев назад
Родитель
Сommit
889fd45993

+ 74 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/mcu/main.lua

@@ -0,0 +1,74 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+]]
+--[[
+必须定义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 = "mcu_demo"
+VERSION = "001.000.000"
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, 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)
+
+-- 加载mcu功能模块
+require "mcu_test"
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 64 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/mcu/mcu_test.lua

@@ -0,0 +1,64 @@
+--[[
+@module  mcu_test
+@summary 测试mcu模块功能
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+
+    本文件没有对外接口,直接在main.lua中require "mcu_test"就可以加载运行;
+]]
+function mcu_test()
+    -- 测试MCU 死机时的处理模式
+    -- 死机后重启,一般用于正式产品_
+    mcu.hardfault(1)
+
+    -- 测试唯一ID
+    local unique_id = mcu.unique_id()
+    if #unique_id > 0 then
+        log.info("mcu", "Unique ID(hex):", unique_id:toHex())
+    else
+        log.warn("mcu", "Unique ID not supported")
+    end
+
+    -- 测试ticks相关函数
+    -- 获取启动后的 tick 数
+    log.info("mcu", "ticks:", mcu.ticks())
+    -- 获取每秒的 tick 数量
+    log.info("mcu", "获取每秒的tick数量:", mcu.hz())
+
+
+    -- 测试64位tick
+    local tick_str, tick_per = mcu.tick64()
+    log.info("mcu", "tick64:", tick_str:toHex(), "ticks per us:", tick_per)
+    -- 测试mcu.dtick64接口获取ticks差值计算
+    local tick1 = mcu.tick64()
+    sys.wait(100)
+    local tick2 = mcu.tick64()
+    local result, diff_tick = mcu.dtick64(tick1, tick2)
+    log.info("mcu", "dtick64 result:", result, "diff:", diff_tick)
+
+
+    -- 测试ticks2函数
+    local us_h, us_l = mcu.ticks2(0)
+    local ms_h, ms_l = mcu.ticks2(1)
+    local sec_h, sec_l = mcu.ticks2(2)
+    log.info("mcu", "us:", us_h, us_l)
+    log.info("mcu", "ms:", ms_h, ms_l)
+    log.info("mcu", "sec:", sec_h, sec_l)
+
+    -- 测试 转换 10 进制数为 16 进制字符串输出
+    local value = mcu.x32(0x2009FFFC) --输出"0x2009fffc"
+    log.info("mcu", "string", value)
+
+
+end
+
+sys.taskInit(mcu_test)

+ 53 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/mcu/readme.md

@@ -0,0 +1,53 @@
+## 演示模块概述
+
+1、main.lua:主程序入口;
+
+2、mcu_test.lua:MCU功能测试模块;
+
+## 演示功能概述
+
+使用Air780EHM核心板测试MCU相关功能,包括:
+
+- MCU死机时的处理模式设置
+- 唯一ID获取与显示
+- 系统tick计数功能测试
+- 64位tick计数和差值计算
+- 微秒、毫秒、秒级别的时间计数
+- 16进制字符串转换输出
+
+## 演示硬件环境
+
+1、Air780EHM核心板一块
+
+2、TYPE-C USB数据线一根
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EHM V2016版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、通过luatools工具查看下面日志:
+
+```lua
+[2025-10-21 17:37:39.953][000000000.242] I/user.mcu ticks: 165
+[2025-10-21 17:37:39.962][000000000.242] I/user.mcu 获取每秒的tick数量: 1000
+[2025-10-21 17:37:39.969][000000000.243] I/user.mcu tick64: 625B600000000000 ticks per us: 26
+[2025-10-21 17:37:39.982][000000000.343] I/user.mcu dtick64 result: false diff: -2610447
+[2025-10-21 17:37:40.015][000000000.344] I/user.mcu us: 0 344087
+[2025-10-21 17:37:40.030][000000000.344] I/user.mcu ms: 0 344
+[2025-10-21 17:37:40.037][000000000.344] I/user.mcu sec: 0 0
+[2025-10-21 17:37:40.043][000000000.345] I/user.mcu string 0x2009fffc
+[2025-10-21 17:37:40.048][000000000.345] I/user.us_h 0 us_l 345086
+[2025-10-21 17:37:40.064][000000000.345] I/user.ms_h 0 ms_l 345
+[2025-10-21 17:37:40.085][000000000.345] I/user.sec_h 0 sec_l 0
+
+```

+ 74 - 0
module/Air780EPM/demo/mcu/main.lua

@@ -0,0 +1,74 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+]]
+--[[
+必须定义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 = "mcu_demo"
+VERSION = "001.000.000"
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, 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)
+
+-- 加载mcu功能模块
+require "mcu_test"
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 64 - 0
module/Air780EPM/demo/mcu/mcu_test.lua

@@ -0,0 +1,64 @@
+--[[
+@module  mcu_test
+@summary 测试mcu模块功能
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+
+    本文件没有对外接口,直接在main.lua中require "mcu_test"就可以加载运行;
+]]
+function mcu_test()
+    -- 测试MCU 死机时的处理模式
+    -- 死机后重启,一般用于正式产品_
+    mcu.hardfault(1)
+
+    -- 测试唯一ID
+    local unique_id = mcu.unique_id()
+    if #unique_id > 0 then
+        log.info("mcu", "Unique ID(hex):", unique_id:toHex())
+    else
+        log.warn("mcu", "Unique ID not supported")
+    end
+
+    -- 测试ticks相关函数
+    -- 获取启动后的 tick 数
+    log.info("mcu", "ticks:", mcu.ticks())
+    -- 获取每秒的 tick 数量
+    log.info("mcu", "获取每秒的tick数量:", mcu.hz())
+
+
+    -- 测试64位tick
+    local tick_str, tick_per = mcu.tick64()
+    log.info("mcu", "tick64:", tick_str:toHex(), "ticks per us:", tick_per)
+    -- 测试mcu.dtick64接口获取ticks差值计算
+    local tick1 = mcu.tick64()
+    sys.wait(100)
+    local tick2 = mcu.tick64()
+    local result, diff_tick = mcu.dtick64(tick1, tick2)
+    log.info("mcu", "dtick64 result:", result, "diff:", diff_tick)
+
+
+    -- 测试ticks2函数
+    local us_h, us_l = mcu.ticks2(0)
+    local ms_h, ms_l = mcu.ticks2(1)
+    local sec_h, sec_l = mcu.ticks2(2)
+    log.info("mcu", "us:", us_h, us_l)
+    log.info("mcu", "ms:", ms_h, ms_l)
+    log.info("mcu", "sec:", sec_h, sec_l)
+
+    -- 测试 转换 10 进制数为 16 进制字符串输出
+    local value = mcu.x32(0x2009FFFC) --输出"0x2009fffc"
+    log.info("mcu", "string", value)
+
+
+end
+
+sys.taskInit(mcu_test)

+ 53 - 0
module/Air780EPM/demo/mcu/readme.md

@@ -0,0 +1,53 @@
+## 演示模块概述
+
+1、main.lua:主程序入口;
+
+2、mcu_test.lua:MCU功能测试模块;
+
+## 演示功能概述
+
+使用Air780EPM核心板测试MCU相关功能,包括:
+
+- MCU死机时的处理模式设置
+- 唯一ID获取与显示
+- 系统tick计数功能测试
+- 64位tick计数和差值计算
+- 微秒、毫秒、秒级别的时间计数
+- 16进制字符串转换输出
+
+## 演示硬件环境
+
+1、Air780EPM核心板一块
+
+2、TYPE-C USB数据线一根
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EPM V2016版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、通过luatools工具查看下面日志:
+
+```lua
+[2025-10-21 17:37:39.953][000000000.242] I/user.mcu ticks: 165
+[2025-10-21 17:37:39.962][000000000.242] I/user.mcu 获取每秒的tick数量: 1000
+[2025-10-21 17:37:39.969][000000000.243] I/user.mcu tick64: 625B600000000000 ticks per us: 26
+[2025-10-21 17:37:39.982][000000000.343] I/user.mcu dtick64 result: false diff: -2610447
+[2025-10-21 17:37:40.015][000000000.344] I/user.mcu us: 0 344087
+[2025-10-21 17:37:40.030][000000000.344] I/user.mcu ms: 0 344
+[2025-10-21 17:37:40.037][000000000.344] I/user.mcu sec: 0 0
+[2025-10-21 17:37:40.043][000000000.345] I/user.mcu string 0x2009fffc
+[2025-10-21 17:37:40.048][000000000.345] I/user.us_h 0 us_l 345086
+[2025-10-21 17:37:40.064][000000000.345] I/user.ms_h 0 ms_l 345
+[2025-10-21 17:37:40.085][000000000.345] I/user.sec_h 0 sec_l 0
+
+```

+ 74 - 0
module/Air8000/demo/mcu/main.lua

@@ -0,0 +1,74 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+]]
+--[[
+必须定义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 = "mcu_demo"
+VERSION = "001.000.000"
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, 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)
+
+-- 加载mcu功能模块
+require "mcu_test"
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 64 - 0
module/Air8000/demo/mcu/mcu_test.lua

@@ -0,0 +1,64 @@
+--[[
+@module  mcu_test
+@summary 测试mcu模块功能
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+
+    本文件没有对外接口,直接在main.lua中require "mcu_test"就可以加载运行;
+]]
+function mcu_test()
+    -- 测试MCU 死机时的处理模式
+    -- 死机后重启,一般用于正式产品_
+    mcu.hardfault(1)
+
+    -- 测试唯一ID
+    local unique_id = mcu.unique_id()
+    if #unique_id > 0 then
+        log.info("mcu", "Unique ID(hex):", unique_id:toHex())
+    else
+        log.warn("mcu", "Unique ID not supported")
+    end
+
+    -- 测试ticks相关函数
+    -- 获取启动后的 tick 数
+    log.info("mcu", "ticks:", mcu.ticks())
+    -- 获取每秒的 tick 数量
+    log.info("mcu", "获取每秒的tick数量:", mcu.hz())
+
+
+    -- 测试64位tick
+    local tick_str, tick_per = mcu.tick64()
+    log.info("mcu", "tick64:", tick_str:toHex(), "ticks per us:", tick_per)
+    -- 测试mcu.dtick64接口获取ticks差值计算
+    local tick1 = mcu.tick64()
+    sys.wait(100)
+    local tick2 = mcu.tick64()
+    local result, diff_tick = mcu.dtick64(tick1, tick2)
+    log.info("mcu", "dtick64 result:", result, "diff:", diff_tick)
+
+
+    -- 测试ticks2函数
+    local us_h, us_l = mcu.ticks2(0)
+    local ms_h, ms_l = mcu.ticks2(1)
+    local sec_h, sec_l = mcu.ticks2(2)
+    log.info("mcu", "us:", us_h, us_l)
+    log.info("mcu", "ms:", ms_h, ms_l)
+    log.info("mcu", "sec:", sec_h, sec_l)
+
+    -- 测试 转换 10 进制数为 16 进制字符串输出
+    local value = mcu.x32(0x2009FFFC) --输出"0x2009fffc"
+    log.info("mcu", "string", value)
+
+
+end
+
+sys.taskInit(mcu_test)

+ 53 - 0
module/Air8000/demo/mcu/readme.md

@@ -0,0 +1,53 @@
+## 演示模块概述
+
+1、main.lua:主程序入口;
+
+2、mcu_test.lua:MCU功能测试模块;
+
+## 演示功能概述
+
+使用Air8000核心板测试MCU相关功能,包括:
+
+- MCU死机时的处理模式设置
+- 唯一ID获取与显示
+- 系统tick计数功能测试
+- 64位tick计数和差值计算
+- 微秒、毫秒、秒级别的时间计数
+- 16进制字符串转换输出
+
+## 演示硬件环境
+
+1、Air8000核心板一块
+
+2、TYPE-C USB数据线一根
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2016版本固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、通过luatools工具查看下面日志:
+
+```lua
+[2025-10-21 17:37:39.953][000000000.242] I/user.mcu ticks: 165
+[2025-10-21 17:37:39.962][000000000.242] I/user.mcu 获取每秒的tick数量: 1000
+[2025-10-21 17:37:39.969][000000000.243] I/user.mcu tick64: 625B600000000000 ticks per us: 26
+[2025-10-21 17:37:39.982][000000000.343] I/user.mcu dtick64 result: false diff: -2610447
+[2025-10-21 17:37:40.015][000000000.344] I/user.mcu us: 0 344087
+[2025-10-21 17:37:40.030][000000000.344] I/user.mcu ms: 0 344
+[2025-10-21 17:37:40.037][000000000.344] I/user.mcu sec: 0 0
+[2025-10-21 17:37:40.043][000000000.345] I/user.mcu string 0x2009fffc
+[2025-10-21 17:37:40.048][000000000.345] I/user.us_h 0 us_l 345086
+[2025-10-21 17:37:40.064][000000000.345] I/user.ms_h 0 ms_l 345
+[2025-10-21 17:37:40.085][000000000.345] I/user.sec_h 0 sec_l 0
+
+```

+ 74 - 0
module/Air8101/demo/mcu/main.lua

@@ -0,0 +1,74 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+]]
+--[[
+必须定义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 = "mcu_demo"
+VERSION = "001.000.000"
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, 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)
+
+-- 加载mcu功能模块
+require "mcu_test"
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 64 - 0
module/Air8101/demo/mcu/mcu_test.lua

@@ -0,0 +1,64 @@
+--[[
+@module  mcu_test
+@summary 测试mcu模块功能
+@version 1.0
+@date    2025.10.21
+@author  孟伟
+@usage
+本demo演示的功能为:
+    MCU死机时的处理模式设置
+    唯一ID获取与显示
+    系统tick计数功能测试
+    64位tick计数和差值计算
+    微秒、毫秒、秒级别的时间计数
+    16进制字符串转换输出
+
+    本文件没有对外接口,直接在main.lua中require "mcu_test"就可以加载运行;
+]]
+function mcu_test()
+    -- 测试MCU 死机时的处理模式
+    -- 死机后重启,一般用于正式产品_
+    mcu.hardfault(1)
+
+    -- 测试唯一ID
+    local unique_id = mcu.unique_id()
+    if #unique_id > 0 then
+        log.info("mcu", "Unique ID(hex):", unique_id:toHex())
+    else
+        log.warn("mcu", "Unique ID not supported")
+    end
+
+    -- 测试ticks相关函数
+    -- 获取启动后的 tick 数
+    log.info("mcu", "ticks:", mcu.ticks())
+    -- 获取每秒的 tick 数量
+    log.info("mcu", "获取每秒的tick数量:", mcu.hz())
+
+
+    -- 测试64位tick
+    local tick_str, tick_per = mcu.tick64()
+    log.info("mcu", "tick64:", tick_str:toHex(), "ticks per us:", tick_per)
+    -- 测试mcu.dtick64接口获取ticks差值计算
+    local tick1 = mcu.tick64()
+    sys.wait(100)
+    local tick2 = mcu.tick64()
+    local result, diff_tick = mcu.dtick64(tick1, tick2)
+    log.info("mcu", "dtick64 result:", result, "diff:", diff_tick)
+
+
+    -- 测试ticks2函数
+    local us_h, us_l = mcu.ticks2(0)
+    local ms_h, ms_l = mcu.ticks2(1)
+    local sec_h, sec_l = mcu.ticks2(2)
+    log.info("mcu", "us:", us_h, us_l)
+    log.info("mcu", "ms:", ms_h, ms_l)
+    log.info("mcu", "sec:", sec_h, sec_l)
+
+    -- 测试 转换 10 进制数为 16 进制字符串输出
+    local value = mcu.x32(0x2009FFFC) --输出"0x2009fffc"
+    log.info("mcu", "string", value)
+
+
+end
+
+sys.taskInit(mcu_test)

+ 53 - 0
module/Air8101/demo/mcu/readme.md

@@ -0,0 +1,53 @@
+## 演示模块概述
+
+1、main.lua:主程序入口;
+
+2、mcu_test.lua:MCU功能测试模块;
+
+## 演示功能概述
+
+使用Air8101核心板测试MCU相关功能,包括:
+
+- MCU死机时的处理模式设置
+- 唯一ID获取与显示
+- 系统tick计数功能测试
+- 64位tick计数和差值计算
+- 微秒、毫秒、秒级别的时间计数
+- 16进制字符串转换输出
+
+## 演示硬件环境
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 V1006版本固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、通过luatools工具查看下面日志:
+
+```lua
+[2025-10-21 17:37:39.953][000000000.242] I/user.mcu ticks: 165
+[2025-10-21 17:37:39.962][000000000.242] I/user.mcu 获取每秒的tick数量: 1000
+[2025-10-21 17:37:39.969][000000000.243] I/user.mcu tick64: 625B600000000000 ticks per us: 26
+[2025-10-21 17:37:39.982][000000000.343] I/user.mcu dtick64 result: false diff: -2610447
+[2025-10-21 17:37:40.015][000000000.344] I/user.mcu us: 0 344087
+[2025-10-21 17:37:40.030][000000000.344] I/user.mcu ms: 0 344
+[2025-10-21 17:37:40.037][000000000.344] I/user.mcu sec: 0 0
+[2025-10-21 17:37:40.043][000000000.345] I/user.mcu string 0x2009fffc
+[2025-10-21 17:37:40.048][000000000.345] I/user.us_h 0 us_l 345086
+[2025-10-21 17:37:40.064][000000000.345] I/user.ms_h 0 ms_l 345
+[2025-10-21 17:37:40.085][000000000.345] I/user.sec_h 0 sec_l 0
+
+```