Timer

為了讓 Arduino 開發者也能使用 timer 功能,LinkIt 7697 Arduino BSP 提供 LTimer 類別將原生 LinkIt SDK 的 timer 功能開放出來。實際應用請參考 IDE 中的 File / Examples / LTimer / BlinkLED 範例,該範例透過使用兩個 timer,分別控制板上 LED 與外部 LED (連接至 P6 腳位如下圖),使其各以 500ms 與 250ms 的間隔閃爍。接下來將說明該範例是如何構成、以及各 API 所對應的功能。

產生 Timer 實體

首先加入 LTimer 類別的 header file:

#include "LTimer.h"

開發者在程式裡最多可同時使用兩個 timer,這兩個 timer 對應的 enum ID 為 LTIMER_0LTIMER_1。使用 timer 前要先產生出 timer 的實體,以下程式碼會產生出 LTIMER_0LTIMER_1 的兩個 timer 實體:

LTimer timer0(LTIMER_0);
LTimer timer1(LTIMER_1);

初始化

建立 timer 實體後,接下來要進行初始化的動作。在 Arduino 的 setup() 函式裡,呼叫 timer 的 .begin() 函式來進行初始化:

timer0.begin();
timer1.begin();

啟動 Timer

初始化完成後,就可以呼叫 .start() 函式來啟動 timer。啟動 timer 需要四個參數:

LTimerStatus start(
  uint32_t timeoutMS,
  LTimerMode timerMode,
  ltimer_callback_t callbackFunc,
  void *userData
);

參數的說明如下:

  • [IN] timeoutMS:Timer 倒數的時間,單位為微秒 (millisecond)。

  • [IN] timerMode:運作模式。可設定為僅運作一次 (LTIMER_ONESHOT_MODE) 或是反覆重啟 (LTIMER_REPEAT_MODE)。在運作一次的模式下,當 timer 倒數完後,callback 函式僅會被呼叫一次;而在反覆重啟模式下,callback 函式每 timeoutMS 微秒就會被呼叫一次,直到 timer 被停止或是釋放。

  • [IN] callbackFunc:當 timer 倒數完成後會呼叫的 callback 函式。

  • [IN] userData:當 callback 函式被呼叫時伴隨帶入的資料結構。

Callback 函式的原型宣告如下:

typedef void (*ltimer_callback_t)(void *user_data);

其中的 user_data 輸入參數即是啟動 timer 時帶入 .start() 函式裡的 userData 參數。

中止 Timer

在運作一次的模式下,因為 timer 只會倒數一次,所以不需做額外動作將 timer 停止。不過在反覆重啟的模式下,開發者可能因應用情境會有將 timer 停下來的需求。藉由呼叫 .stop() 函式即可中止 timer 的運作。若之後還要繼續 timer,再呼叫一次 .start() 就可以恢復 timer 運行。

釋放資源

當程式確定不再需要 timer 時,可呼叫 .end() 函式以釋放配置給 timer 的資源。

範例程式

#include "Arduino.h"
#include "LTimer.h"

int led0 = 7;
int led1 = 6;
int val0 = 0;
int val1 = 0;

// instantiation
LTimer timer0(LTIMER_0);
LTimer timer1(LTIMER_1);

// callback function for timer0
void _callback0(void *usr_data)
{
  val0 = !val0;
  digitalWrite(led0, val0);
}

// callback function for timer1
void _callback1(void *usr_data)
{
  val1 = !val1;
  digitalWrite(led1, val1);
}

void setup() {
  pinMode(led0, OUTPUT);
  pinMode(led1, OUTPUT);
  Serial.begin(115200);

  // initialization
  timer0.begin();
  timer1.begin();

  // start the execution
  timer0.start(500, LTIMER_REPEAT_MODE, _callback0, NULL);
  timer1.start(250, LTIMER_REPEAT_MODE, _callback1, NULL);
}

void loop() {
}

Last updated