Arduino UNO R3自学笔记18 之 Arduino的外部中断、定时中断介绍及应用

ops/2024/10/21 10:03:53/

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。

前言:上篇写了为啥要用中断,这篇具体展开写Arduino中断相关的知识。

 温习:单片机在执行程序时,发生一些其它紧急的事情,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。这个过程称之为中断。

        举个通俗易懂的例子:当你在看电视的时候,突然电话响了,你去接电话。接完电话回来继续看电视,这就是一个中断过程。我们以此为例分析一下:

                                          主进程:看电视;

                                          中断触发源:电话响了;

                                          中断服务子程序:接电话;

   通过上述例子我们了解了一些术语,以及中断这个过程。

1.Arduino中断分类

        总体来讲,根据触发源的不同,中断分为外部中断定时中断

外部中断:一般是单片机硬件IO产生,比如外接的按钮、编码器。键盘等输入设备。

定时中断:一般是定时器产生的中断,周期性发生的事情。

2.Arduino的外部中断

        Arduino UNO R3并不是所有的引脚支持外部中断,只有特定的几个引脚支持,下面列出了具体情况。

Arduino板子型号INT0INT1INT2INT3INT4INT5
UNO 23////
MEGA2321201918

需要注意的是INT0到INT5指的是其中断编号

        知道了产生中断的引脚,那怎么触发中断的呢?

Arduino 上支持下表中的四种中断触发方式

模式名称说明
LOW电平触发,低电平触发。
CHANGE电平变化触发,即由高变低、由低变高均可触发。
RISING上升沿触发,即低电平变高电平触发。
FALLING下降沿触发,即高电平变低电平触发。

        

有了前面的基础知识。我们就可以初始化配置中断了,首先,给出初始化配置函数,如下:

attachInterrupt( interrupt,function,mode)
   功能:对中断引脚进行初始化配置。
   参数:
      ● interrupt,中断编号,注意,这里的中断编号并不是引脚编号。
      ● function,中断服务子程序,当中断被触发后即会运行此函数名称所代表的中断服务子程序。
      ● mode,中断模式。

注意以下内容

使用 attachInterrupt 函数时注意:

      ● 在中断函数中 delay 函数不能使用。
      ● 使用 millis 函数始终返回进入中断前的值。
      ● 读取串口数据的话,可能会丢失。
      ● 中断函数中使用的变量需要定义为 volatile 型。


detachInterrupt( interrupt)
        功能:禁用外部中断。
        参数:
        interrupt,需要禁用的中断编号。

interrupts()和nolnterrupts()
        interrupts 和 noInterrupts 函数在 Arduino 中负责打开和关闭总中断,函数无返回值,无参数。

以上简单介绍了中断的大多数知识。

3.Arduino的外部中断使用方法

对于Arduino使用外部中断一般相对比较容易,具体步骤如下:

编程前确认以下内容:

        确定需求,比如要用中断检测按钮按下,根据需求选择好外部中断的引脚、触发方式 比如选择2号引脚,上升沿触发。

编程步骤

(1) 在setup函数第一句使用noInterrupts 函数关闭总中断;

void setup()
{  noInterrupts();//关所有中断,防止在初始化时被中断
}
void loop()
{}

(2) 初始化外部中断attachInterrupt( 0,function,RISING);

void setup()
{  noInterrupts();//关所有中断,防止在初始化时被中断attachInterrupt( 0,function,RISING);//设置2号引脚上升沿触发,触发后执行function函数
}
void loop()
{}

(3) 在setup函数最后一句使用Interrupts 函数打开总中断;

void setup()
{  noInterrupts();//关所有中断,防止在初始化时被中断attachInterrupt( 0,function,RISING);//设置2号引脚上升沿触发,触发后执行function函数Interrupts();//开所有中断,准备进入程序运行模式
}
void loop()
{}

(4) 声明并编写中断服务子程序


void function();//声明函数,防止编译器报错
void setup()
{  noInterrupts();attachInterrupt( 0,function,RISING);Interrupts();
}
void loop()
{}
void function()//中断服务子程序
{
//此处执行你要干的事
}

这样程序框架就完成了,接下来将中断服务子程序函数补全即可。

4.Arduino的定时中断

在 Arduino Uno 中有三个定时器,他们分别被使用到以下官方函数和库中:

  • Timer0(8 位定时器)
    • delay()
    • delayMicroseconds()
    • millis()
    • micros()
  • Timer1(16 位定时器)
    • 伺服电机库 Servo.h
  • Timer2(8 位定时器)
    • tone()函数

各个定时器与引脚功能、软件库功能对应关系:

Timer0:D5/D6的PWM输出、delay()、millis()、delayMicroseconds()。
Timer1:D9/D10的PWM输出、舵机库Servo.h、TimerOne库。
Timer2:D3/D11的PWM输出、无源蜂鸣器的tone()、 MsTimer2库(三方库)。定时中断这部分内容,主要推荐使用MsTimer2第三方库,使用起来方便快捷,相关使用请看前面我写的这篇文章:

     Arduino UNO R3自学笔记16 之 Arduino的定时器介绍及应用

5.总结

        中断的使用和内容不止只有上述列出的,其它用法我们后续在具体案例中应用时再讲,同时也应该多多练习使用,推荐以下文章多多阅读学习。

关于此部分内容,可以阅读以下内容:
官方教程:https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
定时器和中断:https://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072
Arduino定时器和中断的使用:https://www.pipipi.net/1030.html
Timer2库文件:https://playground.arduino.cc/Main/FlexiTimer2/

上一篇:Arduino UNO R3自学笔记17 之 Arduino为啥要用中断?

下一篇:


http://www.ppmy.cn/ops/120040.html

相关文章

【分布式微服务云原生】gRPC vs RPC:深入探索远程过程调用的现代与经典

摘要 在分布式系统的世界里,gRPC和RPC是两个耳熟能详的术语,但它们之间有何区别和联系?本文将深入探讨gRPC和RPC的概念、关键特性、以及它们在现代软件开发中的应用。你将了解到gRPC如何作为RPC的一种实现,提供高性能的跨语言远程…

java-快速将普通main类变为javafx类,并加载自定义fxml

java-快速将普通main类变为javafx类,并加载自定义fxml 前提步骤1. 普通类继承Application2. 实现main方法3. 写一个controller4. 写一个fxml文件5. 写start方法加载fxml6. 具体代码7. 运行即可 前提 使用自带javafx的jdk,这里使用的是jdk1.834&#xff…

关系型数据库和非关系型数据库的区别

1.常见的主流数据库 关系型数据库: MySql 、达梦 、PostgreSQL 、Oracle 、Sql Server 、Sqlite非关系型数据库: Redis 、MongoDB 、HBase 、 Neo4J 、 CouchDB 2.介绍 关系型数据库最典型的数据结构是表,由二维表及其之间的联系…

聊聊JIT是如何影响JVM性能的!

文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 我们知道Java虚拟机栈是线程…

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能,支持在线编辑代码、运行代码,同时支持导入文件,支持图片识别,支持复制代码,可将代码导出为图…

在线PDF怎么转换成JPG图片?分享14种转换操作!

作为一名社畜,俺也经常要将PDF转换为图片格式! 如何进行快速转换,包括电脑端、在线端和手机端,今天俺就测评了50款工具,给你得出了下面这些渠道,不少也是免费的,相信对你有帮助哦! …

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同,类型也在改变,以后怎么写类型? 1. 封装Axios 将Axios封装成一个类,同时重新封装request方法 重新封装request有几个好处: 所有的请求将从我们定义的requet请求中发送,这样以后更换…

发现一款适合所有用户小巧且强大的编辑器(完美替换Windows记事本)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 编辑器 📒📝 功能亮点📝 适用场景📝 安装使用📝 替换Windows记事本🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 今天,发现一款小巧(仅1.26M)且功能强大的编辑器,适用于文本编辑,编程开发等,应该说是适…