外部中断的使用方法

简介: 这篇文章介绍了中断的概念,以一个生动的故事比喻,说明中断是如何打断主程序执行并调用中断函数的。文章提到了Arduino控制器和"吃货"模型,展示了如何编写处理吃和开门的代码,并介绍了设置中断的函数`attachInterrupt`。接着,列举了不同Arduino型号的外部中断引脚,并详细解释了中断函数、中断触发模式。最后,提供了一个官方的外部中断例程和其可能的应用场景,如使用旋转编码器或构建监控装置。

1.什么是中断?

试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情——吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律——吃饭,就是你的主程序,而敲门声,就是一个中断信号,它让你不得不去执行你的人生插曲——开门接客这个中断函数。完成这个小插曲后,你又要投入到主线剧情 吃饭这个主程序上。

现在我想告诉你一个惊天秘密,其实你妈欺骗了你,你根本不是他们亲生的,你是人造人,而你的大脑里装备了一个arduino控制器!你的型号是 Arduino 吃货,之所以叫这么2的名字,是因为你的loop的写法问题。我们来看看你的loop函数。

[mw_shl_code=cpp,true]void loop() {  吃();}[/mw_shl_code]吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 吃();循环但实际上,你还有附加功能 开门();[mw_shl_code=cpp,true]void 开门(){打开门;if(门口的人==女神)    跪舔();if(门口的人==查水表的)    报告水表读数();}[/mw_shl_code]为了让你能顺利执行 开门();动作,你的亲生父母还得在Setup函数中设置 开门();这个动作何时启动。(也可能是你后妈设定的),具体的方法是attachInterrupt(中断通道, 中断函数, 触发方式); ,在这里中断通道就是你的耳朵(不要问为什么不是屁股),触发 开门();这个函数的方式是 敲门声。[mw_shl_code=cpp,true]void setup(){  attachInterrupt(耳朵, 开门, 敲门声);//耳朵传感器在此不做介绍,有兴趣的自行研究}[/mw_shl_code]这样设定后,你每次听到敲门声,就不得不去打开门,并执行相应的动作了。也许你对这样的人物设定不太满意,但这就是你的宿命,少年。忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了 {:soso_e197:}

2.各种型号Arduino外部中断引脚

外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。

3.中断函数,中断触发模式与设置中断中断函数

就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:[mw_shl_code=cpp,true]void hello(){  Serial.println("hello");}[/mw_shl_code]

中断模式就是你的中断触发方式。

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

LOW                  低电平触发

CHANGE            电平变化,高电平变低电平、低电平变高电平

RISING              上升沿触发

FALLING            下降沿触发

HIGH                 高电平触发(该中断模式仅适用于Arduino due)

在定义中断函数后,要使用外部中断,你只需要在程序的Setup部分配置好中断函数即可,配置函数如下:attachInterrupt(interrupt, function, mode);//interrupt为你中断通道编号,function为中断函数,mode为中断触发模式需要注意的是在Arduino Due中,中断设置有点不同:attachInterrupt(pin, function, mode); //due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。

如果在程序中途,你不需要使用外部中断了,你可以用中断分离函数detachInterrupt(interrupt );来取消这一中断设置。同样在Arduino Due上,该函数为detachInterrupt(interrupt );

4.例程

外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程

[mw_shl_code=cpp,true]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;}[/mw_shl_code]

5.应用

利用外部中断,可以在很多地方提高你程序的运行效率.同时你也可以运用以上知识,使用  

旋转编码器或者最一个 简单监控装置

相关文章
|
传感器 开发工具 C语言
EXTI外部中断介绍(内置1.中断系统+2.中断执行流程+3.STM32中断+4.NVIC基本结构+5.NVIC优先级分组+6.EXTI简介+7.EXTI基本结构...)
EXTI外部中断介绍(内置1.中断系统+2.中断执行流程+3.STM32中断+4.NVIC基本结构+5.NVIC优先级分组+6.EXTI简介+7.EXTI基本结构...)
244 0
EXTI外部中断介绍(内置1.中断系统+2.中断执行流程+3.STM32中断+4.NVIC基本结构+5.NVIC优先级分组+6.EXTI简介+7.EXTI基本结构...)
|
9天前
|
传感器
STM32标准库外部中断和定时器知识点总结-1
STM32标准库外部中断和定时器知识点总结
|
9天前
|
传感器
STM32标准库外部中断和定时器知识点总结-2
STM32标准库外部中断和定时器知识点总结
|
9天前
|
传感器 物联网 开发者
【STM32基础 CubeMX】定时器的使用
【STM32基础 CubeMX】定时器的使用
128 0
STM32外部中断解析
STM32外部中断解析
216 0
|
8月前
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
|
10月前
|
存储 调度
51单片机--定时器与按键控制流水灯模式
51单片机--定时器与按键控制流水灯模式
322 0
|
11月前
STM32使用HAL库操作外部中断——实战操作
STM32使用HAL库操作外部中断——实战操作
144 0
|
11月前
|
芯片
STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
139 0