タイマー
ESP32

概要

Arduino core for the ESP32を使った、ESP-WROOM-32開発ボードの64ビットタイマーの実験です。

Arduino core for the ESP32には、ESP-WROOM-32が持つ64ビットタイマーを扱うための関数が用意されています。それらの使い方を調べてみました。

よくわかっていないこともあります。あくまで、実験ベースなので、間違いが含まれている可能性が高いので注意してください。

Arduino core for the ESP32のインストールのページはこちら

実験

ESP-WROOM-32には、タイマーモジュールが2個あり、それぞれのタイマーモジュールは2個のタイマーを持っています。このため、合計4個のタイマーを利用することができます。

64ビットタイマーの使い方

以下のAPIを呼び出すことにより、基本機能を利用することができます。

上記のAPIを利用した例が、RepeatTimerです。

また、以下のAPIが用意されていて、タイマーの動作を変更したり、関連の情報を取得したりできるようです。

  • timerRead()
  • timerAlarmRead()
  • timerWrite()
  • timerAlarmWrite()
  • timerSetConfig()
  • timerGetConfig()
  • timerSetCountUp()
  • timerGetCountUp()
  • timerSetAutoReload()
  • timerGetAutoReload()
  • timerSetDivider()
  • timerGetDivider()
  • timerStart()
  • timerStop()
  • timerRestart()
  • timerStarted()
  • timerAlarmDisable()
  • timerAlarmEnabled()
  • timerEnd()
  • timerDetachInterrupt()
  • timerReadMicros()
  • timerReadSeconds()

timerBegin()

タイマーの基本設定を行います。

hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp); という形式です。

numは、タイマー番号で、0から3です。

dividerは、分周比で、16ビットの値です。データシートには、以下のように書いてあり、有効な値は2から65536となっています。

The prescaler can divide the APB clock by a factor from 2 to 65536.

Arduino core fore the ESP32では、dividerとして指定した値が0のときは0xFFFF(65535)に、1のときは、2に設定しています。

元のクロックの値は80MHzで、例えば80を設定すると、分周後の周期は1マイクロ秒になります。

countUpは、カウンタを増加させるか、減少させるかを設定します。trueが増加、falseが減少です。

戻り値は、hw_timer_t *型の値です。この戻り値を後から使います。

timerAttachInterrupt()

タイマー割り込みが発生したときに実行する関数を登録します。

void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge); という形式です。

timerは、timerBegin()で返却された値です。

fnは、割り込みが発生したときに実行する関数で、voidを返す、引数のない関数へのポインタです。付属のサンプルプログラムを見ると、IRAM_ATTR属性が付与されていました。調べたところ、割り込みハンドラをIRAM(Instruction RAM)に配置するための属性です。これを指定することにより、遅いFLASHではなく、早いRAMに配置することを保証し、割り込み発生時の遅延を防ぐことができるとのことです。

edgeは、割り込みのタイプをエッジタイプにするか、レベルタイプにするかを設定します。trueがエッジタイプ、falseがレベルタイプです。

timerAlarmWrite()

タイマーの値(割り込みのタイミング)を設定します。

void timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload); という形式です。

timerは、timerBegin()で返却された値です。

valueは、timerAttachInterrupt()で登録した関数を呼び出すまでの期間で、timerBegin()で設定した分周後の周期が単位となります。

autoreloadをtrueに設定すると、タイマーが起動すると、再度、登録されて周期的に実行されるようになります。

timerAlarmEnable()

タイマーを開始します。

void timerAlarmEnable(hw_timer_t *timer); という形式です。

timerは、timerBegin()で返却された値です。

スケッチ例

上記のAPIを利用した例が、RepeatTimerです。1秒ごとにタイマー割り込みが発生し、ピン0をLOWにすると、タイマーが停止します。

なお、関数を定期的に起動するためのライブラリとして、Tickerというものもあります。こちらのスケッチ例は、ArgumentsBlinkerを参照してください。

参考文献

バージョン

Hardware:ESP-WROOM-32
Software:Arduino 1.8.4/Arduino core for the ESP32

最終更新日

November 1, 2022

inserted by FC2 system