【ESP32】Arduino开发 | 中断矩阵+按键输入中断例程

对于中断矩阵的详细介绍会放在ESP-IDF开发文章中,跳转栏目目录可以找到对应文章。

1. API

1.1 绑定GPIO中断

cpp 复制代码
attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode);
  • pin:管脚号;
  • handler:中断处理函数;
  • mode:中断触发模式。
中断模式 功能
RISING 上升沿触发
FALLING 下降沿触发
CHANGE 任意边沿触发
ONLOW 低电平触发
ONHIGH 高电平触发
ONLOW_WE 低电平唤醒触发
ONHIGH_WE 高电平唤醒触发

1.2 绑定GPIO中断(带参数)

cpp 复制代码
attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode);
  • pin:管脚号;
  • handler:中断处理函数;
  • arg:中断处理函数用户参数;
  • mode:中断触发模式。

1.3 解绑GPIO中断

cpp 复制代码
detachInterrupt(uint8_t pin);
  • pin:管脚号。

2. 例程

例程实现一个按键的检测,使用中断的方式去判断。

cpp 复制代码
#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打印相关的函数,会导致系统崩溃!!!

相关推荐
Tomhex7 小时前
C语言内存安全防护指南
c语言
230万光年的思念9 小时前
zerotier连不上的问题
c语言
LNN202210 小时前
STM32H7 + 迪文屏 DGUS 开发实战:从零构建工业级时间设置界面
stm32·单片机·嵌入式硬件
Fanfanaas12 小时前
Linux 基础开发工具(二)
linux·运维·服务器·c语言
leaves falling13 小时前
C/C++ const:修饰变量和指针的区别(和引用底层关系)
c语言·开发语言·c++
网域小星球13 小时前
C 语言从 0 入门(十二)|指针与数组:数组名本质、指针遍历数组
c语言·算法·指针·数组·指针遍历数组
Tairitsu_H13 小时前
C语言:排序(一)
c语言·数据结构·排序
Z文的博客13 小时前
嵌入式MCU与迪文屏通信:DMA+环形FIFO+变长队列+状态机完整手册
stm32·单片机·串口·dma·中断·串口dma·嵌入式单片机
12.=0.14 小时前
【stm32_5】Systick嘀嗒定时器、解析时钟源、分析时钟树、应用Systick设计延时
c语言·stm32·单片机·嵌入式硬件
达不溜的日记14 小时前
CAN总线网络传输层CanTp详解
网络·stm32·嵌入式硬件·网络协议·网络安全·信息与通信·信号处理