Arduino ESP32使用外部中断
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino ESP32使用外部中断相关的知识,希望对你有一定的参考价值。
Arduino ESP32使用外部中断
- ESP32支持库版本:
3.0.1
- esp32型号:esp32 Dev Module
实例程序
// toggles LED when interrupt pin changes state
int led = 2;//板载led灯
volatile int state = LOW;
const byte interruptPin_0 = 25; //设置中断的目标对应的那个引脚
const byte interruptPin_1 = 23; //设置中断的目标对应的那个引脚
volatile int interruptCounter = 0; //0号中断发生中断的次数
volatile int interruptCounter_1 = 0; //1号中断发生中断的次数
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; //声明一个portMUX_TYPE类型的变量,
portMUX_TYPE mux_1 = portMUX_INITIALIZER_UNLOCKED;//利用其对主代码和中断之间的同步进行处理
void handleInterrupt() {//中断服务函数
portENTER_CRITICAL_ISR(&mux);//进入中断程序
delay(20); //延时20ms作为消抖,如果是很稳定的中断可以不加或者加很少的消抖时间
if(digitalRead(interruptPin_0) == 0) //因为是下拉触发,所以在消抖时间完后读取引脚高低电平,如果还是为低那么就代表出现了一次稳定的中断
{
interruptCounter++;
Serial.println("0号中断对应的引脚发生中断!!!");
Serial.print("0号中断发生次数:");Serial.println(interruptCounter);
state=!state;//状态翻转
}
portEXIT_CRITICAL_ISR(&mux);//处理完中断后,记得要退出中断。
}
void handleInterrupt_1() {//中断服务函数
portENTER_CRITICAL_ISR(&mux_1);//进入中断程序
delay(20); //延时20ms作为消抖,如果是很稳定的中断可以不加或者加很少的消抖时间
if(digitalRead(interruptPin_1) == 1) //因为是上拉触发,所以在消抖时间完后读取引脚高低电平,如果还是为高那么就代表出现了一次稳定的中断
{
interruptCounter_1++;
Serial.println("1号中断对应的引脚发生中断!!!");
Serial.print("1号中断发生次数:");Serial.println(interruptCounter_1);
state=!state;//状态翻转
}
portEXIT_CRITICAL_ISR(&mux_1);//处理完中断后,记得要退出中断。
}
void setup() {
Serial.begin(115200);
pinMode(led,OUTPUT);
digitalWrite(led,state);
Serial.println("中断测试实验");
pinMode(interruptPin_0, INPUT_PULLUP); //先把引脚设置为上拉输入模式
pinMode(interruptPin_1, INPUT_PULLDOWN); //这个我们设置为下拉
//通过调用attachInterrupt函数将中断附加到引脚
//handleInterrupt 是中断触发后的触发函数
//FALLING 代表下拉触发,也就是由高电平向低电平转化时触发 RISING当然就是上拉触发
attachInterrupt(digitalPinToInterrupt(interruptPin_0), handleInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(interruptPin_1), handleInterrupt_1, RISING);
}
/*****************
* LOW: 当引脚为低电平时触发中断服务程序
CHANGE: 当引脚电平发生变化时触发中断服务程序
RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序
******************/
void loop() {
}
以上是关于Arduino ESP32使用外部中断的主要内容,如果未能解决你的问题,请参考以下文章