【雕爷学编程】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的哥伦布开发板支持外部中断功能,具有异步响应、低功耗和多通道支持等特点。外部中断适用于按键检测、传感器触发、通信触发等应用场景。在使用外部中断时,需要注意中断优先级的设置、中断冲突的处理以及中断服务程序的编写。

案例一:使用外部中断检测按键按下

from machine import Pin, Timer
import time

# 定义按键连接的GPIO引脚
button_pin = Pin(0, Pin.IN, Pin.PULL_UP)

# 定义定时器对象,用于检测按键按下的时间间隔
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: None)

# 定义按键按下的标志位
button_pressed = False

def button_callback(t):
    global button_pressed
    if not button_pressed and not button_pin.value():
        button_pressed = True
        print("按键按下")
    elif button_pressed and button_pin.value():
        button_pressed = False
        print("按键释放")

# 注册按键中断回调函数
button_pin.irq(trigger=Pin.IRQ_FALLING, handler=button_callback)

while True:
    pass

要点解读:
首先导入所需的库和模块,如machine、Pin、Timer等。
定义按键连接的GPIO引脚,这里使用STM32F407的PA0引脚作为按键输入。
初始化定时器对象,设置周期为1000毫秒,模式为周期性,回调函数为空。
定义一个全局变量button_pressed,用于表示按键是否被按下。
定义按键中断回调函数button_callback,当按键按下时,将button_pressed设置为True,并打印"按键按下";当按键释放时,将button_pressed设置为False,并打印"按键释放"。
使用irq方法注册按键中断回调函数,设置触发方式为下降沿触发。
最后使用一个无限循环来保持程序运行。

案例二:使用外部中断检测传感器数据变化

from machine import Pin, Timer
import time

# 定义传感器连接的GPIO引脚
sensor_pin = Pin(2, Pin.IN)

# 定义定时器对象,用于检测传感器数据变化的时间间隔
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: None)

# 定义传感器数据变化的计数器
counter = 0

def sensor_callback(t):
    global counter
    if not sensor_pin.value() and counter == 0:
        counter += 1
        print("传感器数据变化")
    elif sensor_pin.value() and counter > 0:
        counter -= 1
        print("传感器数据稳定")

# 注册传感器中断回调函数
sensor_pin.irq(trigger=Pin.IRQ_RISING, handler=sensor_callback)

while True:
    pass

要点解读:
首先导入所需的库和模块,如machine、Pin、Timer等。
定义传感器连接的GPIO引脚,这里使用STM32F407的PC2引脚作为传感器输入。
初始化定时器对象,设置周期为1000毫秒,模式为周期性,回调函数为空。
定义一个全局变量counter,用于表示传感器数据变化的计数。
定义传感器中断回调函数sensor_callback,当传感器数据从低电平变为高电平时,将counter加1,并打印"传感器数据变化";当传感器数据从高电平变为低电平时,将counter减1,并打印"传感器数据稳定"。
使用irq方法注册传感器中断回调函数,设置触发方式为上升沿触发。
最后使用一个无限循环来保持程序运行。

案例三:使用外部中断实现PWM输出控制

from machine import Pin, PWM, Timer
import time

# 定义PWM输出连接的GPIO引脚
pwm_pin = Pin(3, Pin.OUT)

# 定义定时器对象,用于控制PWM输出的频率
tim = Timer(-1)
tim.init(freq=1000, mode=Timer.PERIODIC, callback=lambda t: None)

# 定义PWM占空比的计数器
duty_counter = 0

def pwm_callback(t):
    global duty_counter
    if duty_counter < 50:
        duty_counter += 1
        pwm_pin.value(1)
    elif duty_counter < 100:
        duty_counter += 1
        pwm_pin.value(0)
    else:
        duty_counter = 0
        pwm_pin.value(0)

# 注册PWM中断回调函数
pwm_pin.irq(trigger=Pin.IRQ_RISING, handler=pwm_callback)

while True:
    pass

要点解读:
首先导入所需的库和模块,如machine、Pin、PWM、Timer等。
定义PWM输出连接的GPIO引脚,这里使用STM32F407的PC3引脚作为PWM输出。
初始化定时器对象,设置频率为1000Hz,模式为周期性,回调函数为空。
定义一个全局变量duty_counter,用于表示PWM占空比的计数。
定义PWM中断回调函数pwm_callback,当PWM占空比从0%增加到50%时,将PWM输出设置为高电平;当PWM占空比从50%增加到100%时,将PWM输出设置为低电平;当PWM占空比回到0%时,将PWM输出设置为低电平。
使用irq方法注册PWM中断回调函数,设置触发方式为上升沿触发。
最后使用一个无限循环来保持程序运行。

案例四:单个外部中断的处理

from machine import Pin  
import time  
  
# 初始化GPIO  
GPIO = {  
    "GPIO_EXTI": 14,  # 外中断引脚  
}  
  
exti = Pin(GPIO["GPIO_EXTI"], Pin.IN, Pin.PULL_UP)  # 中断引脚输入,内部上拉  
  
# 处理中断的函数  
def exti_isr():  
    print("External interrupt occurred!")  
  
# 设置中断处理程序  
exti.irq(handler=exti_isr, trigger=Pin.IRQ_FALLING)  # 下降沿触发  
  
while True:  
    time.sleep(1)

解读:在此示例中,我们初始化了GPIO引脚作为外部中断。然后我们定义了一个中断处理函数exti_isr(),当中断发生时,该函数会被调用。使用exti.irq()方法来设置中断处理程序和中断触发条件(这里设置的是下降沿触发)。在主循环中,我们让程序暂停1秒以防止过度消耗CPU资源。

案例五:多个外部中断的处理

from machine import Pin  
import time  
  
# 初始化GPIO  
GPIO = {  
    "GPIO_EXTI": [14, 15],  # 外中断引脚  
}  
  
exti = [Pin(GPIO["GPIO_EXTI"][i], Pin.IN, Pin.PULL_UP) for i in range(2)]  # 中断引脚输入,内部上拉  
  
# 处理中断的函数  
def exti_isr(pin):  
    print(f"External interrupt {pin.id} occurred!")  
  
# 设置中断处理程序  
for i, pin in enumerate(exti):  
    pin.irq(handler=exti_isr, trigger=Pin.IRQ_FALLING)  # 下降沿触发  
  
while True:  
    time.sleep(1)

解读:这个例子展示了如何处理两个外部中断。与上一个例子相似,我们初始化了两个GPIO引脚作为外部中断,并定义了一个中断处理函数exti_isr()。然后,我们使用列表推导式初始化两个中断引脚,并为每个引脚设置中断处理程序和触发条件。在主循环中,程序暂停1秒以防止过度消耗CPU资源。

案例六:外部中断与定时器的综合应用

from machine import Pin, Timer  
import time  
  
# 初始化GPIO和定时器  
GPIO = {  
    "GPIO_EXTI": 14,  # 外中断引脚  
    "GPIO_TIM": 5,  # 定时器控制引脚  
}  
timer = Timer()  # 创建定时器对象  
pin_tim = Pin(GPIO["GPIO_TIM"], Pin.OUT)  # 定时器控制引脚输出  
exti = Pin(GPIO["GPIO_EXTI"], Pin.IN, Pin.PULL_UP)  # 中断引脚输入,内部上拉  
  
# 处理中断的函数  
def exti_isr():  
    print("External interrupt occurred!")  
    timer.init(period=1000, mode=Timer.ONE_SHOT, callback=timer_callback)  # 初始化定时器,1秒触发一次  
  
def timer_callback():  
    print("Timer callback occurred!")  # 定时器回调函数,这里只是打印一条信息  
    pin_tim.value(1 if exti.value() else 0)  # 根据外部中断的状态来控制定时器控制引脚的输出  
  
# 设置中断处理程序  
exti.irq(handler=exti_isr, trigger=Pin.IRQ_FALLING)  # 下降沿触发  
  
timer.start()  # 启动定时器  
while True:  
    time.sleep(1)  # 程序主循环,暂停1秒以防止过度消耗CPU资源

解读:这个例子展示了如何将外部中断和定时器结合使用。当外部中断发生时,我们初始化一个定时器,并在每次定时器触发时,根据外部中断的状态来控制定时器控制引脚的输出。注意这里使用了Timer模块来实现定时器的功能,同时在中断处理程序中初始化了定时器。在主循环中,程序暂停1秒以防止过度消耗CPU资源。

案例七:使用外部中断检测按钮按下

import pyb

button_pin = pyb.Pin('PA0', pyb.Pin.IN, pyb.Pin.PULL_UP)  # 使用PA0引脚作为按钮输入
led_pin = pyb.Pin('PB0', pyb.Pin.OUT)  # 使用PB0引脚控制LED输出

def button_interrupt_handler(line):
    led_pin.toggle()  # 切换LED状态

button = pyb.ExtInt(button_pin, pyb.ExtInt.IRQ_FALLING, pyb.Pin.PULL_UP, button_interrupt_handler)

while True:
    pyb.delay(1000)  # 延时1秒

要点解读:
该程序使用MicroPython在STM32F407上使用外部中断检测按钮的按下。
使用pyb模块的Pin类初始化一个Pin对象,'PA0’表示使用PA0引脚作为按钮输入,'PB0’表示使用PB0引脚控制LED输出。
创建一个按钮中断处理函数button_interrupt_handler,在按钮按下时切换LED的状态。
使用pyb模块的ExtInt类初始化一个ExtInt对象,将按钮引脚、中断触发类型和中断处理函数传递给它。
在一个无限循环中,使用delay()函数延时1秒,使程序持续运行。

案例八:使用外部中断计数脉冲数量

import pyb

pulse_pin = pyb.Pin('PA0', pyb.Pin.IN)  # 使用PA0引脚作为脉冲输入
counter = 0  # 脉冲计数器

def pulse_interrupt_handler(line):
    global counter
    counter += 1

pulse = pyb.ExtInt(pulse_pin, pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, pulse_interrupt_handler)

while True:
    print("Pulse count:", counter)
    pyb.delay(1000)  # 延时1秒

要点解读:
该程序使用MicroPython在STM32F407上使用外部中断计数脉冲的数量。
使用pyb模块的Pin类初始化一个Pin对象,'PA0’表示使用PA0引脚作为脉冲输入。
创建一个脉冲中断处理函数pulse_interrupt_handler,每次触发中断时,脉冲计数器加1。
使用pyb模块的ExtInt类初始化一个ExtInt对象,将脉冲引脚、中断触发类型和中断处理函数传递给它。
在一个无限循环中,打印脉冲计数器的值,并使用delay()函数延时1秒,以便持续监测脉冲数量。

案例九:使用外部中断实现双边沿触发

import pyb

edge_pin = pyb.Pin('PA0', pyb.Pin.IN)  # 使用PA0引脚作为边沿触发输入
led_pin = pyb.Pin('PB0', pyb.Pin.OUT)  # 使用PB0引脚控制LED输出

def edge_interrupt_handler(line):
    led_pin.toggle()  # 切换LED状态

edge = pyb.ExtInt(edge_pin, pyb.ExtInt.IRQ_RISING_FALLING, pyb.Pin.PULL_NONE, edge_interrupt_handler)

while True:
    pyb.delay(1000)  # 延时1秒

要点解读:
该程序使用MicroPython在STM32F407上使用外部中断实现双边沿触发。
使用pyb模块的Pin类初始化一个Pin对象,'PA0’表示使用PA0引脚作为边沿触发输入,'PB0’表示使用PB0引脚控制LED输出。
创建一个边沿触发中断处理函数edge_interrupt_handler,在每次边沿触发时切换LED的状态。
使用pyb模块的ExtInt类初始化一个ExtInt对象,将边沿触发引脚、中断触发类型和中断处理函数传递给它。
在一个无限循环中,使用delay()函数延时1秒,使程序持续运行。
这些案例展示了如何在STM32F407上使用MicroPython编程语言使用外部中断的实际应用。您可以根据具体的硬件和需求进行适当的调整和扩展。

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

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值