【雕爷学编程】MicroPython手册之 哥伦布 (STM32F407) 计时器

在这里插入图片描述
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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
哥伦布(Columbus)是指STMicroelectronics推出的一款微控制器系列,其中STM32F407是该系列中的一款型号。下面是关于STM32F407微控制器的详细技术参数:

1、核心处理器:
ARM Cortex-M4核心,具有单周期乘法和硬件除法指令支持。
最高频率可达168 MHz,提供快速的计算和执行能力。
2、存储和存储器:
1 MB的Flash存储器,用于程序代码的存储。
192 KB的SRAM,用于数据存储和变量缓存。
可选的外部存储器接口(如SD卡、NAND闪存等)。
3、外设:
多个通用输入/输出引脚(GPIO):用于连接外部设备和传感器。
多个串行通信接口:包括USART、SPI和I2C等,用于与其他设备进行通信。
USB接口:用于连接外部设备,如计算机或其他USB设备。
定时器和计数器:包括通用定时器、高级定时器和基本定时器,用于定时和计数操作。
模数转换器(ADC):用于模拟信号的采样和转换。
数字模拟转换器(DAC):用于数字信号的模拟输出。
PWM输出:用于产生脉冲宽度调制信号,控制电机和其他执行器。
外部中断:用于检测和响应外部触发事件。
4、电源和时钟:
工作电压范围:通常为1.8V至3.6V,具体型号可能有所不同。
内部时钟源:包括高精度内部振荡器(HSI)和外部晶体振荡器(HSE)。
低功耗模式:支持多种低功耗模式,以延长电池寿命或降低功耗。
5、封装和引脚:
可用的封装类型:LQFP、LFBGA等。
引脚数量和配置:具体取决于型号和封装类型。
6、开发支持:
提供开发工具链和集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench等。
支持多种编程语言,如C和汇编语言。
提供丰富的开发文档、参考手册和示例代码。

需要注意的是,以上列出的技术参数是一般性的描述,具体的技术参数可能因具体的STM32F407型号和封装类型而有所不同。对于特定型号和应用场景,建议查阅STMicroelectronics官方文档和相关资料以获取准确和详尽的技术参数。

在这里插入图片描述
MicroPython的哥伦布(STM32F407)开发板中的计时器是一种用于测量和控制时间的功能模块。下面将以专业的视角为您详细解释计时器的主要特点、应用场景以及需要注意的事项。

主要特点:

多种计时模式:哥伦布开发板的计时器支持多种计时模式,包括定时器模式、输入捕获模式和输出比较模式等。这使得开发者可以根据具体需求选择合适的计时模式。

精确的时间测量:计时器功能通过STM32F407微控制器的硬件计时器实现,具备高精度和稳定性。开发者可以利用计时器进行精确的时间测量,如测量时间间隔、脉冲宽度等。

中断支持:计时器功能通常与中断结合使用,可以在特定事件发生时触发中断,实现及时的响应和处理。这在实时性要求较高的应用中非常有用。

应用场景:

定时任务和事件触发:计时器可用于实现定时任务和事件触发的场景。通过设定合适的定时器参数,可以在特定时间间隔或特定时刻触发任务执行或事件发生,如周期性数据采集、周期性发送数据等。

输入捕获和频率测量:计时器的输入捕获模式可用于测量外部事件的时间间隔或脉冲宽度。这在测量脉冲信号、计算频率等应用中非常有用。

PWM信号生成和控制:计时器的输出比较模式可用于生成和控制PWM信号。通过设定计时器的周期和占空比,可以实现精确的PWM输出,用于驱动电机、调光控制等应用。

需要注意的事项:

计时模式的选择:在使用计时器功能时,需要根据具体应用需求选择合适的计时模式。不同的计时模式适用于不同的应用场景,开发者需要根据具体需求进行选择。

中断处理:计时器通常与中断结合使用,需要合理处理中断相关的代码。开发者需要了解中断处理的机制和注意事项,以确保计时器功能的正确运行。

系统时钟和时钟分频:计时器的精确度和分辨率受到系统时钟频率和时钟分频因子的影响。在使用计时器之前,需要正确配置系统时钟和时钟分频,以确保计时器的准确性和可靠性。

综上所述,MicroPython的哥伦布开发板中的计时器具备多种计时模式、精确的时间测量和中断支持等特点。它适用于定时任务、事件触发、输入捕获、频率测量和PWM信号生成等应用场景。在使用计时器时,需要注意计时模式的选择、中断处理和系统时钟配置等方面的问题。

案例1:使用MicroPython的STM32F407定时器实现LED闪烁

import machine
import time

# 初始化STM32F407的GPIO和定时器
led = machine.Pin(13, machine.Pin.OUT)  # 设置GPIO13为输出模式
tim = machine.Timer(2)  # 设置定时器2

# 定义定时器中断处理函数
def timer_irq_handler(timer):
    led.value(not led.value())  # 切换LED状态

# 配置定时器中断,每隔1秒触发一次
tim.init(period=1000000, mode=machine.Timer.PERIODIC, callback=timer_irq_handler)

# 启动定时器
tim.start()

# 主循环,保持程序运行
while True:
    pass

要点解读:这个程序使用了MicroPython的STM32F407定时器来实现LED闪烁。首先,我们导入了machine和time模块。然后,我们初始化了STM32F407的GPIO(这里使用的是GPIO13)和定时器(这里使用的是定时器2)。接着,我们定义了一个定时器中断处理函数timer_irq_handler,在这个函数中,我们切换了LED的状态。然后,我们配置了定时器中断,设置了定时器的周期为1秒,并指定了回调函数为timer_irq_handler。最后,我们启动了定时器,并在主循环中保持程序运行。

案例2:使用MicroPython的STM32F407定时器实现PWM输

import machine
import time

# 初始化STM32F407的GPIO和定时器
pwm = machine.PWM(18, freq=5000, duty=50)  # 设置GPIO18为PWM输出,频率为5000Hz,占空比为50%
tim = machine.Timer(2)  # 设置定时器2

# 定义定时器中断处理函数
def timer_irq_handler(timer):
    pwm.duty(pwm.duty() + 10)  # 改变PWM占空比
    if pwm.duty() > 100:  # 如果占空比超过100%,则重置为0
        pwm.duty(0)

# 配置定时器中断,每隔1秒触发一次
tim.init(period=1000000, mode=machine.Timer.PERIODIC, callback=timer_irq_handler)

# 启动定时器
tim.start()

# 主循环,保持程序运行
while True:
    pass

要点解读:这个程序使用了MicroPython的STM32F407定时器来实现PWM输出。首先,我们导入了machine和time模块。然后,我们初始化了STM32F407的GPIO(这里使用的是GPIO18)和定时器(这里使用的是定时器2)。接着,我们定义了一个定时器中断处理函数timer_irq_handler,在这个函数中,我们改变了PWM的占空比,并在占空比超过100%时将其重置为0。然后,我们配置了定时器中断,设置了定时器的周期为1秒,并指定了回调函数为timer_irq_handler。最后,我们启动了定时器,并在主循环中保持程序运行。

案例3:使用MicroPython的STM32F407定时器实现串口通

import machine
import time
import serial

# 初始化STM32F407的GPIO、定时器和串口
led = machine.Pin(13, machine.Pin.OUT)  # 设置GPIO13为输出模式
tim = machine.Timer(2)  # 设置定时器2
uart = serial.UART(2, 9600)  # 设置串口2,波特率为9600

# 定义定时器中断处理函数
def timer_irq_handler(timer):
    led.value(not led.value())  # 切换LED状态
    uart.write('Hello, STM32F407!\n')  # 通过串口发送数据

# 配置定时器中断,每隔1秒触发一次
tim.init(period=1000000, mode=machine.Timer.PERIODIC, callback=timer_irq_handler)

# 启动定时器
tim.start()

# 主循环,保持程序运行
while True:
    pass

要点解读:这个程序使用了MicroPython的STM32F407定时器来实现串口通信。首先,我们导入了machine、time和serial模块。然后,我们初始化了STM32F407的GPIO(这里使用的是GPIO13)、定时器(这里使用的是定时器2)和串口(这里使用的是串口2)。接着,我们定义了一个定时器中断处理函数timer_irq_handler,在这个函数中,我们切换了LED的状态,并通过串口发送数据。然后,我们配置了定时器中断,设置了定时器的周期为1秒,并指定了回调函数为timer_irq_handler。最后,我们启动了定时器,并在主循环中保持程序运行。

案例4:使用内置的sysptime服务进行计时

import machine  
import utime  
  
last_time = utime.time()  
current_time = utime.localtime()  
  
while True:  
    current_time = utime.localtime()  
    delta_time = utime.mktime(current_time) - utime.mktime(last_time)  
    print(delta_time)  
    last_time = current_time  
    utime.sleep(1)  # 延时1秒

这个例子中,我们使用了MicroPython的utime模块中的time和localtime函数获取当前时间,并计算相对于上次打印时间的时间差。该程序会持续运行并在每秒打印出时间差。

案例5:使用硬件定时器进行计时

import machine  
import utime  
  
def timer_callback():  
    global delta_time  
    current_time = utime.time()  
    delta_time += 1  
    print(delta_time)  
  
timer = machine.Timer(3)  # 使用定时器3  
timer.init(period=1, mode=machine.TimerMode.IMMEDIATE, callback=timer_callback)  # 设置定时器周期为1秒,回调函数为timer_callback  
timer.start()  # 启动定时器  
  
while True:  
    pass  # 主循环,这里什么都没做

在这个例子中,我们定义了一个定时器中断服务程序,每秒钟执行一次timer_callback函数。在该函数中,我们获取当前时间,并计算相对于上次回调的时间差,每秒打印出该时间差。需要注意的是,我们使用了一个全局变量delta_time来保存时间差,这是因为我们在中断服务程序中修改了这个变量,而在主程序中也需要访问这个变量。

案例6:定时器唤醒延迟

import machine  
import utime  
  
def timer_callback():  
    global delta_time  
    current_time = utime.time()  
    delta_time = current_time - last_time  
    print(delta_time)  
    last_time = current_time  # 更新最后唤醒时间  
  
timer = machine.Timer(3)  # 使用定时器3  
timer.init(period=1, mode=machine.TimerMode.IMMEDIATE, callback=timer_callback)  # 设置定时器周期为1秒,回调函数为timer_callback  
timer.start()  # 启动定时器  
  
last_time = utime.time()  # 初始化最后唤醒时间  
while True:  
    pass  # 主循环,这里什么都没做

在这个例子中,我们使用了一个定时器中断服务程序和一个全局变量delta_time来记录从上一次唤醒到现在的经过时间。定时器中断服务程序每秒钟执行一次,计算时间差并打印。与前一个例子不同的是,我们在主循环中没有进行任何延时操作,因此如果程序没有被唤醒,则不会进行任何操作。这种方式可以在一些需要进行唤醒延迟的场景中使用。

案例7:计时器精确延时

import pyb

def delay_us(microseconds):
    start_time = pyb.micros()
    while pyb.elapsed_micros(start_time) < microseconds:
        pass

delay_us(1000)  # Delay for 1 millisecond (1000 microseconds)
print("Delay complete")

要点解读:
该程序使用MicroPython实现一个精确的微秒级延时函数。
delay_us()函数接受一个参数,表示延时的微秒数。
使用pyb模块的micros()函数获取当前时间的微秒数作为计时器的起始时间。
在while循环中,使用elapsed_micros()函数计算从起始时间到当前时间的经过时间。
当经过时间小于给定的延时微秒数时,继续循环等待。
当经过时间达到给定的延时微秒数时,跳出循环,延时完成。
打印"Delay complete"表示延时完成。

案例8:测量时间间隔

import pyb

def measure_time():
    start_time = pyb.micros()
    # 执行需要测量时间的操作
    pyb.delay(100)
    elapsed_time = pyb.elapsed_micros(start_time)
    print("Elapsed time:", elapsed_time, "microseconds")

measure_time()

要点解读:
该程序使用MicroPython测量一段代码的执行时间。
定义了一个名为measure_time()的函数,用于测量时间间隔。
使用pyb模块的micros()函数获取当前时间的微秒数作为计时器的起始时间。
在需要测量时间的代码段中,执行需要测量时间的操作,这里使用pyb.delay(100)模拟一个耗时100毫秒的操作。
使用elapsed_micros()函数计算从起始时间到当前时间的经过时间。
打印经过时间,表示代码段的执行时间间隔。

案例9:定时器中断

import pyb

def timer_callback(timer):
    print("Timer interrupt")

tim = pyb.Timer(2, freq=1)
tim.callback(timer_callback)

while True:
    pass

要点解读:
该程序使用MicroPython实现定时器中断功能。
定义了一个名为timer_callback()的回调函数,用于处理定时器中断事件。
使用pyb模块的Timer类初始化一个Timer对象,参数2表示选择定时器2(可以根据硬件连接进行调整),设置频率为1Hz,即每秒触发一次中断。
使用callback()方法将回调函数与定时器关联,当定时器中断发生时,回调函数将被调用。
在主程序中,通过一个空的while循环保持程序运行,等待定时器中断事件的发生。
当定时器中断发生时,回调函数将被执行,打印"Timer interrupt"。
这些案例展示了MicroPython在STM32F407微控制器上使用计时器的实际运用。第一个案例是实现精确的微秒级延时,第二个案例是测量代码段的执行时间,第三个案例是使用定时器实现中断。通过这些案例,可以看到MicroPython在计时和中断功能上的应用灵活性和可靠性。请注意,具体的硬件连接和配置可能因实际情况而异,需要根据具体的硬件和引脚分配进行调整。

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

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值