Arduino 中的定时器中断
正如另一篇文章中所讨论的,定时器基本上是计数器。当它们达到计数结束时,它们会溢出。我们可以利用此事件来生成中断。现在,在 Arduino 中生成中断的传统方法涉及更改大量寄存器。幸运的是,我们有库可以简化我们的工作。
我们将使用 **TimerOne** 库在 **Timer1** 上生成中断。类似地,还有一个 **TimerThree** 库用于在 **Timer3** 上生成中断(不适用于 **Arduino Uno**)。
转到 **工具 -> 管理库**,搜索 **TimerOne** 和 **TimerThree**(可选),然后单击 **安装**。


接下来,通过 **草图 -> 包含库** 在代码中导入库。

这将在代码顶部添加以下行:
#include <TimerOne.h>
现在,这里有两个重要的函数:Timer1.initialize() 和 Timer1.attachInterrupt()。initialize 函数接收定时器运行的时间(以微秒为单位)。换句话说,它确定中断触发后的时间。
attachInterrupt() 函数接收每次中断触发时要调用的函数的名称作为参数。
下面的示例代码提供了一个示例:
示例
#include <TimerOne.h>
volatile bool timerTriggered = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Timer1.initialize(1000000); //Initialize timer with 1 second period
Timer1.attachInterrupt(printFunc);
}
void loop() {
// put your main code here, to run repeatedly:
if(timerTriggered){
Serial.println("Timer was triggered");
delay(1);
timerTriggered = false;
}
}
void printFunc(void){
timerTriggered = true;
}如您所见,定时器初始化为 1 秒(1,000,000 微秒)的周期。每次定时器触发时,都会调用 **printFunc** 函数并设置 **timerTriggered** 标志。请注意,**timerTriggered** 布尔值已声明为 volatile,因为它在中断函数中被更改。一旦设置了标志,循环中就会执行打印语句,并且标志会被重置。
与任何其他中断函数一样,**printFunc** 不能有任何参数,也不能返回任何内容。
请注意,Timer1 可以接受最小周期 1 微秒和最大周期 8388480 微秒(约 8.3 秒)。
如果您使用的是 **TimerThree** 库,请在上述代码中将 Timer1 替换为 Timer3。当然,**TimerThree** 不适用于 Arduino Uno,因为它只有 Timer0、Timer1 和 Timer2。它可以与其他也有 Timer3 的开发板一起使用(Teensy 就是一个很好的例子)。
您可以从以下资源中了解更多关于这些库的信息:
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP