外部中断
中断可以根据中断源分为 硬件中断 和 软件中断:
- 硬件中断:也被称为外部中断,硬件中断响应外部硬件事件而发生。例如,当检测到触摸时会发生触摸中断,而当 GPIO 引脚的状态发生变化时会发生 GPIO 中断。GPIO 中断和触摸中断属于这一类;
- 软件中断:当触发软件事件(例如定时器溢出)时,会发生这种类型的中断。定时器中断是软件中断的一个例子。
外部中断的开启与初始化
attachInterrupt(pin, ISR, mode);
attachInterrupt()
用于将中断服务程序(ISR)附加到指定的引脚上。它接受三个参数:
pin
:数字引脚。ISR
:中断服务程序的名称。mode
:中断模式,可以是以下值之一:RISING
:上升沿触发中断。FALLING
:下降沿触发中断。CHANGE
:电平变化触发中断。ONLOW
:低电平触发。ONHIGH
:高电平触发。
示例代码:
attachInterrupt(2, service_exit14, CHANGE);
// 将中断服务程序附加到引脚2上,使用电平变化触发中断
外部中断的关闭
void detachInterrupt(uint8_t pin);
detachInterrupt
,关闭指定引脚的外部中断功能:
pin
:数字引脚编号
//关闭引脚2的外部中断
detachInterrupt(2);
项目示例
外部中断信号控制灯光开关
通过4号引脚外部中断来控制灯光d2
#include <Arduino.h>
#define d2 2 // 定义数字引脚2的编号为d2
int num=0; // 初始化计数器num为0
// 中断服务函数
void service_Exit02() {
num++; // 每次中断时,计数器加1
Serial.printf("调用次数:%d",num); // 通过串口打印调用次数
Serial.println(); // 换行
digitalWrite(d2,!digitalRead(d2)); // 切换数字引脚2的状态(高电平变为低电平,低电平变为高电平)
}
void send_plus() {
digitalWrite(4,!digitalRead(4)); // 切换数字引脚4的状态(高电平变为低电平,低电平变为高电平)
delay(1000); // 延时1秒
}
void setup() {
Serial.begin(115200); // 设置串口波特率为115200
pinMode(d2,OUTPUT); // 设置数字引脚2为输出模式
pinMode(4,OUTPUT); // 设置数字引脚4为输出模式
attachInterrupt(4,service_Exit02,FALLING); // 将数字引脚4设置为下降沿触发中断,并关联到中断服务函数service_Exit02
}
void loop() {
send_plus(); // 在主循环中调用send_plus函数,切换数字引脚4的状态
}