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