各种型号Arduino外部中断引脚
型号 | Int.0 | Int.1 | Int.2 | Int.3 | Int.4 | Int.5 | 备注 |
UNO | 2 | 3 | |||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 | |
Leonardo | 3 | 2 | 0 | 1 | |||
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);
}