对于中断矩阵的详细介绍会放在ESP-IDF开发文章中,跳转栏目目录可以找到对应文章。
1. API
1.1 绑定GPIO中断
attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode);
- pin:管脚号;
- handler:中断处理函数;
- mode:中断触发模式。
中断模式 | 功能 |
---|---|
RISING | 上升沿触发 |
FALLING | 下降沿触发 |
CHANGE | 任意边沿触发 |
ONLOW | 低电平触发 |
ONHIGH | 高电平触发 |
ONLOW_WE | 低电平唤醒触发 |
ONHIGH_WE | 高电平唤醒触发 |
1.2 绑定GPIO中断(带参数)
attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode);
- pin:管脚号;
- handler:中断处理函数;
- arg:中断处理函数用户参数;
- mode:中断触发模式。
1.3 解绑GPIO中断
detachInterrupt(uint8_t pin);
-
pin:管脚号。
2. 例程
例程实现一个按键的检测,使用中断的方式去判断。
#include <Arduino.h>
static volatile int isr_flag = 0;
void ARDUINO_ISR_ATTR gpio_isr_handler()
{
isr_flag = 1;
}
void setup()
{
pinMode(0, INPUT_PULLUP);
attachInterrupt(0, gpio_isr_handler, RISING);
Serial.begin(115200);
}
void loop()
{
if (isr_flag) {
Serial.println("Key pressed");
isr_flag = 0;
}
}
我的开发板上的按键是连接到IO0上的,带外部上拉,所以GPIO配置成上拉输入模式;中断触发方式设置成上升沿触发,这样当按键释放的时候才会触发中断。
这里使用一个无用户参数的中断服务函数即可,函数定义加上ARDUINO_ISR_ATTR的标志。处理函数里面只是简单地把标志位置1,然后主循环中检查这个标志,如果为1就打印log,然后复位标志。
在ESP32中千万不要在中断函数中调用log打印相关的函数,会导致系统崩溃!!!