3、定时器实验
About 2 min
例程代码
from machine import Timer
import time
def on_timer(timer):
print("调用定时器回调函数")
timer = Timer(Timer.TIMER0, Timer.CHANNEL0,mode=Timer.MODE_PERIODIC, period=100,unit=Timer.UNIT_MS, callback=on_timer, arg=None)
last_time = time.ticks_ms()
try:
while True:
if time.ticks_ms() - last_time >= 200:
last_time = time.ticks_ms()
print("这是主循环")
except:
timer.deinit()
del timer
实验准备
- 通过usb线将K210与电脑连接。
- 打开CanMV IDE,执行上面的例程代码。
实验结果
- 运行之后,点开底部的 串行终端,就可以看到打印出来的调试信息。由于定时器是每100毫秒打印一次数据,而while循环是每200秒打印一次数据,所以最终看起来的效果是每打印一次主循环信息,就会打印两次定时器信息。
例程代码讲解
- 导入运行例程所需的模块。
from machine import Timer
import time
- 定义了一个名为 on_timer 的函数,它将作为定时器的回调函数。当定时器触发时,这个函数就会被执行,在这个函数内部只是简单地打印了一条消息 "调用定时器回调函数"。
def on_timer(timer):
print("调用定时器回调函数")
- 创建一个定时器实例。
Timer.TIMER0 和 Timer.CHANNEL0:指定了使用的定时器编号和通道编号,这里使用的是定时器 0 的通道 0。mode=Timer.MODE_PERIODIC:设置定时器的工作模式为周期性模式,意味着定时器会按照设定的周期不断触发。period=100 和unit=Timer.UNIT_MS:表示定时器的周期为 100 毫秒,单位是毫秒。callback=on_timer:将之前定义的 on_timer 函数设置为定时器触发时的回调函数。arg=None:这里没有传递额外的参数给回调函数,如果有需要可以设置具体的参数值。
- 创建一个定时器实例。
timer = Timer(Timer.TIMER0, Timer.CHANNEL0,mode=Timer.MODE_PERIODIC, period=100,unit=Timer.UNIT_MS, callback=on_timer, arg=None)
- 通过 time.ticks_ms() 获取当前的毫秒级时间戳,并将其赋值给 last_time,用于后续的时间比较。
last_time = time.ticks_ms()
- 进入一个无限循环 while True。在每次循环中,通过 time.ticks_ms() 获取当前时间戳,并与 last_time 进行比较。如果两者的差值大于等于 2000 毫秒(即 2 秒),就会执行以下操作:
更新 last_time 为当前的时间戳,以便下一次的时间比较。
打印 "这是主循环" 这条消息。
如果在循环过程中出现异常,会执行 except 块中的代码:
首先调用 timer.deinit() 方法来停用定时器,释放相关资源。
然后使用 del timer 删除定时器对象,彻底清理相关的内存占用等。
- 进入一个无限循环 while True。在每次循环中,通过 time.ticks_ms() 获取当前时间戳,并与 last_time 进行比较。如果两者的差值大于等于 2000 毫秒(即 2 秒),就会执行以下操作:
try:
while True:
if time.ticks_ms() - last_time >= 200:
last_time = time.ticks_ms()
print("这是主循环")
except:
timer.deinit()
del timer