百科学堂 | 实用工具

Arduino定时器中断attachInterrupt()详解



说明

attachInterrupt()函数是用于为Arduino开发板设置和执行ISR(中断服务程序)用的

ISR(中断服务程序)顾名思义就是中断Arduino当前正在处理的事情而优先去执行中断服务程序。当中断服务程序完成以后,再回来继续执行刚才执行的事情。中断服务程序对监测Arduino输入有很大的用处。

我们可以使用attachInterrupt()函数,利用Arduino的引脚触发中断程序。以下列表说明支持中断的引脚有哪些:

Arduino控制板支持中断的引脚
Uno, Nano, Mini2, 3
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo0, 1, 2, 3, 7
Zero除4号引脚以外的所有数字引脚
MKR1000 Rev.10, 1, 4, 5, 6, 7, 8, 9, A1, A2
Due所有数字引脚

注意

在ISR(中断服务程序)函数中,delay()函数是不工作的,而且millis()函数返回值也不再增长。在ISR(中断服务程序)运行期间Arduino开发板接收到的串口数据也可能丢失。另外ISR函数里所使用的变量应声明为volatile类型。详情请见以下”关于ISR(中断服务程序)”部分。

使用中断

中断很适合执行那些需要不断检查的工作,比如检查一个引脚上连接的按键开关是否被按下。中断更适用于很快就会消失的信号检查,比如某一个引脚用于检测脉冲信号,这个脉冲信号的持续时间可能十分短暂。如果不使用中断,那么假如Arduino开发板正在执行其它任务时,突然这个脉冲信号来了,还不等Arduino开发板完成正在执行的工作,这个脉冲信号可能就已经消失了。而使用中断,就可以确保这个转瞬即逝的脉冲信号可以很好的被Arduino开发板检测到并执行相应任务。

关于ISR(中断服务程序)

对于Arduino开发板来说,ISR(中断服务程序)是一种特殊的函数。它的特殊意味着它具有其它类型函数所不具备的限制和特点。

如需更多有关中断方面的知识,请参考 Nick Gammon’s notes.

语法

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

参数

pin: 中断引脚号
ISR: 中断服务程序名
mode:中断模式

中断模式(mode)有以下几种形式:

LOW: 当引脚为低电平时触发中断服务程序
CHANGE: 当引脚电平发生变化时触发中断服务程序
RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序

返回值

示例

const byte ledPin = 13;
 
//用2号引脚作为中断触发引脚
const byte interruptPin = 2;  
 
volatile byte state = LOW;
 
void setup() {
  pinMode(ledPin, OUTPUT);
 
  //将中断触发引脚(2号引脚)设置为INPUT_PULLUP(输入上拉)模式
  pinMode(interruptPin, INPUT_PULLUP); 
 
  //设置中断触发程序
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
 
void loop() {
  digitalWrite(ledPin, state);
}
 
//中断服务程序
void blink() {
  state = !state;
}


注意


本文版权:http://www.ndfweb.cn/news-777.html
NDF网站建设淘宝店 | 联系我们
©2007-2025 NDF Corporation