文章作者:里海 来源网站:ESP32专栏
简介
????中断是指当 CPU 在正常处理主程序时,突然发生了另一件事件 A(中断发生)需要 CPU 去处理,这时 CPU 就会暂停处理主程序(中断响应),转而去处理事件 A(中断服务)。当事件 A 处理完以后,再回到主程序原来中断的地方继续执行主程序(中断返回)。这一整个过程称为中断。 中断可以根据中断源分为 硬件中断 和 软件中断:
硬件中断:也被称为外部中断,硬件中断响应外部硬件事件而发生,例如按键; 软件中断:当触发软件事件时,会发生这种类型的中断,例如定时器。 ESP32 的外部中断有上升沿、下降沿、低电平、高电平触发模式。
电路
按键接到3v3和14引脚上,使用板载lec测试
效果
软件程序设计
Arduino 中的外部中断配置函数 attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) 包括 3 个参数:
pin:GPIO 端口号; ISR:中断服务程序,没有参数与返回值的函数; mode:中断触发的方式,支持以下触发方式:
LOW 低电平触发 HIGH 高电平触发 RISING 上升沿触发 FALLING 下降沿触发 CHANGE 电平变化触发
在 Arduino 中使用中断需要注意一下几点:
尽量保证中断程序内容少 避免在中断处理函数中使用阻塞函数(如 delay()),使用非阻塞的延迟方法来处理需要延迟的操作(micros() 函数),以保证中断的正常执行和系统的稳定性。这是因为 delay() 函数会阻塞整个系统,包括中断的正常执行。当中断触发时,处理函数应该尽快执行完毕,以确保及时响应并避免中断积压; 与主程序共享的变量要加上 volatile 关键字; 在 Arduino 中使用中断时,应尽量避免在中断处理函数中使用 Serial 对象的打印函数。当在中断处理函数中使用 Serial 打印函数时,会导致以下问题:
时间延迟:Serial 打印函数通常是比较耗时的操作,它会阻塞中断的执行时间,导致中断响应的延迟。这可能会导致在中断期间丢失其他重要的中断事件或导致系统不稳定。 缓冲区溢出:Serial 对象在内部使用一个缓冲区来存储要发送的数据。如果在中断处理函数中频繁调用 Serial 打印函数,可能会导致缓冲区溢出,造成数据丢失或不可预测的行为。 为了避免这些问题,可以使用其他方式: 设置一个bool标志位,在主循环中检查标志位并进行打印、delay等操作,代码如下:
代码
# include <Arduino.h>
int ledPin = 2 ;
int buttonPin = 14 ;
bool flag = false ;
void HandleInterrupt ( )
{
flag = true ;
}
void setup ( )
{
pinMode ( ledPin, OUTPUT) ;
pinMode ( buttonPin, INPUT_PULLDOWN) ;
attachInterrupt ( digitalPinToInterrupt ( buttonPin) , HandleInterrupt, FALLING) ;
}
void loop ( )
{
if ( flag)
{
delay ( 500 ) ;
digitalWrite ( ledPin, HIGH) ;
delay ( 2000 ) ;
digitalWrite ( ledPin, LOW) ;
flag = false ;
}
}
什么是ESP32?
ESP32是近几年最受欢迎和最实用的模块之一。除了Wi-Fi模块,该模块还包含蓝牙4.0模块。双核CPU工作频率为80至240 MHz,包含两个Wi-Fi和蓝牙模块以及各种输入和输出引脚, ESP32是物联网项目的理想选择。
ESP32模块引脚分布
虽然ESP32的引脚数比常用的处理器少,但在引脚上复用多个功能时不会遇到任何问题。 警告:ESP32引脚的电压电平为3.3伏。如果要将ESP32连接到其他工作电压为5伏的设备,则应使用电平转换器转换电压电平。
电源引脚:该模块有两个电源引脚 5V和3.3V。您可以使用这两个引脚来向其他设备和模块供电。 GND引脚:该模块的接地有3个引脚。 启用引脚(EN):该引脚用于启用和禁用模块。引脚为高电平时启用模块,低电平禁用模块。 输入/输出引脚(GPIO):您可以使用32个GPIO引脚与LED、开关和其他输入/输出设备进行通信。 您可以在内部上拉或下拉这些引脚。 注意:GPIO6至GPIO11引脚(SCK/CLK,SDO/SD0,SDI/SD1,SHD/SD2,SWP/SD3和SCS/CMD引脚)用于模块内部闪存的SPI通信,我们不建议使用它们。 ADC:您可以使用此模块上的16个ADC引脚将模拟电压(某些传感器的输出)转换为数字电压。其中一些转换器连接到内部放大器,能够以高精度测量小电压。 DAC:ESP32模块有两个数模转换器,精度为8位。 触摸焊盘:ESP32模块上有10个引脚,对电容变化很敏感。您可以将这些引脚连接到某些焊盘(PCB上的焊盘),并将它们用作触摸开关。 SPI:该模块上有两个SPI接口,可用于连接显示屏、SD / microSD存储卡模块、外部闪存等。 I2C:SDA和SCL引脚用于I2C通信。 串行通信(UART):该模块上有两个UART串行接口。使用这些引脚,您可以在两个设备之间传输高达5Mbps的信息。 UART0还具有CTS和RTS控制。 PWM:几乎所有ESP32输入/输出引脚都可用于PWM(脉冲宽度调制)。使用这些引脚可以控制电机、LED灯的亮度和RGB灯的颜色等。
ESP32模块模式
ESP32芯片有5种模式:
活动模式:在这种模式下,Wi-Fi和蓝牙发射器和接收器的所有部分都是活动的。在这种情况下,电流消耗在80和260mA之间。 调制解调器睡眠模式:处理器仍处于活动状态,但Wi-Fi和蓝牙已禁用。在这种情况下,电流消耗在3到20mA之间。 轻度睡眠模式:主处理器停止工作,但RTC单元和ULP处理器单元仍处于活动状态。电流消耗约为0.8 mA。 深度睡眠模式:只有RTC单元处于活动状态。在这种情况下,Wi-Fi和蓝牙通信的数据存储在RTC的存储器中。在此模式下,电流消耗在10到150μA之间。 休眠模式:除了用于时钟的RTC定时器和连接到RTC的一些I / O引脚外,所有单元均被禁用。 RTC定时器或连接的引脚可以将芯片从此状态唤醒。在这种情况下,电流消耗约为2.5μA。 有关更多信息,请查看模块数据表。
在Arduino IDE上开发ESP32
《在Arduino IDE上开发ESP32》
在VSCode中使用PlatformIO开发ESP32
《在VSCode中使用PlatformIO开发ESP32》
ESP32技术专栏
ESP32专栏