Maix Bit(K210) 定时器控制 RGB LED灯闪烁

it2023-07-28  68

定时器使用

1、定义管脚2、定时器使用2.1 、构造函数2.3、常用函数2.3 、常量 3 、代码4、效果   定时器在单片机硬件里面也是比较重要的一部分了,随决定使用定时器控制RGB彩灯进行定时闪烁,即定时3s,每3s LED灯闪烁一次,但是理想是美好的,导入 from board import board_info 居然给我报错,那还了得,错误如下图所示:

随即一想这玩意不就是把管脚重新定义了一遍吗,那就直接不要它了,自己直接看原理图。 如图所示,管脚分别为LED_G、LED_R、LED_B、BOOT按键分别与芯片管脚12、13、14、16 相对应。虽然在代码里面添加了按键,但是按键的有效范围在RGB_LED灯闪烁的时候才能检测到,所以测试的时候可以把按键一直按下去,等到灯闪烁就检测到了。

1、定义管脚

上图所示,根据原理图管脚自己直接定义使用:

fm.register(12, fm.fpioa.GPIO0, force=True) fm.register(13, fm.fpioa.GPIOHS0, force=True) fm.register(14, fm.fpioa.GPIO2, force=True) fm.register(16, fm.fpioa.GPIO3, force=True) led_r = GPIO(GPIO.GPIO0, GPIO.OUT) led_g = GPIO(GPIO.GPIOHS0, GPIO.OUT) led_b = GPIO(GPIO.GPIO2, GPIO.OUT) key_input = GPIO(GPIO.GPIO3, GPIO.IN)

2、定时器使用

  硬件定时器,可以用来定时触发任务或者处理任务,设定时间到了后可以触发中断(调用回调函数),精度比软件定时器高。K210共有 3 个定时器, 每个定时器有 4 个通道可以使用。

2.1 、构造函数

通过指定的参数新建一个 Timer 对象

class 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) clk_timer*period(unit:s) 应该 < 2^32 并且 >=1

自己构造的函数如下(定时3s ): on_timer,是定义的回调函数。

tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_ONE_SHOT, period=3000, callback=on_timer, arg=on_timer)

2.3、常用函数

启动定时器:

Timer.start()

停止定时器:

Timer.stop()

重新开启定时器:

Timer.restart()

获取或者设置回调函数:

Timer.callback(callback)

callback: 设置的回调函数,可选参数, 如果不传参数,则只返回先有的回调函数

2.3 、常量

TIMER0: Timer0 id TIMER1: Timer1 id TIMER2: Timer2 id CHANNEL0: Timer 通道 0 CHANNEL1: Timer 通道 1 CHANNEL2: Timer 通道 2 CHANNEL3: Timer 通道 3 MODE_ONE_SHOT: Timer 只运行一次(回调一次) MODE_PERIODIC: Timer 始终运行(连续回调) MODE_PWM: 定时器不用来回调函数,用以产生PWM UNIT_S: 单位秒 (s) UNIT_MS: 单位毫秒 (ms) UNIT_US: 单位微秒 (us) UNIT_NS: 单位纳秒 (ns)

以上来源MaixPy文档,如需定时器更多详细的使用https://maixpy.sipeed.com/zh/api_reference/machine/timer.html

3 、代码

from machine import Timer import time from Maix import GPIO from fpioa_manager import fm fm.register(12, fm.fpioa.GPIO0, force=True) fm.register(13, fm.fpioa.GPIOHS0, force=True) fm.register(14, fm.fpioa.GPIO2, force=True) fm.register(16, fm.fpioa.GPIO3, force=True) led_r = GPIO(GPIO.GPIO0, GPIO.OUT) led_g = GPIO(GPIO.GPIOHS0, GPIO.OUT) led_b = GPIO(GPIO.GPIO2, GPIO.OUT) key_input = GPIO(GPIO.GPIO3, GPIO.IN) def on_timer(timer): status = 0 for i in range(0, 2): led_r.value(status) time.sleep_ms(300) led_g.value(status) time.sleep_ms(300) led_b.value(status) time.sleep_ms(300) status = 0 if (status == 1) else 1 time.sleep_ms(300) print("LED RGB(%d,%d,%d)" % (led_r.value(), led_g.value(), led_b.value())) time.sleep_ms(100) print("key_input:", key_input.value()) print("time up:",timer) print("param:",timer.callback_arg()) tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_ONE_SHOT, period=3000, callback=on_timer, arg=on_timer) print("period:",tim.period()) if __name__=='__main__': while(True): tim.start()

4、效果

最新回复(0)