タイマーと割り込み

タイマー機能

ESP32にはタイマーが4つ有ります。タイマーはペリフェラル周波と分周数を元にカウントしカウント数が指定した値になったら信号を発生します。この信号は割り込み処理等に使用されます。

主な関数

  • hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp);
    • タイマーの初期設定 
    • —- 引数 ——-
      • uint8_t num:タイマー番号。0~3。
      • uint16_t divider:分周比。クロック周波数は80MHz。divider=80 -> 80/80M -> 1E-6 sec
      • bool countUp: true -> up / false -> down
    • — 戻り値 —
      • タイマーのハンドラ
  • void timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload);
    • タイマーの設定値(割り込みのタイミング)を設定
    • —- 引数 ——-
      • hw_timer_t *timer:タイマーのハンドラ
      • uint64_t alarm_value:タイミング設定値
      • bool autoreload:自動再起動 -> true
  • void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge);
    • タイマー割り込み実行関数登録
    • —- 引数 ——-
      • hw_timer_t *timer:タイマーのハンドラ
      • void (*fn)(void):割り込み処理関数ポインタ(引数無し)
      • bool edge:割り込みのタイプ。ture -> edge / false -> level
  • void timerAlarmEnable(hw_timer_t *timer);
    • タイマ(割り込み)を開始 
    • —- 引数 ——-
      • hw_timer_t *timer:タイマーのハンドラ
  • void timerWrite(hw_timer_t *timer, uint64_t val);
    • タイマーの値(現在値)を設定する。
    • —- 引数 ——-
      • hw_timer_t *timer:タイマーのハンドラ
      • uint64_t val:スタート時間現設定値。
  • void timerEnd(hw_timer_t *timer);
    • タイマーを止める。
    • —- 引数 ——-
      • hw_timer_t *timer:タイマーのハンドラ

簡単な例

ハード

GPIO4にLEDを接続。LEDをオンオフさせる

ソフト

timer.ino


#define LED_PT  4

int flg;
hw_timer_t * timer = NULL;

void IRAM_ATTR onTimer() {
    flg = 0;
}

void setup() {

    Serial.begin(115200);
    delay(100);

    pinMode(LED_PT, OUTPUT);
    digitalWrite(LED_PT, HIGH);

    flg = 1;
    
    timer = timerBegin(0, 80, true);
    timerAttachInterrupt(timer, &onTimer, true);
    timerAlarmWrite(timer, 1000000, true);
    timerAlarmEnable(timer);    
}

void loop() {
    // put your main code here, to run repeatedly:
    
    while(flg) delay(10);
    
    digitalWrite(LED_PT, !digitalRead(LED_PT));
    flg = 1;
}
  • 1行: LEDポートの定義
  • 3行: 通常は1。割り込みでこの値を0にします。
  • 4行: タイマー用のインスタンス
  • 6行: 割り込みがかかるとこの関数が実行されます。
  • 15,16行: LEDポートの設定
  • 20行: タイマーの定義
    • 第一引数:タイマーの番号(0から3)。今回は0を指定
    • 第二引数:分周数。80を指定。ペリフェラル周波が80MHzなので1マイクロ秒に一回カウントする。
    • 第三引数:true ー> カウントアップを指定
  • 21行: 割り込みのタイプと実行関数の指定
    • 第一引数: タイマーのハンドラ
    • 第二引数: 実行関数
    • 第三引数: 割り込みのタイプ。ture -> edge
  • 22行: 割り込みの設定
    • 第一引数: タイマーのハンドラ
    • 第二引数: 割り込みがかかるまでのカウント数。1000000を指定
    •       1カウントは1マイクロ秒なので、これで1秒となる。
    • 第三引数: 自動再起動 true -> 有り
  • 29行: 変数flgが0になるまでループ。
    • タイマー割り込みがかかり、flgの値が0になったらループを抜ける。
  • 31行: ループを抜けたら、LEDポートの値を変転する。
  • 32行: flg変数を1にして29行を実行
    • タイマーを 自動再起動に設定しているのタイマーと割り込み動作は繰り返される