我们学习了如何使用 Micropython 和 ESP32 实现 GPIO 输入输出功能。然而,这种方式存在一个问题:代码需要不断地检测 IO 输入口的变化,导致效率较低。特别是在一些特定场景下,例如某个按键可能一天只被按下一次,但我们仍然浪费了大量时间实时检测按键情况。
为了解决这个问题,我们引入了外部中断的概念。顾名思义,当按键被按下(产生中断)时,我们才去执行相关功能。这大大节省了 CPU 的资源,因此中断在实际项目中的应用非常普遍。
在这个实验证中,我们利用中断方式来检查按键 KEY 状态,被按键被按下(产生外部中断)后使 LED的亮灭状态翻转。
什么是外部中断
外部中断是一种硬件机制,用于通知 CPU 有事件发生。当某个特定的条件满足时(例如,一个按键被按下),CPU 会暂停当前的任务,转而执行与该事件相关的处理程序。这样,我们可以在事件发生时才去处理,而不是持续地检测事件是否发生。
材料准备
连接电路
数字电路中的高低电平
在数字电路中,信号的传输是通过电压的变化来实现的。上升沿、下降沿和高低电平是描述信号变化过程的重要概念。
1.高电平和低电平:
高电平和低电平是用来表示数字信号的两个状态。通常情况下,我们将逻辑“1”对应的电压值称为高电平(如3.3V或5V),将逻辑“0”对应的电压值称为低电平(如0V)。这两个状态之间的电压差称为阈值电压。
2.上升沿:
上升沿是指信号从低电平跳变到高电平的过程。在这个过程中,信号的电压从一个阈值电压上升到另一个阈值电压。上升沿通常用于表示一个事件的发生,例如按键按下、时钟信号的上升等。
3.下降沿:
下降沿是指信号从高电平跳变到低电平的过程。在这个过程中,信号的电压从一个阈值电压下降到另一个阈值电压。下降沿通常用于表示一个事件的结束,例如按键释放、时钟信号的下降等。
编写代码
代码简说
外部中断也是通过 machine 模块的 Pin 子模块来配置,我们来看看其配构造函数和使用方法:
构造函数
KEY=machine.Pin(id,mode,pull) 构建按键对象
- id:引脚编号
- mode:输入输出方式
- pull:上下拉电阻配置
中断使用方法
KEY.irq(handler,trigger) 配置中断模式
handler:中断执行的回调函数;
trigger: 触发中断的方式,共 4 种分别是
- Pin.IRQ_FALLING(下降沿触发)
- Pin.IRQ_RISING(上升沿触发)
- Pin.IRQ_LOW_LEVEL(低电平触发)
- Pin.IRQ_HIGH_LEVEL(高电平触发)
上升沿和下降沿触发统称边沿触发,根据前面的波形图,我们可以选择下降沿方式触发外部中断,也就是当按键被按下的时候立即产生中断。
整体思路中断跟前面的实验类似,在初始化中断后,当系统检测到外部终端时候,执行 LED 亮灭状态反转的代码即可。
在以上代码中,需要注意以下几点:
1.在函数fun
中使用全局变量state
时,需要使用global state
声明,否则会在函数内部创建一个新的同名变量,导致冲突。
2.在定义回调函数fun
时,需要将Pin
对象KEY
作为参数传递进去。这样可以确保在回调函数内部可以访问到正确的引脚对象。
运行程序
运行代码,每次按下按键 LED 状态翻转。
总结
从参考代码来看,仅仅几行代码就实现了实验功能,而且相对于使用while True
实时检测函数来说,代码的效率得到了极大的提升。外部中断的应用非常广泛,不仅包括普通的按键输入和电平检测,还有很多输入设备,如传感器,也是通过外部中断方式来实时检测的。这些在后面的章节中会详细讲解。
现在越来越注重青少年的科创活动,micropython,树莓派,arduino,图形化编程学会了硬件控制的基础,这些平台用起来大同小异。
-
led灯
+关注
关注
22文章
1592浏览量
107841 -
外部中断
+关注
关注
1文章
131浏览量
15801 -
欧姆电阻
+关注
关注
0文章
71浏览量
15568 -
阈值电压
+关注
关注
0文章
73浏览量
51366 -
ESP32
+关注
关注
18文章
958浏览量
17094
发布评论请先 登录
相关推荐
评论