【雕爷学编程】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)开发板中的延时器是一种用于控制时间延迟的功能模块。下面将以专业的视角为您详细解释延时器的主要特点、应用场景以及需要注意的事项。

主要特点:

精确的延时控制:哥伦布开发板的延时器可以提供精确的时间延迟控制,以微秒、毫秒或秒为单位进行延时操作。这使得开发者能够对程序的执行时间进行精确控制。

高效的时间管理:延时器功能可以帮助开发者在程序中实现时间间隔的控制,避免不必要的等待和资源浪费。通过延时器,可以在需要的时候暂停程序执行,达到时间同步和节约资源的效果。

简单实用:延时器功能在MicroPython中提供了简单易用的接口和函数,开发者可以直接调用相应的函数实现延时操作,无需复杂的配置和编程。

应用场景:

任务调度和时间控制:延时器可用于任务调度和时间控制的场景。例如,在多任务系统中,可以利用延时器实现不同任务间的时间片轮转或优先级调度,确保任务按照预定的时间顺序执行。

传感器数据采集:延时器功能可用于控制传感器数据的采集频率。通过设定适当的延时时间,可以实现按照一定频率采集传感器数据,用于监测、测量和控制等应用。

实时系统应用:延时器在实时系统中起到关键作用。实时系统要求对任务的响应时间有严格要求,延时器可用于实现任务的实时调度和时间同步,确保系统按照预定的时间要求执行任务。

需要注意的事项:

延时误差:延时器的精确度受到系统时钟频率和延时函数的实现方式等因素的影响。在使用延时器时,需要注意延时误差的问题,尤其是对于对时间精度要求较高的应用,可能需要进行校准或采用其他精确的计时方式。

系统负载和响应性:在设计系统时,需要考虑系统负载和响应性对延时器的影响。如果系统负载较高或存在其他中断任务,延时器的精确度和稳定性可能会受到影响。因此,需要合理安排任务和中断的优先级,以确保延时器的可靠性。

低功耗考虑:延时器功能在一些低功耗应用中需要特别注意功耗管理。在设计中,需要合理使用延时器功能,避免不必要的延时和能耗浪费。

综上所述,MicroPython的哥伦布开发板中的延时器具备精确的延时控制和高效的时间管理特点。它适用于任务调度、传感器数据采集和实时系统等应用场景。在使用延时器时,需要注意延时误差、系统负载和响应性以及低功耗管理等方面的问题。

案例1:延时程序

import time

def delay(seconds):
    time.sleep(seconds)

delay(5)  # 延时5秒

要点解读:这个程序使用了Python的time模块中的sleep函数来实现延时。通过传入一个参数(秒数),程序会暂停执行指定的时间。在这个例子中,我们让程序暂停了5秒。

案例2:计时器程

import time

start_time = time.time()  # 获取当前时间戳

# 在这里执行你的代码

end_time = time.time()  # 获取当前时间戳
elapsed_time = end_time - start_time  # 计算经过的时间

print("经过的时间:", elapsed_time, "秒")

要点解读:这个程序同样使用了Python的time模块来获取当前时间戳。在程序开始时,我们记录了一个时间戳,然后在程序结束时再次记录一个时间戳。通过计算这两个时间戳之间的差值,我们可以得到程序运行所花费的时间。在这个例子中,我们打印出了程序运行所花费的时间。

案例3:使用STM32F407定时器实现延时和计时器的程

#include "stm32f4xx.h"
#include "stm32f4xx_tim.h"

void TIM2_IRQHandler(void) {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        // 在这里执行你的代码
    }
}

int main(void) {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 9999;  // 设置自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler = 8399;  // 设置预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 设置时钟分割因子
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 设置计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  // 使能定时器更新中断
    TIM_Cmd(TIM2, ENABLE);  // 使能定时器

    while (1) {
        if (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != RESET) {
            TIM_ClearFlag(TIM2, TIM_FLAG_Update);  // 清除定时器更新标志位
            // 在这里执行你的代码
        }
    }
}

要点解读:这个程序使用了STM32F407的定时器(TIM2)来实现延时和计时器功能。首先,我们需要配置定时器的参数,包括自动重装载值、预分频值、时钟分割因子和计数模式。然后,我们使能定时器更新中断,并在主循环中检查定时器更新标志位。当标志位被清除时,我们可以在此处执行我们的代码。

案例4:简单的延时

import utime  
  
def delay():  
    utime.sleep(1)  # 延时1秒  
  
delay()  # 调用延时函数

这个例子中,我们使用了utime.sleep函数来进行延时。这个函数的参数是秒数,所以utime.sleep(1)就是让程序暂停1秒。

案例5:使用机器模块进行精确延时

import machine  
import utime  
  
def delay(microseconds):  
    delay_time = microseconds / 1000000  # 将微秒转换为秒  
    machine.Timer(2).init(period=delay_time, mode=machine.TimerMode.IMMEDIATE).start()  # 启动定时器  
  
delay(1000000)  # 延时1秒

这个例子中,我们使用了STM32的硬件定时器功能进行延时。首先通过machine.Timer创建一个定时器对象,然后初始化定时器,设置定时器模式为IMMEDIATE,即定时器触发后立即返回。然后通过start方法启动定时器。需要注意的是这里的定时器触发周期是设定时间的倒数,即设定时间越短,定时器触发频率越高。

案例三:定时器中断服务程序

import machine  
import utime  
  
def timer_callback():  
    print("Timer interrupt!")  
  
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函数,打印出"Timer interrupt!"。在主循环中,我们没有放入任何任务,所以这个程序会一直等待定时器中断。在实际应用中,可以在主循环中放入需要持续执行的任务。

要点解读:
在使用utime.sleep进行延时时,要注意这个函数的延时精度可能不高,特别是在一些低功耗或者CPU负载较高的环境下。
使用STM32的硬件定时器进行延时可以获得更高的精度和稳定性,但是使用相对复杂。
在使用定时器中断服务程序时,需要特别注意不要在中断服务程序中修改全局变量,因为在修改全局变量的同时,主程序可能也在修改这个变量,从而导致数据错误。如果要修改全局变量,最好在主程序中进行。

案例7:延时

import time

time.sleep(2)
print("Delay complete")

要点解读:
该程序使用MicroPython实现延时功能,延时2秒钟。
使用time模块的sleep()函数进行延时操作。
在延时过程中,程序暂停执行。
延时完成后,打印"Delay complete"。

案例8:定时器中断

import pyb

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

tim = pyb.Timer(1)
tim.init(freq=1)
tim.callback(timer_callback)

while True:
    pass

要点解读:
该程序使用MicroPython实现定时器中断功能。
定义了一个名为timer_callback()的回调函数,用于处理定时器中断事件。
使用pyb模块的Timer类初始化一个Timer对象,参数1表示选择定时器1(可以根据硬件连接进行调整)。
通过init()方法初始化定时器的频率,这里设置为1Hz,即每秒触发一次中断。
使用callback()方法将回调函数与定时器关联,当定时器中断发生时,回调函数将被调用。
在主程序中,通过一个空的while循环保持程序运行,等待定时器中断事件的发生。
当定时器中断发生时,回调函数将被执行,打印"Timer interrupt"。

案例9:计时器

import pyb

start_time = pyb.micros()

while True:
    elapsed_time = pyb.elapsed_micros(start_time)
    print("Elapsed time:", elapsed_time)
    pyb.delay(1000)

要点解读:
该程序使用MicroPython实现计时器功能,计算从程序开始运行到当前时间的经过时间。
使用pyb模块的micros()函数获取当前时间的微秒数,作为计时器的起始时间。
在循环中,通过elapsed_micros()函数计算从起始时间到当前时间的经过时间,以微秒为单位。
使用print()打印经过时间。
使用pyb.delay(1000)方法延时1秒钟,控制循环的执行频率。
这些案例展示了MicroPython在STM32F407上延时和计时器的实际运用。第一个案例是简单的延时功能,第二个案例是使用定时器实现中断,第三个案例是使用计时器计算经过时间。通过这些案例,可以看到MicroPython在延时和计时功能上的简洁性和灵活性,可以满足不同应用场景的需求。请注意,具体的硬件连接和配置可能因实际情况而异,需要根据具体的硬件和引脚分配进行调整。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值