ESP32 タイマー割込み(その1)
JH7UBC 2020.2.4
ESP32のタイマー割込みについて、「ESP32 Timer 割込み」というキーワードで検索して、あちこちのサイトを見ながら勉強を始めたのですが、
これがなかなか手強いというか、分からないことが多いです。よくまとまっているのが、「Arduinoで遊ぶページ」というサイトのこちらのページです。
ESP32は、2つのタイマーモジュールがあり、それぞれ2個の64ビットタイマーを持っているので、計4個のタイマーを使うことができます。
タイマー割込みを利用したLEDの点滅(いわゆるLチカ)の最も簡単なスケッチです。
LEDは、GPIO27に1kΩの抵抗を介して接続します。
割込みサービスルーチンでIRAM_ATTRと宣言すると、コンパイルされたコードは、ESP32の内部RAM(IEAM)に配置されます。
これをしないとコードはフラッシュメモリに配置され、割込み時の処理が遅くなります。
timerBegin(0,80,true);は、タイマー0、分周比80、つまりこのタイマーのクロックは、80MHz/80=1MHz(1us)、countup
timerAttachInterrupt(timer, &LED_Blink, true);は、タイマー割込みがかかった場合、LED_Blink()を実行すること
割込みサービスルーチンをポインタで指名するんですね。&をとって、関数で呼んでもコンパイル実行してくれました。
この辺がよくわからない。
timerAlarmWrite(timer, 500000, true); 割込みタイミングの設定で、timerが500000カウントに達したときに割込みがかかります。
つまり、1us×500000=500000us=500ms=0.5sごとに割込みがかかります。
0.5sごとに割込みサービスルーチンが呼ばれ、LEDの点灯と消灯が繰り返されます。
なお、各関数の詳細は、こちらのサイトを参照ください。
/* * ESP32 Timer interrupt LED Blink * 2020.2.3 * JH7UBC KeijiHata * */ #define LED_PIN 27 hw_timer_t * timer = NULL; //timer 初期化 //割込みサービスルーチン |
ブレッドボードです。
とりあえず、Lチカはできました。
でも、タイマー割込みは奥が深そうです。もう少し勉強しなければ・・・・・