Toggle navigation
首页
(current)
问答
文章
话题
商城
登录
注册
7、合宙Air模块Luat开发:定时器的使用方法
LUAT
定时器
Air720SL
教程
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) # 一、前言 >一日不见如隔三秋,距离发布上篇博客`又是一种新的外设之ADC模数转换,现...
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) > 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。 > 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获 我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考! # 一、前言 >一日不见如隔三秋,距离发布上篇博客`又是一种新的外设之ADC模数转换,现在我们可以采集模拟量数据了`已然过去了半个月,最近事情比较多,没有时间写博客,今天抽出一点时间写一篇有关Air720SL定时器的使用方法 * 那么什么是定时器呢? > 定时器通俗的讲就相当于一个闹钟。 > 我们的手机里面都有闹钟,每天早上负责叫醒我们上班不要迟到。我们只要在手机里面设置好时间,然后可以按需选择每天都响,或者选择只响一次。作用是打断正在做的事(睡觉)。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200305135611222.png) > > 在单片机系统中也是有定时器的。 >而 定时器又分为两种,分别是硬件定时器和软件定时器 > 不管是51系列、stm32系列、avr系列、亦或是其他的单片机,它们在裸机编程上都是拥有硬件定时器的,一般硬件定时器数量有几个到十几个不等,占用的是硬件资源, * 硬件定时器:一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片,其使用的时基是系统内部的高速时钟源经过分频得到的,高速时钟源又是由外部晶振倍频得到,精度非常高,但是依赖硬件,能使用的数量有限 > > 如果涉及到了操作系统编程,软件定时器那就必不可少。 * 软件定时器:一般软件定时器都是利用的是操作系统的延时阻塞性,在定时器启动和触发时记录下当前的系统时间,每隔一个时间片去查询下有没有到指定的定时时间,有的话就触发软件回调,精度相对硬件定时器要差得多,理论上是没有使用数量限制的,内存有多大,定时器就可以有多少 > 我翻过Air720SL的硬件手册和API手册好像是没有看到有关硬件定时器的说明。`我没看到不代表没有,只是我不知道`,这里我就不多说了,本片博客主要是讲Air720SL模组Luat二次开发的软件定时器怎么使用 # 二、了解软件API > Luat官方给出的定时器相关API是包含在sys驱动库文件下的。也就是说想要使用软件定时器那就必须要先`require "sys"`。 > 在4G模块上只能选择LuaTask框架 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020030513125958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) > 但是在2G模块上,有另外一个选择,官方推荐的是使用LuaTask。如果用户使用的是第一版旧版本驱动库,是不能使用本篇博客所说的软件定时器的 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200305131225688.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) > 接下来我会依次对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函数里面创建一个单次定时器,再创建四个循环定时器共用一个回调函数 ```c 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 进行分批关闭定时器 ```c 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开发板 > > 这里我们直接贴出全部代码 ```c --必须在这个位置定义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监视 ```c [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`正常执行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200305135007146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) > * 在最后出现关闭所有定时器的提示`[2020-03-05 13:47:30.956]: [I]-[timerStopAll closes all timers bound to the callback function]`,后面便停止输出,验证了`timerStopAll`执行正确 > 不会下载的[点击这里](https://blog.csdn.net/weixin_44570083/article/details/104285283),进去查看我的第二篇博文`2、Air720SL模块Luat开发:第一个Luat的Hello World`里面讲了怎么下载 > 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束
发表于 2020-03-05 14:04
阅读 ( 2138 )
分类:
默认分类
4 推荐
收藏
你可能感兴趣的文章
5、RDA8910CSDK二次开发:单次定时器和循环定时器
1696 浏览
10、合宙Air模块Luat开发:JSON字符串的生成与解析
2299 浏览
9、合宙Air模块Luat开发:认识NVS数据管理模块
1997 浏览
8、合宙Air模块Luat开发:基于官方库的二次封装,使串口更加易用
2556 浏览
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代
2734 浏览
相关问题
Air720SL的I2C及I2C2对应设备ID是?如何使用api读写16位地址寄存器
0 回答
使用循环定时器操作和使用协程中间有没有区别?哪个效果会更好?
1 回答
Air208编程
1 回答
Air202设置闹钟“AT+CALA=?”
2 回答
Air202 MQTT如何发送USERNAME PASSWORD ID ?
1 回答
Air200关于SW_DEFAULT_1.0.2_Luat_V0013_Air200_SSL.lod的问题
1 回答
0 条评论
请先
登录
后评论
陈夏
26 篇文章
作家榜
»
技术销售Delectate
43 文章
陈夏
26 文章
国梁
24 文章
miuser
21 文章
晨旭
20 文章
朱天华
19 文章
金艺
19 文章
杨奉武
18 文章
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!