# 定时器 - [概要](#概要) - [什么是定时器?](#什么是定时器) - [machine.Timer API详解](#machinetimer-api详解) - [宏定义](#宏定义) - [类](#类) - [构造定时器](#构造定时器) - [函数](#函数) - [初始化](#初始化) - [释放资源](#释放资源) - [查看状态](#查看状态) - [示例](#示例) ## 概要    本节介绍了定时器与回调函数的概念,以及如何在MicroPython中使用定时器。 ### 什么是定时器?   定时器可以理解为一个闹钟,设定特定时间之后执行某件事情,也可以周期的执行某件事情。   定时器与`utime`模块中的`sleep`延时函数最大区别在于,延时函数期间,CPU就如同进入了睡眠,之后的事情只有等睡醒之后再做,这种情况我们称之为**阻塞**, 睡觉阻塞了cpu去完成其他的任务,必须等待CPU睡醒;而定时器是**非阻塞**的,在未到达定时器定时周期结束之前,CPU可以去做别的事情,等到定时器计时完毕,便会去通知CPU,CPU再去执行**回调函数** (在你设定闹钟之前,你决定要在闹钟响了之后去做的事情)。   定时器每个周期都会产生一次中断,然后调用特定的 **回调函数callback**, 定时器中断属于内部中断. > #### 中断 > > CPU的中断分为很多种,不同的中断拥有不同的优先级别。当多个中断同时发生时,计算机按照优先级来以此处理 ## machine.Timer API详解   使用`import Timer`导入定时器`Timer`模块   再使用`TAB` 按键来查看`Timer`中所包含的内容: ```python >>> from machine import Timer >>> Timer. __del__ ONCE PERIODIC deinit init isrunning ``` ### 宏定义   下面的宏定义用于配置network,设置对应网络模式。 | 宏定义 | 含义 | | -------------- | :----------------------------------------- | | Timer.ONCE | 计时器运行一次,直到通道的配置时间到期为止 | | Timer.PERIODIC | 计时器以通道的已配置频率定期运行 | ### 类   `class Time(id)`   `id`:任意正整数作为ID #### 构造定时器   用Timer对象的构造器函数   示例: ```python >>> from machine import Timer >>> timer = Timer(1)#创建一个定时器 ``` ### 函数   在接下来的示例中, 构造`id=1`的`Timer`对象来列举`Timer`对象的函数。 ```python >>> from machine import Timer >>> timer = Timer(1)#创建一个定时器 ``` #### 初始化   `timer.init(ticks=, type=, callback=)`。   函数说明:初始化定时器`Timer` - `ticks` 定时器执行的周期,单位是`10ms`, 隔period ms 执行一次。 period取值范围: `0 < period <= 3435973836` - `type` 定时器的执行模式,可以是`Timer.PERIODIC`或`Timer.ONCE` - `callback`: 定时器的回调函数,传入的一个参数是`timer` - 在callback函数里面传入其他参数,可以采用**Lambda表达式** 的方法。 - 注意,**不要在定时器回调函数里面创建变量**,可以使用 **全局变量 global**,因为定时器每次都创建变量比较消耗内存。   示例: ```python >>> from machine import Timer >>> timer = Timer(1)#创建一个定时器 >>> timer.init(period=200, mode=Timer.PERIODIC , callback=lambda t:print("callback"))#初始化定时器,隔2s执行回调函数打印callback,一直执行 ``` #### 释放资源   `timer.deinit()`。   函数说明:释放定时器`Timer`资源   定时器使用完了记得要释放定时器资源,键盘中断并不会销毁定时器,定时器会一直产生回调函数。 ```python >>> from machine import Timer >>> timer = Timer(1)#创建一个定时器 >>> timer.init(period=2000, mode=Timer.PERIODIC , callback=lambda t:print("callback"))#初始化定时器,隔2s执行回调函数打印callback,一直执行 >>> timer.deinit()#释放资源 ``` #### 查看状态   `timer.isrunning()`。   函数说明:查看定时器`Timer`是否在运行,返回运行状态,True正在运行,False不在运行。   有时定时器调用回调函数时间可能比较长,或者没有回调函数,不方便判断现在定时器是否还在运行,可以采用该函数查看。 ```python >>> from machine import Timer >>> timer = Timer(1)#创建一个定时器 >>> timer.init(period=2000, mode=Timer.PERIODIC , callback=lambda t:print("callback"))#初始化定时器,隔2s执行回调函数打印callback,一直执行 >>> timer.isrunning()#查看定时器运行状态 True ``` ## 示例   定时打印文字 ```python from machine import Timer def test(args): print("Test") t = Timer(0) t.init(type=Timer.PERIODIC, callback=test, ticks=3000) t.deinit() ```   第一行导入`machine`模块的定时类`Timer`   第二、三行创建回调函数,打印Test   第四创建定时器0   第五行初始化定时器 - ticks=3000:定时器运行周期3s - type=Timer.PERIODIC:定时器以通道的已配置频率3s定期运行 - callback=test:回调函数是创建的函数`test`   第六行释放定时器0资源。