概要
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というものもあります。こちらのスケッチ例は、ArgumentsやBlinkerを参照してください。
参考文献
バージョン
Hardware: | ESP-WROOM-32 |
Software: | Arduino IDE 1.8.4/Arduino core for the ESP32 |
最終更新日
July 14, 2024