中断

中断(interrupt)能够停止单片机的当前工作,以便可以完成一些其他工作。

假设你坐在家里和别人聊天。突然电话响了。你停止聊天,拿起电话与来电者通话。当你完成电话交谈后,你回去和电话响之前的那个人聊天。

同样,你可以把主程序想象成是与某人聊天,电话铃声使你停止聊天。中断服务程序是在电话上通话的过程。当通话结束后,你回到你聊天的主程序。这个例子准确地解释了中断如何使处理器执行操作。

主程序在电路中运行并执行一些功能。但是,当发生中断时,主程序在另一个程序执行时停止。当这个程序结束时,处理器再次返回主程序。

重要特征

这里有一些关于中断的重要特征:

  • 中断可以来自各种来源。在这种情况下,我们使用的是由数字引脚上的状态改变触发的硬件中断。

  • Stduino开发板所有I/O口均支持中断,但是同一组的I/O每次只能使用一个I/O口作为中断引脚,具体参照Stduino不同版型的引脚说明。

  • 你可以使用称为“中断服务程序”(Interrupt Service Routine,通常称为ISR)的特殊函数来定义程序。每次在输入引脚上发生事件(高电平、低电平、上升沿、下降沿、变化等)时,程序中断,先执行中断服务函数内容。

在Stduino中使用中断

中断在Stduino程序中非常有用,因为它有助于解决时序问题。中断的良好应用是读取旋转编码器或观察用户输入。一般情况下,ISR应尽可能短且快。如果你的程序使用多个ISR,则一次只能运行一个。其他中断将在当前完成之后执行,其顺序取决于它们的优先级

通常,全局变量用于在ISR和主程序之间传递数据。为了确保在ISR和主程序之间共享的变量正确更新,请在声明时添加volatile关键字。

attachInterrupt()

该函数用来初始化中断。

语法

  • attachInterrupt(digitalPinToInterrupt(pin), function, mode)(推荐)
  • attachInterrupt(interrupt, function, mode)(不推荐)
  • attachInterrupt(pin, function, mode)(不推荐。)

参数

  • pin:中断引脚,Stduino UNO/Nano所有I/O口都可以作为中断,但是每一组I/O只允许一个I/O作为中断引脚,具体参考Stduino/Nano引脚说明。
  • interrupt:中断号。每种型号的中断号对应不同的引脚。
  • function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。
  • digitalPinToInterrupt(pin):求某引脚对应的中断号。
  • mode:定义什么情况下发生中断,具有以下四个预定有效值:
    • LOW: 当引脚为低电平时,触发中断
    • HIGH:当引脚为高电平时,触发中断
    • CHANGE: 当引脚电平发生改变时,触发中断
    • RISING: 上升沿触发,当引脚由低电平变为高电平时,触发中断
    • FALLING: 下降沿触发,当引脚由高电平变为低电平时,触发中断.

示例

#include <Arduino.h>
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}
文档更新时间: 2021-02-14 14:26   作者:admin