【雕爷学编程】MicroPython手册之达芬奇 TKM32F499 定时器

发布于:2023-10-25 ⋅ 阅读:(113) ⋅ 点赞:(0)

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
达芬奇 TKM32F499是一款基于ARM Cortex-M4内核的微控制器,以下是其主要的参考技术参数:
1、内核和性能:
内核: ARM Cortex-M4
最高主频: 240 MHz
性能: 225 DMIPS / 608 CoreMark
2、存储器:
Flash存储器: 1 MB
RAM: 192 KB
存储器接口: 支持外部存储器扩展(例如,SD卡,NOR Flash等)
3、外设接口:
通用IO口(GPIO): 支持多达 101 个GPIO引脚,可用于数字输入/输出、中断等。
串行通信接口: 包括多个UART、SPI、I2C接口,用于与外部设备进行通信。
USB接口: 支持USB 2.0 FS(全速)。
定时器: 包括多个定时器/计数器,可用于定时、脉冲宽度调制(PWM)等应用。
ADC和DAC: 内置多个模数转换器(ADC)和数模转换器(DAC),用于模拟信号的采集和输出。
LCD控制器: 支持液晶显示器(LCD)的控制和驱动。
触摸控制器: 支持电容式触摸屏的控制和输入。
SD卡控制器: 支持SD卡的读写操作。
Ethernet控制器: 支持以太网通信。
4、电源管理:
电源供应: 支持广泛的电源电压范围,包括 3.0V 至 3.6V 的工作电压。
低功耗模式: 支持多种低功耗模式,以最小化功耗。
5、安全性:
安全特性: 支持硬件加密和解密、随机数生成器等安全功能,保护系统的数据和通信安全。
6、开发工具支持:
开发环境: 支持常见的开发环境,如Keil MDK、IAR Embedded Workbench等。
调试接口: 支持标准的SWD(Serial Wire Debug)调试接口。

在这里插入图片描述
MicroPython的达芬奇TKM32F499具有强大的定时器功能,下面将以专业的视角为您详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

多个定时器:达芬奇TKM32F499支持多个定时器,可以同时管理多个定时任务。每个定时器都有独立的计数器和配置寄存器,可以进行个性化的定时设置。

灵活的定时模式:该微控制器的定时器支持多种定时模式,包括定时器、计数器和PWM输出等。可以根据应用的需求选择不同的模式,并根据需要进行定时器的配置和操作。

中断功能:达芬奇TKM32F499的定时器可以配合中断功能使用,当定时器计数满足设定的条件时,会触发中断请求。这可以用于实现定时任务的精确控制和时间触发的事件处理。

高精度支持:该微控制器的定时器具有较高的精度,可以满足对时间精确度要求较高的应用。通过合理的配置和使用,可以实现微秒级别的定时和测量。

应用场景:

实时任务调度:达芬奇TKM32F499的定时器可以用于实时任务调度,通过设置定时器的周期和中断功能,可以精确地控制任务的执行时间和频率,实现实时性要求较高的应用。

PWM输出控制:通过定时器的PWM输出功能,可以实现对电机、LED灯等设备的精确控制。可以根据需求设置定时器的周期和占空比,实现各种PWM波形的生成。

测量和计时应用:达芬奇TKM32F499的定时器可以用于测量和计时应用,如测量脉冲宽度、计算时间间隔等。利用定时器的计数功能,可以实现高精度的测量和计时操作。

需要注意的事项:

定时器冲突:当使用多个定时器时,需要注意定时器之间的冲突和资源占用情况。合理规划和管理定时器的使用,避免冲突和资源竞争。

中断处理:在使用定时器的中断功能时,需要编写相应的中断处理函数,并正确处理中断请求。合理的中断处理设计可以确保定时器的稳定和可靠运行。

定时器溢出:定时器的计数范围是有限的,当计数器溢出时需要进行处理。可以通过设置定时器的自动重载功能,以及合理的定时器配置,来避免计数器溢出导致的问题。

综上所述,MicroPython的达芬奇TKM32F499的定时器功能具有多个定时器、灵活的定时模式、中断功能和高精度支持。它适用于实时任务调度、PWM输出控制以及测量和计时应用。在使用定时器时需要注意定时器冲突、中断处理和定时器溢出等问题。

达芬奇TKM32F499的定时器在MicroPython中可以通过machine模块进行操作。以下是几个使用定时器的实际运用程序参考代码案例,并附上要点解读:

案例1:定时器中断计数
这段代码使用定时器每隔1秒产生一次中断,并在每次中断时增加一个计数器的值

import machine 

import utime  
  
counter = 0  
  
def timer_isr():  
    global counter  
    counter += 1  
    print(counter)  
  
timer = machine.Timer(-1)  
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_isr)  
  
while True:  
    utime.sleep(1)  # 主循环休眠1秒,用于降低CPU占用

要点解读:
machine.Timer(-1):创建一个定时器对象,-1表示使用硬件定时器。
’timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_isr):初始化定时器,设置每隔1000毫秒(即1秒)触发一次中断,并指定中断服务程序为timer_isrtimer_isr():这是定时器的中断服务程序,每次定时器中断时,会执行这个函数,并在函数内增加计数器的值,并打印出来。 utime.sleep(1)`:主循环休眠1秒,这样可以大大降低CPU的占用率,否则会导致CPU使用率过高。

案例2:定时器PWM输出
这段代码使用定时器生成一个PWM信号,控制LED的亮度。

import machine  
import utime  
  
led = machine.Pin(5, machine.Pin.OUT)  # 假设LED连接在P5口  
  
def pwm_isr():  
    global led_value  
    led_value = (led_value + 1) % 256  # 每次定时器触发时,led_value加1,然后在0-255范围内循环  
    led.value(led_value)  # 根据led_value的值来控制LED的亮度  
  
led_value = 0  # 初始化LED亮度值  
  
timer = machine.Timer(-1)  
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=pwm_isr)  # 每隔1秒触发一次pwm_isr函数

要点解读:
led = machine.Pin(5, machine.Pin.OUT):将P5口定义为输出引脚,用于控制LED。
pwm_isr():这是定时器的中断服务程序,它会在每次定时器触发时执行。在这个函数内,LED的亮度值led_value会加1,然后在0-255范围内循环。然后根据led_value的值来控制LED的亮度。使用PWM信号可以实现对LED亮度的调节。要注意的是,定时器的周期和PWM的频率以及占空比都有关系,需要根据实际情况调整。

案例3:定时器延时执行
这段代码使用定时器实现一个延时功能,比如延时执行某个操作。

import machine  
import utime  
  
def delay_action():  
    print("执行延时操作")  
  
timer = machine.Timer(-1)  
timer.init(period=1000, mode=machine.Timer.SINGLE_SHOT, callback=delay_action)  # 定时器只触发一次,延时执行delay_action函数  
utime.sleep(2)  # 主循环休眠2秒,等待定时器触发延时操作

要点解读:
timer.init(period=1000, mode=machine.Timer.SINGLE_SHOT, callback=delay_action):初始化定时器,设置每隔1000毫秒(即1秒)触发一次中断,并指定中断服务程序为delay_action。这里将定时器模式设置为SINGLE_SHOT,即只触发一次。当定时器触发后,会执行delay_action()函数。要注意的是,由于这里设置了定时器只触发一次,所以在delay_action()执行完毕后,定时器就停止了。如果需要定时器持续触发,应该将模式设置为PERIODIC

案例4:使用MicroPython读取达芬奇 TKM32F499的温度传感器数据

from machine import Pin, I2C
import time
import dht

# 初始化I2C接口和温度传感器
i2c = I2C(scl=Pin(2), sda=Pin(3))
dht_sensor = dht.DHT11(Pin(4))

while True:
    # 读取温度传感器数据
    humidity, temperature = dht_sensor.read()

    # 如果读取成功,打印温度和湿度值
    if humidity is not None and temperature is not None:
        print("温度:{:.1f}℃,湿度:{:.1f}%".format(temperature, humidity))
    else:
        print("无法读取温度传感器数据")

    # 延时1秒后继续循环
    time.sleep(1)

要点解读:
导入所需的库和模块。
初始化I2C接口和温度传感器,这里使用的是TKM32F499的I2C接口和DHT11温度传感器。
在循环中,首先调用dht_sensor.read()方法读取温度和湿度值。
如果读取成功,打印温度和湿度值;否则,打印无法读取温度传感器数据的提示信息。
延时1秒后继续循环,避免频繁读取导致CPU占用过高。

案例5:定时器PWM输出
这段代码使用定时器生成一个PWM信号,控制LED的亮度。

import machine  
import utime  
  
led = machine.Pin(5, machine.Pin.OUT)  # 假设LED连接在P5口  
  
def pwm_isr():  
    global led_value  
    led_value = (led_value + 1) % 256  # 每次定时器触发时,led_value加1,然后在0-255范围内循环  
    led.value(led_value)  # 根据led_value的值来控制LED的亮度  
  
led_value = 0  # 初始化LED亮度值  
  
timer = machine.Timer(-1)  
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=pwm_isr)  # 每隔1秒触发一次pwm_isr函数

要点解读:
led = machine.Pin(5, machine.Pin.OUT):将P5口定义为输出引脚,用于控制LED。
pwm_isr():这是定时器的中断服务程序,它会在每次定时器触发时执行。在这个函数内,LED的亮度值led_value会加1,然后在0-255范围内循环。然后根据led_value的值来控制LED的亮度。使用PWM信号可以实现对LED亮度的调节。要注意的是,定时器的周期和PWM的频率以及占空比都有关系,需要根据实际情况调整。

案例6:定时器作为延时器使用
这段代码使用定时器作为延时器,实现一个简单的闪烁LED的功能。

import machine  
import utime  
  
led = machine.Pin(5, machine.Pin.OUT)  # 假设LED连接在P5口  
  
def blink_led():  
    led.toggle()  # 切换LED的状态(亮/灭)  
    utime.sleep(1)  # 延时1秒  
  
while True:  
    blink_led()  # 调用blink_led函数,开始循环闪烁LED

要点解读:这段代码使用了一个简单的while循环来不断地调用blink_led()函数,这个函数会切换LED的状态(亮/灭),并且使用utime.sleep(1)来实现1秒的延时。这样,LED就会不断地闪烁,而且每次闪烁的间隔都是1秒。

案例7:定时器中断嵌套
这段代码使用定时器实现了一个更复杂的例子:通过嵌套的中断服务程序来控制LED的闪烁频率

import machine  
import utime  
  
led = machine.Pin(5, machine.Pin.OUT)  # 假设LED连接在P5口  
  
def timer_isr():  
    global state, blink_count  
    if state == 0:  # 第一阶段:LED亮3秒  
        led.on()  
        blink_count += 1  
        if blink_count >= 3000:  # 3000毫秒等于3秒  
            state = 1  # 进入下一阶段  
    elif state == 1:  # 第二阶段:LED灭3秒  
        led.off()  
        blink_count += 1  
        if blink_count >= 3000:  # 3000毫秒等于3秒  
            state = 0  # 进入下一阶段  
            blink_count = 0  # 重置闪烁计数器  
  
state = 0  # 初始状态为LED亮3秒  
blink_count = 0  # 初始化闪烁计数器  
  
timer = machine.Timer(-1)  
timer.init(period=3000, mode=machine.Timer.PERIODIC, callback=timer_isr)  # 每隔3秒触发一次timer_isr函数

要点解读:这段代码使用了定时器中断服务程序timer_isr()来实现一个更复杂的LED闪烁频率的控制。定时器中断服务程序被设置为每隔3秒触发一次,而且这个服务程序内部有两个状态:0和1。在状态0下,LED会亮3秒,然后进入状态1;在状态1下,LED会灭3秒,然后回到状态0。这样就实现了一个周期性的LED闪烁,而且闪烁的频率是每3秒一次。注意,定时器的周期和延时时间需要仔细调整,以便得到需要的效果。

案例8:定时器延时执行
这段代码使用定时器实现一个延时功能,比如延时执行某个操作。

import machine  
import utime  
  
def delay_action():  
    print("执行延时操作")  
  
timer = machine.Timer(-1)  
timer.init(period=1000, mode=machine.Timer.SINGLE_SHOT, callback=delay_action)  # 定时器只触发一次,延时执行delay_action函数  
utime.sleep(2)  # 主循环休眠2秒,等待定时器触发延时操作

要点解读:
timer.init(period=1000, mode=machine.Timer.SINGLE_SHOT, callback=delay_action):初始化定时器,设置每隔1000毫秒(即1秒)触发一次中断,并指定中断服务程序为delay_action。这里将定时器模式设置为SINGLE_SHOT,即只触发一次。当定时器触发后,会执行delay_action()函数。要注意的是,由于这里设置了定时器只触发一次,所以在delay_action()执行完毕后,定时器就停止了。如果需要定时器持续触发,应该将模式设置为PERIODIC

案例9:定时器中断

import utime
from machine import Timer

# 定时器中断回调函数
def timer_callback(timer):
    print("Timer interrupt")

# 创建定时器对象
timer = Timer(0)

# 设置定时器中断周期为1秒
timer.init(period=1000, mode=Timer.PERIODIC, callback=timer_callback)

# 主循环
while True:
    utime.sleep(1)

要点解读:
使用machine.Timer类创建定时器对象。
使用timer.init方法初始化定时器,设置定时器中断周期为1秒,并指定中断回调函数为timer_callback。
在中断回调函数中执行定时器中断触发时的操作。
主循环中使用utime.sleep方法进行延时,保持程序的运行。

案例10:定时器计时

import utime
from machine import Timer

# 定时器计时回调函数
def timer_callback(timer):
    global start_time
    elapsed_time = utime.ticks_diff(utime.ticks_ms(), start_time)
    print("Elapsed time: {} ms".format(elapsed_time))

# 创建定时器对象
timer = Timer(0)

# 设置计时器中断周期为100毫秒
timer.init(period=100, mode=Timer.PERIODIC, callback=timer_callback)

# 记录开始计时时间
start_time = utime.ticks_ms()

# 主循环
while True:
    pass

要点解读:
使用machine.Timer类创建定时器对象。
使用timer.init方法初始化定时器,设置定时器中断周期为100毫秒,并指定中断回调函数为timer_callback。
在计时回调函数中,使用utime.ticks_ms函数获取当前时间,并与开始计时时间计算时间差,得到经过的时间。
在主循环中保持程序的运行。

案例11:单次定时器

import utime
from machine import Timer

# 定时器中断回调函数
def timer_callback(timer):
    print("Timer interrupt")

# 创建定时器对象
timer = Timer(0)

# 设置定时器中断周期为2秒,且只触发一次
timer.init(period=2000, mode=Timer.ONE_SHOT, callback=timer_callback)

# 主循环
while True:
    pass

要点解读:
使用machine.Timer类创建定时器对象。
使用timer.init方法初始化定时器,设置定时器中断周期为2秒,并指定中断回调函数为timer_callback。
设置定时器的模式为Timer.ONE_SHOT,表示定时器只触发一次。
在主循环中保持程序的运行。以上代码案例展示了在达芬奇TKM32F499上使用MicroPython进行定时器的实际应用。您可以根据需求和实际情况,使用这些示例代码作为起点进行修改和扩展。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到