ESP8266でタイマ割り込み

Arduinoでタイマ割り込みを使おうとすると、CPUアーキテクチャごとにやり方が違って不便に感じる。もっとも、Arduonoでタイマ割り込みなど使おうというのは筋が悪いのかもしれないが。

ESP8266の場合

// ミリ秒をクロック数に換算 (@80MHz)
#define MSEC2CLOCK(ms)    (ms * 80000L)

// タイマ割り込みハンドラ
void timer0_ISR (void) {
  timer0_write(ESP.getCycleCount() + MSEC2CLOCK(10) ); // 10msec
  
  // TODO 割り込み処理をここに
}

void setup() {
  // タイマ割り込みの設定
  noInterrupts();
  timer0_isr_init();
  timer0_attachInterrupt(timer0_ISR);
  timer0_write(ESP.getCycleCount() + MSEC2CLOCK(10) ); // 10msec
  interrupts();
}

Arduino UNOなどAVR系Arduinoの場合

MsTimer2を使用する。

#include <MsTimer2.h>

// タイマ割り込みハンドラ
void timerHandler() {
  // TODO 割り込み処理をここに
}

void setup() {
  // タイマ割り込みの設定
  MsTimer2::set(10, timerHandler); // 10msec
  MsTimer2::start();
}

Arduino DUE

DueTimerを使用する。

#include <DueTimer.h>

// タイマハンドラ
void Timer3_handler(void){
  // TODO 割り込み処理をここに
}

void setup()
{
  // タイマ割り込みの設定
  Timer3.attachInterrupt(Timer3_handler);
  Timer3.start(10000); // 10msec (10,000usec)
}

GR-SAKURA, GR-CITRUS

(2018/09/06修正)
Arduino UNOと同様に、MsTimer2を使用する。


【参考】
以前の特電HALに依存したライブラリではtimer_regist_userfunc()を使用していた。

#include <rxduino.h>

void TimerHandler()
{
  // TODO 割り込み処理をここに
}

void setup()
{
  // タイマ割り込みの設定 ※ 1msec周期固定
  timer_regist_userfunc( TimerHandler);
}

GR-ROSE

(2018/09/06追記)
FreeRTOSのAPIを使用する。

extern "C" {
#include "FreeRTOS.h"
#include "timers.h"
}

TimerHandle_t handle;

void timerHandler(TimerHandle_t pxTimer)
{
  // TODO 割り込み処理をここに
}

void setup() {
    pinMode(PIN_LED0, OUTPUT);
    pinMode(PIN_LED1, OUTPUT);
    
    // タイマ割り込みの設定 10msec周期固定
    handle = xTimerCreate(
                "interval_10ms",         // デバッグ用の適当な名前
                10 / portTICK_PERIOD_MS, // 周期
                pdTRUE,                  // 繰り返すか?
                (void *)0,               // タイマのID
                timerHandler);           // タイマのハンドル
    if(handle != NULL)
    {
        xTimerStart(handle, 0);
    }
}