Arduino 中断

各种型号Arduino外部中断引脚

型号Int.0Int.1Int.2Int.3Int.4Int.5备注
UNO23
Mega25602321201918
Leonardo3201
Due所以IO都可

中断函数

中断函数不能带任何参数,且没有返回类型

例如:

void hello()
{
  Serial.println("hello");
}

中断模式

在大多数arduino上有以下四种触发方式:

LOW低电平触发
CHANGE            电平变化,高电平变低电平、低电平变高电平
RISING              上升沿触发
FALLING            下降沿触发
HIGH                 高电平触发(该中断模式仅适用于Arduino Due)

设置中断

配置函数如下:
attachInterrupt(interrupt, function, mode);

interrupt为你中断通道编号,function为中断函数,mode为中断触发模式

需要注意的是在Arduino Due中,中断设置有点不同:
attachInterrupt(pin, function, mode); 

due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。

例子

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()//中断函数
{
  state = !state;
}

ESP32

const byte interruptPin = 25;
volatile int interruptCounter = 0;
int numberOfInterrupts = 0;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;


void handleInterrupt() {
  portENTER_CRITICAL_ISR(&mux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&mux);
}

void setup() {
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}

void loop() {
  if(interruptCounter>0){
    portENTER_CRITICAL(&mux);
    interruptCounter--;
    portEXIT_CRITICAL(&mux);
    numberOfInterrupts++;
    Serial.print("An interrupt has occurred. Total: ");
    Serial.println(numberOfInterrupts);
  }

  delay(1000);
}

发表评论

您的电子邮箱地址不会被公开。