Micropython STM32F4外部中断实验

Micropython STM32F4外部中断实验


  • 📌固件刷可参考前面一篇《STM32刷Micropython固件参考指南
  • 🌿 相关篇《Micropython STM32F4入门点灯
  • 📍固件下载:https://micropython.org/download/?mcu=stm32f4
  • 🔖本例程基于STM32F4DISC,主控芯片STM32F407VGT6,使用固件版本:MicroPython v1.20.0 on 2023-04-26
  • 📑mpy外部中断,可以参考Micropython官方开发参考文档:https://docs.micropython.org/en/latest/library/pyb.ExtInt.html#pyb-extint
  • 🛠开发平台基于Thonny

📓查询外部中断模块相关函数和常量

>>> from pyb import ExtInt
>>> help(ExtInt)
object <class 'ExtInt'> is of type type
  line -- <function>
  enable -- <function>
  disable -- <function>
  swint -- <function>
  regs -- <staticmethod>
  IRQ_RISING -- 269549568
  IRQ_FALLING -- 270598144
  IRQ_RISING_FALLING -- 271646720
    EVT_RISING -- 269615104
  EVT_FALLING -- 270663680
  EVT_RISING_FALLING -- 271712256
  • 🌿ExtInt.disable():不使能外部中断。
  • 🌿ExtInt.enable():使能外部中断。
  • 🌿ExtInt.line():发生外部中断时,返回引脚映射到的中断线。
  • 🌿ExtInt.swint():从软件触发回调。
  • 🌿ExtInt.regs(): 转储 EXTI 寄存器的值。
  • 常量:
    • ExtInt.IRQ_FALLING:下降沿触发。
    • ExtInt.IRQ_RISING:上升沿触发。
    • ExtInt.IRQ_RISING_FALLING:边沿触发。(上升沿或下降沿)
    • ExtInt.EVT_FALLING:下降沿事件
    • ExtInt.EVT_RISING:上降沿事件
    • ExtInt.EVT_RISING_FALLING:边沿事件
  • ✨EVT_xxx模式与睡眠模式WFE指令有关。
  • ⚡需要注意的是,在IDE中,调试执行睡眠模式相关代码,对应的调试端口号会消失。因为睡眠模式下,基本的硬件外设基本关闭了,无法进行在线调试。
pyb.ExtInt(pin, mode, pull, callback):创建中断对象
  • pin is the pin on which to enable the interrupt (can be a pin object or any valid pin name).

  • mode can be one of: - - trigger on a rising edge; - - trigger on a falling edge; - - trigger on a rising or falling edge.ExtInt.IRQ_RISINGExtInt.IRQ_FALLINGExtInt.IRQ_RISING_FALLING

  • pull can be one of: - - no pull up or down resistors; - - enable the pull-up resistor; - - enable the pull-down resistor.pyb.Pin.PULL_NONEpyb.Pin.PULL_UPpyb.Pin.PULL_DOWN

  • callback is the function to call when the interrupt triggers. The callback function must accept exactly 1 argument, which is the line that triggered the interrupt.回调函数形参一定要带上中断线line

📝外部中断例程代码

'''
STM32F4DISC开发板引脚映射关系
  1=red(PD14), 2=green(PD12), 3=yellow(PD13), 4=blue(PD15)
LED_GREEN   PD12
LED_ORANGE  PD13
LED_RED     PD14
LED_BLUE    PD15

  IRQ_RISING -- 269549568
  IRQ_FALLING -- 270598144
  IRQ_RISING_FALLING -- 271646720
'''

from pyb import Pin, ExtInt
from pyb import LED
import time # 调用sleep sleep_ms sleep_us延时函数
INT_EXT = Pin('E3', Pin.IN, Pin.PULL_UP)
LED_Pin = Pin('E13', Pin.OUT_PP)  #PE13设置为推挽输出
LED_Pin2 = Pin('E14', Pin.OUT_PP)  #PE14设置为推挽输出
# callback = lambda e: print('intr PE3 Pin')

def callback(line):    
     LED_Pin.value(0)      #设为低电平
     time.sleep(0.5)
     LED_Pin.value(1)      #设为高电平
     time.sleep(0.5)
     print('intr PE3 Pin')
     print("line =", line)
     

def led_toggle():
     
     LED_Pin2.value(0)      #设为低电平
     time.sleep(0.5)
     LED_Pin2.value(1)      #设为高电平
     time.sleep(0.5)
     
ext = ExtInt(INT_EXT, ExtInt.IRQ_FALLING, Pin.PULL_UP, callback)     

if __name__ == '__main__':   
    while True:
        led_toggle()

在这里插入图片描述

from pyb import Pin, ExtInt
from machine import Pin

# 初始化GPIO引脚
# 初始化GPIO引脚为上拉输入
gpio_pin = Pin('E2', Pin.IN, Pin.PULL_UP)
p_out = Pin('E12', Pin.OUT_PP)

def interrupt_handler(pin):
    print("External interrupt triggered!")
#    p_out.value(p_out.value()^1 ) # 状态取反
    p_out.value(not p_out.value())	# 状态取反,同上


# 配置外部中断
gpio_pin.irq(trigger=Pin.IRQ_FALLING, handler=interrupt_handler)
📗停机模式下外部中断事件唤醒示例
  • ✨需要注意,直接在IDE里面运行下面的调试程序时,当执行到pyb.stop()时,端口会消失,因为CPU进入了停机模式,所有外设停止了工作,所以端口也会消失,当按下E3时,将会激活CPU,继续往下执行。
'''
STM32F4DISC开发板引脚映射关系
  1=red(PD14), 2=green(PD12), 3=yellow(PD13), 4=blue(PD15)
LED_GREEN   PD12
LED_ORANGE  PD13
LED_RED     PD14
LED_BLUE    PD15

  IRQ_RISING -- 269549568
  IRQ_FALLING -- 270598144
  IRQ_RISING_FALLING -- 271646720
  EVT_RISING -- 269615104
  EVT_FALLING -- 270663680
  EVT_RISING_FALLING -- 271712256
'''

import pyb
from pyb import Pin, ExtInt
from pyb import LED
import time # 调用sleep sleep_ms sleep_us延时函数

INT_EXT = Pin('E3', Pin.IN, Pin.PULL_UP)
INT_EXT2 = Pin('E2', Pin.IN, Pin.PULL_UP)
LED_Pin = Pin('E13', Pin.OUT_PP)  #PE13设置为推挽输出
LED_Pin2 = Pin('E14', Pin.OUT_PP)  #PE14设置为推挽输出
#pyb.repl_uart(pyb.UART(1, 9600)) # 复制 REPL 到 UART(1)

value_freq = pyb.freq() # 获取 CPU 和总线的频率
print('value_freq:%s'% str(value_freq))
#pyb.freq(84000000) # 设置 CPU 工作频率为 84MHz


def task(line):
    print("外部中断事件已触发")
    print("line =", line)
    

def callback(line):    
     LED_Pin.value(0)      #设为低电平
     time.sleep(0.5)
     LED_Pin.value(1)      #设为高电平
     time.sleep(0.5)
     print('intr PE3 Pin')
     print("line =", line)
     
def led_toggle():    
     LED_Pin2.value(0)      #设为低电平
     time.sleep(0.5)
     LED_Pin2.value(1)      #设为高电平
     time.sleep(0.5)     

# 创建一个外部中断对象,绑定到指定的引脚
ext = ExtInt(INT_EXT2, ExtInt.EVT_FALLING, Pin.PULL_UP, callback) #E2
Ext3 = ExtInt(INT_EXT, ExtInt.IRQ_FALLING, Pin.PULL_UP, task) # E3
pyb.stop() # 进入STOP模式, 等待外部中断,停止往下执行,直到E3发生外部中断,才会往下执行
# pyb.wfi() # 进入低功耗睡眠模式

if __name__ == '__main__':   
    while True:
        led_toggle()

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值