本节课主要学习K210定时器的功能。
本次实验的参考代码路径为:CanMV\03-Hardware\timer.py
模块的出厂固件已经集成定时器Timer模块,如果下载过其他固件,请烧录回出厂固件再进行实验。
from machine import Timer
import time
xxxxxxxxxx
timer = machine.Timer(id, channel, mode=Timer.MODE_ONE_SHOT, period=1000, unit=Timer.UNIT_MS, callback=None, arg=None, start=True, priority=1, div=0)
参数内容为:
id
: Timer ID, [0~2] (Timer.TIMER0~TIMER2)channel
: Timer 通道, [Timer.CHANNEL0~Timer.CHANNEL3]mode
: Timer 模式, MODE_ONE_SHOT
或者 MODE_PERIODIC
或者 MODE_PWM
period
: Timer 周期, 在启动定时器后 period
时间, 回调函数将会被调用,(0,~)unit
: 设置周期的单位,默认位毫秒(ms
),Timer.UNIT_S
或者 Timer.UNIT_MS
或者 Timer.UNIT_US
或者Timer.UNIT_NS
callback
: 定时器回调函数, 定义了两个参数, 一个是定时器对象Timer
, 第二个是在定义对象是希望传的参数arg
,更多请看arg
参数解释注意:回调函数是在中断中调用的,所以在回调函数中请不要占用太长时间以及做动态分配开关中断等动作
arg
: 希望传给回调函数的参数,作为回调函数的第二个参数start
: 是否在对象构建成功后立即开始定时器, True
:立即开始;False
:不立即开启,需要调用start()
函数来启动定时器priority
: 硬件定时器中断优先级, 与特定的CPU相关, 在K210中,取值范围是[1,7], 值越小优先级越高div
: 硬件定时器分频器,取值范围[0,255], 默认为0, clk_timer(定时器时钟频率) = clk_pll0(锁相环0频率)/2^(div+1)注意:回调函数是在中断中调用的,打印调试信息会占用较长CPU时间,这里只是作为演示,实际开发过程中请勿在中断打印调试信息。
xdef on_timer(timer):
print("This is on_timer callback")
timer = Timer(Timer.TIMER0, Timer.CHANNEL0,
mode=Timer.MODE_PERIODIC, period=100,
unit=Timer.UNIT_MS, callback=on_timer, arg=None)
xxxxxxxxxx
last_time = time.ticks_ms()
xxxxxxxxxx
try:
while True:
if time.ticks_ms() - last_time >= 200:
last_time = time.ticks_ms()
print("This is main loop")
except:
timer.deinit()
del timer
将K210模块通过microUSB数据线连接到电脑上,CanMV IDE点击连接按钮,连接完成后点击运行按钮,运行例程代码。也可以将代码作为main.py下载到K210模块上运行。
点开底部的串行终端
,就可以看到打印出来的调试信息。由于定时器是每100毫秒打印一次数据,而while循环是每200秒打印一次数据,所以最终看起来的效果是每打印一次loop信息,就会打印两次定时器信息。
使用CanMV IDE,搭配出厂固件写好的MicroPython语法,使得控制K210定时器非常轻松,只需要通过简单配置定时器参数,设置定时器的通道、周期和回调函数等,就可以正常调用定时器,避免在定时器回调函数中处理耗时过长的事情,应尽量简单快速处理完事情,最后在结束程序时需要调用deinit函数让定时器恢复默认,否则定时器回调函数不会自动停止。