目录
本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。
先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获
我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!
一、前言
一日不见如隔三秋,距离发布上篇博客
又是一种新的外设之ADC模数转换,现在我们可以采集模拟量数据了
已然过去了半个月,最近事情比较多,没有时间写博客,今天抽出一点时间写一篇有关Air720SL定时器的使用方法
- 那么什么是定时器呢?
定时器通俗的讲就相当于一个闹钟。
我们的手机里面都有闹钟,每天早上负责叫醒我们上班不要迟到。我们只要在手机里面设置好时间,然后可以按需选择每天都响,或者选择只响一次。作用是打断正在做的事(睡觉)。
在单片机系统中也是有定时器的。
而 定时器又分为两种,分别是硬件定时器和软件定时器
不管是51系列、stm32系列、avr系列、亦或是其他的单片机,它们在裸机编程上都是拥有硬件定时器的,一般硬件定时器数量有几个到十几个不等,占用的是硬件资源,
- 硬件定时器:一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片,其使用的时基是系统内部的高速时钟源经过分频得到的,高速时钟源又是由外部晶振倍频得到,精度非常高,但是依赖硬件,能使用的数量有限
如果涉及到了操作系统编程,软件定时器那就必不可少。
- 软件定时器:一般软件定时器都是利用的是操作系统的延时阻塞性,在定时器启动和触发时记录下当前的系统时间,每隔一个时间片去查询下有没有到指定的定时时间,有的话就触发软件回调,精度相对硬件定时器要差得多,理论上是没有使用数量限制的,内存有多大,定时器就可以有多少
我翻过Air720SL的硬件手册和API手册好像是没有看到有关硬件定时器的说明。
我没看到不代表没有,只是我不知道
,这里我就不多说了,本片博客主要是讲Air720SL模组Luat二次开发的软件定时器怎么使用
二、了解软件API
Luat官方给出的定时器相关API是包含在sys驱动库文件下的。也就是说想要使用软件定时器那就必须要先
require "sys"
。在4G模块上只能选择LuaTask框架
但是在2G模块上,有另外一个选择,官方推荐的是使用LuaTask。如果用户使用的是第一版旧版本驱动库,是不能使用本篇博客所说的软件定时器的
接下来我会依次对Luat的软件定时器库做相应的讲解
sys.timerStart(timer0_Task, 15000)
–开启一个定时器,这个定时器只会触发一次,分别传入定时回调函数和定时时间,就可以启用定时器time1 = sys.timerLoopStart(timer_Loop_Task, 2000)
–开启一个循环定时器,开启成功会返回定时器句柄,可用于关闭定时器sys.timerStop(time1)
–使用time1的ID关闭time1,关闭某一个定时器sys.timerStopAll(timer_Loop_Task)
–timerStopAll关闭回调函数绑定的所有定时器
三、编写测试程序
我这里就直接在main函数里面创建一个单次定时器,再创建四个循环定时器共用一个回调函数
local function user_main()
sys.taskInit(Test_Task)
sys.timerStart(timer0_Task, 15000)
time1 = sys.timerLoopStart(timer_Loop_Task, 2000, 1)
sys.timerLoopStart(timer_Loop_Task, 2000, 2)
sys.timerLoopStart(timer_Loop_Task, 2000, 3)
sys.timerLoopStart(timer_Loop_Task, 2000, 4)
end
最后在定时器循环回调函数中,使用timerStop和 timerStopAll 进行分批关闭定时器
function timer_Loop_Task(time_num)
log.info("timer_Loop_Task当前的时间戳是:", time_num, os.time())
if num == 5 then
log.info("Close time1 with time1's ID")
sys.timerStop(time1)--使用time1的ID关闭time1
else
if num == 10 then
log.info("Close time2 with callback function and parameters:")
sys.timerStop(timer_Loop_Task, 2)--以回调函数加参数关闭time2
else
if num == 15 then
log.info("timerStopAll closes all timers bound to the callback function")
sys.timerStopAll(timer_Loop_Task)--timerStopAll关闭回调函数绑定的所有定时器
end
end
end
if time_num == 4 then
num = num + 1
end
end
# 四、下载完整的代码到Air720Sl开发板
这里我们直接贴出全部代码
--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "LED"
VERSION = "0.0.1"
require "sys"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)
local function Test_Task()
while true do
log.info("Test_Task_run")
sys.wait(5000)
end
end
function timer0_Task()
log.info("timer0_Task当前的时间戳是:", os.time())
end
num = 0;
time1 = 0;
function timer_Loop_Task(time_num)
log.info("timer_Loop_Task当前的时间戳是:", time_num, os.time())
if num == 5 then
log.info("Close time1 with time1's ID")
sys.timerStop(time1)--使用time1的ID关闭time1
else
if num == 10 then
log.info("Close time2 with callback function and parameters:")
sys.timerStop(timer_Loop_Task, 2)--以回调函数加参数关闭time2
else
if num == 15 then
log.info("timerStopAll closes all timers bound to the callback function")
sys.timerStopAll(timer_Loop_Task)--timerStopAll关闭回调函数绑定的所有定时器
end
end
end
if time_num == 4 then
num = num + 1
end
end
local function user_main()
sys.taskInit(Test_Task)
sys.timerStart(timer0_Task, 15000)
time1 = sys.timerLoopStart(timer_Loop_Task, 2000, 1)
sys.timerLoopStart(timer_Loop_Task, 2000, 2)
sys.timerLoopStart(timer_Loop_Task, 2000, 3)
sys.timerLoopStart(timer_Loop_Task, 2000, 4)
end
--启动系统框架
sys.taskInit(user_main)
sys.init(0, 0)
sys.run()
下载程序后,打开Trace监视
[2020-03-05 13:47:05.074]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505608
[2020-03-05 13:47:05.104]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505608
[2020-03-05 13:47:05.108]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505608
[2020-03-05 13:47:05.111]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505608
[2020-03-05 13:47:06.785]:
[2020-03-05 13:47:06.790]: SMS READY
[2020-03-05 13:47:07.053]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505610
[2020-03-05 13:47:07.068]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505610
[2020-03-05 13:47:07.082]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505610
[2020-03-05 13:47:07.091]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505610
[2020-03-05 13:47:08.830]: [I]-[Test_Task_run]
[2020-03-05 13:47:09.055]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505612
[2020-03-05 13:47:09.068]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505612
[2020-03-05 13:47:09.077]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505612
[2020-03-05 13:47:09.084]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505612
[2020-03-05 13:47:09.812]:
[2020-03-05 13:47:09.814]: +MPBK: 1
[2020-03-05 13:47:11.041]: [I]-[timer_Loop_Task当前的时间戳是:] 1 1388505614
[2020-03-05 13:47:11.051]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:11.065]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505614
[2020-03-05 13:47:11.076]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:11.090]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505614
[2020-03-05 13:47:11.101]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:11.104]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505614
[2020-03-05 13:47:11.106]: [I]-[Close time1 with time1's ID]
[2020-03-05 13:47:13.024]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505616
[2020-03-05 13:47:13.036]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505616
[2020-03-05 13:47:13.048]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505616
[2020-03-05 13:47:13.802]: [I]-[Test_Task_run]
[2020-03-05 13:47:13.805]: [I]-[timer0_Task当前的时间戳是:] 1388505617
[2020-03-05 13:47:15.013]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505618
[2020-03-05 13:47:15.026]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505618
[2020-03-05 13:47:15.038]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505618
[2020-03-05 13:47:17.000]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505620
[2020-03-05 13:47:17.012]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505620
[2020-03-05 13:47:17.022]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505620
[2020-03-05 13:47:18.786]: [I]-[Test_Task_run]
[2020-03-05 13:47:18.985]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505622
[2020-03-05 13:47:18.995]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505622
[2020-03-05 13:47:19.008]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505622
[2020-03-05 13:47:20.988]: [I]-[timer_Loop_Task当前的时间戳是:] 2 1388505624
[2020-03-05 13:47:21.002]: [I]-[Close time2 with callback function and parameters:]
[2020-03-05 13:47:21.009]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505624
[2020-03-05 13:47:21.016]: [I]-[Close time2 with callback function and parameters:]
[2020-03-05 13:47:21.022]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505624
[2020-03-05 13:47:21.028]: [I]-[Close time2 with callback function and parameters:]
[2020-03-05 13:47:22.969]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505626
[2020-03-05 13:47:22.983]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505626
[2020-03-05 13:47:23.758]: [I]-[Test_Task_run]
[2020-03-05 13:47:24.966]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505628
[2020-03-05 13:47:24.980]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505628
[2020-03-05 13:47:26.962]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505630
[2020-03-05 13:47:26.978]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505630
[2020-03-05 13:47:28.741]: [I]-[Test_Task_run]
[2020-03-05 13:47:28.942]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505632
[2020-03-05 13:47:28.956]: [I]-[timer_Loop_Task当前的时间戳是:] 4 1388505632
[2020-03-05 13:47:30.941]: [I]-[timer_Loop_Task当前的时间戳是:] 3 1388505634
[2020-03-05 13:47:30.956]: [I]-[timerStopAll closes all timers bound to the callback function]
- 发现timer0
[2020-03-05 13:47:13.805]: [I]-[timer0_Task当前的时间戳是:] 1388505617
仅出现了一次,和程序里面写的一样,单次运行在此处出现关闭id为1的定时器提示,ID1便停止输出,验证了
timerStop
正常执行
在最后出现关闭所有定时器的提示
[2020-03-05 13:47:30.956]: [I]-[timerStopAll closes all timers bound to the callback function]
,后面便停止输出,验证了timerStopAll
执行正确不会下载的点击这里,进去查看我的第二篇博文
2、Air720SL模块Luat开发:第一个Luat的Hello World
里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束