创客孙老师
创客孙老师
发布于 2024-05-20 / 16 阅读
0
0

使用MicroPython和pyboard开发板(10):安全模式和回复出厂设置

pyboard的定时器Timer

pyboard一共有14个定时器,每个定时器都由一个独立的计数器组成,按照用户定义的频率运行,可以把它们设置为在特定时间间隔内运行某个功能。14个定时器的编号为1至14,其中3为内部专用,5和6用于伺服和ADC/DAC控制,所以应尽量避免使用3、5、6这几个定时器。

timer.png

下面使用REPL交互创建一个计时器对象:

>>> tim = pyb.Timer(4)

现在看下刚创建的对象:

>>> tim
Timer(4)

可以看到,tim连接到了定时器4,但尚未初始化。因此,下面其初始化为10Hz(即每秒10次)频率触发:

>>> tim.init(freq=10)

现在它已经初始化,可以看到一些关于定时器的信息:

>>> tim
Timer(4, prescaler=624, period=13439, mode=UP, div=1)

该信息表示该定时器设置为以外设时钟速度除以624+1运行,并且从0计数到13439,此时触发中断,然后再次从0开始计数。这些数字是设置为使定时器在10Hz触发:定时器的源频率为84MHz(通过运行tim.source_freq()发现),因此得到84MHz/625/13440=10Hz

定时器计数器

那么能用定时器做些什么呢?最基本的是获取计数器的当前值:

>>> tim.counter()
21504

这个计数器会不断变化,并且递增计数。

定时器回调

接下来注册一个回调函数,让定时器在触发时执行:

>>> tim.callback(lambda t:pyb.LED(1).toggle())

此时红色LED就会立即开始闪烁。它将以5 Hz的频率闪烁(1次闪烁需要2次开关,因此开关10Hz会让它以5Hz的频率闪烁)。可以通过重新初始化定时器来改变频率:

>>> tim.init(freq=20)

可以通过传递值None来禁用回调:

>>> tim.callback(None)

传递给callback 的函数必须包含一个参数,即触发的定时器对象。这样就可以在回调函数中控制定时器。

下面创建2个计时器并独立运行它们:

>>> tim4 = pyb.Timer(4, freq=10)
>>> tim7 = pyb.Timer(7, freq=20)
>>> tim4.callback(lambda t: pyb.LED(1).toggle())
>>> tim7.callback(lambda t: pyb.LED(2).toggle())

由于回调是真正的硬件中断,所以可以在这些计时器运行时继续使用pyboard做其他事情。

制作微秒计数器

可以使用定时器创建一个微秒计数器,这在需要进行精确计时的情况下会很有用。这里使用定时器2,因为定时器2有一个32位计数器(定时器5也有32位计数器,但定时器5,内部用于伺服驱动器,如果使用5就不能同时使用伺服驱动器了)。
定时器2的设置如下:

>>> micros = pyb.Timer(2, prescaler=83, period=0x3fffffff)

预分频器设置为83,因此该定时器的计数频率为1MHz。这是因为运行频率为168 MHz的CPU时钟除以2再除以预分频器+1,定时器2的频率为168MHz/2/(83+1)=1 MHz。周期被设置为一个比较大的数值,以便定时器在返回零点前能持续较长的时间。在这种情况下,大约需要17分钟才能循环归零。

在使用计数器前,先将其重置为0:

>>> micros.counter(0)

然后开始计时:

>>> start_micros = micros.counter()

... do some stuff ...

>>> end_micros = micros.counter()

评论