Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
タイマーの実験(ESP-WROOM-32)

概要

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を呼び出すことにより、基本機能を利用することができます。

  1. timerBegin()
  2. timerAttachInterrupt()
  3. timerAlarmWrite()
  4. timerAlarmEnable()

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

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

  1. timerRead()
  2. timerAlarmRead()
  3. timerWrite()
  4. timerAlarmWrite()
  5. timerSetConfig()
  6. timerGetConfig()
  7. timerSetCountUp()
  8. timerGetCountUp()
  9. timerSetAutoReload()
  10. timerGetAutoReload()
  11. timerSetDivider()
  12. timerGetDivider()
  13. timerStart()
  14. timerStop()
  15. timerRestart()
  16. timerStarted()
  17. timerAlarmDisable()
  18. timerAlarmEnabled()
  19. timerEnd()
  20. timerDetachInterrupt()
  21. timerReadMicros()
  22. timerReadSeconds()

timerBegin()

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

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

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

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

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.inoです。1秒ごとにタイマー割り込みが発生し、ピン0をLOWにすると、タイマーが停止します。

参考文献

ESP32 Technical Reference Manual

バージョン

Arduino 1.8.4/Arduino core for the ESP32/ESP-WROOM-32



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2018 garretlab all rights reserved.
inserted by FC2 system