03 - EXIT实验

前面我们学习了 ESP32 的 IO 口最基本的输入输出功能,本节课我们将学习 IO 口作为外部中断输入来使用,我们将以中断的方式,实现我们在“KEY实验”所实现的功能。

本节课目标:

        开发板载的boot按键,以外部中断的方式,控制板载的LED灯翻转。

本节课内容:

  1. 外部中断简介
  2. machine.Pin类
  3. 硬件设计
  4. 软件设计
  5. 下载验证

一、外部中断简介

        在上一节“KEY实验”中,为了即时响应按键状态的变化并触发LED灯的反应,程序采用了持续监测按键boot状态的轮询方式,此为基本且直接的方法。然而,轮询机制在某些实际应用场景下可能存在局限性,即当按键被按下时,若程序正处于传感器数据采集阶段,则可能无法即时捕捉到按键动作,导致系统响应延迟或失效。为解决此问题,可对该按键配置外部中断功能。

        外部中断是由外部设备触发的请求中断机制,每个中断都关联着一个特定的中断服务程序(或称中断回调函数),该程序在逻辑上独立于主程序之外。当中断条件满足时,控制器会暂停当前执行的主程序流程,转而执行相应的中断服务程序。待中断服务程序执行完毕后,控制器将自动恢复到主程序被中断时的执行点,继续执行主程序。通过这种方式,系统能够实现对外部事件的即时响应与处理,从而提升系统的实时性和可靠性。

二、machine.Pin类

Pin 类提供了设置引脚模式(输入或输出)的方法,以及获取和设置引脚数字逻辑值(0 或 1)的方法。要创建一个 Pin 对象,我们需要指定一个标识符,该标识符用于唯一标识特定的输入/输出引脚。标识符可以是一个整数、字符串,或者是一个包含端口和引脚号码的元组。

下面是MicroPython库的machine.Pin类链接。

类引脚 – 控制 I/O 引脚 — MicroPython latest 文档

1. machine.Pin类的构造对象

构造对象方法如下:

class machine.Pin(id, mode=-1, pull=-1,value=None)

使用示例:led = machine.Pin(2, Pin.OUT, value = 1)

构造函数的参数描述如下:

参数

描述

id

id是必需的,可以是任意对象。在可能的值中 类型包括:int (内部 Pin 标识符)、str (Pin 名称) 和 tuple (一对 [port,pin])。

mode

  • Pin.IN- Pin 配置为输入。如果被视为输出,则引脚 处于高阻抗状态
  • Pin.OUT- 引脚配置为 (正常) 输出
  • Pin.OPEN_DRAIN- 引脚配置为漏极开路输出。开漏 output 的工作方式如下:如果 output value 设置为 0,则 pin 在较低级别活跃;如果 output 值为 1,则 pin 处于高阻抗状态。并非所有 ports 都实现此模式,或者有些 ports 可能仅在某些 pins上实现
  • Pin.ANALOG- Pin 配置为模拟输入

pull

  • None- 无上拉或下拉电阻。
  • Pin.PULL_UP- 上拉电阻使能。
  • Pin.PULL_DOWN- 下拉电阻使能。

value

仅对 Pin.OUT Pin.OPEN_DRAIN模式有效,并指定初始 output pin 值(如果给定),否则 pin peripheral 的状态保持不变

返回值:Pin 类对象

2. machine.Pin类的方法

设置外部中断

方法原型如下:

Pin.irq(handler=None,trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING))

方法的参数描述如下:

参数

描述

handler

  • handler是中断时要调用的可选函数 触发器。处理程序必须只接受一个参数,即实例。Pin

trigger

配置可以生成中断的事件。 可能的值为:

  • Pin.IRQ_FALLINGInterrupt on Falling Edge。
  • Pin.IRQ_RISINGInterrupt on rising edge(上升沿中断)。
  • Pin.IRQ_LOW_LEVEL低电平中断。
  • Pin.IRQ_HIGH_LEVELhigh level 上的 interrupt。

返回值:回调对象

三、硬件设计

1. 例程功能

通过编程控制开发板上的LED灯,以500ms间隔交替闪烁,实现类似跑马灯的动态效果。

2. 硬件资源

  • LED 灯:GPIO2 --> LED 【高电平:亮; 低电平:灭】
  • boot按键:GPIO0 --> key 【按下:低电压;松开:高电压】

3. 原理图

四、软件设计

1. 程序流程图

程序

from machine import Pin
import time


# 实例化 LED
led = Pin(2, Pin.OUT, value=0)

# 实例化按键,配置 KEY 引脚模式及上下拉
key = Pin(0, Pin.IN, Pin.PULL_UP)


def KEY_INT_IRQHandler(key):
    """
    按键中断服务函数
    :param key: 管脚
    """
    time.sleep_ms(10)           # 延时 10ms

    if key.value() == 0:
        led.value(not led.value())


"""
----------------------------- 以下相当于 main() 函数 ----------------------------------
"""
# 定义中断,下降沿触发 按键中断服务函数
key.irq(handler=KEY_INT_IRQHandler, trigger=Pin.IRQ_FALLING )

while True:
    pass

五、下载验证

        开发板载的boot按键,可以控制板载的LED灯状态的翻转。

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值