JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

ESP32 タイマー割込み(その1)

2020-02-03 19:46:38 | ESP32

 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 初期化

//割込みサービスルーチン
void IRAM_ATTR LED_Blink() {
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}
 
void setup() {
  pinMode(LED_PIN, OUTPUT);
 
  timer = timerBegin(0, 80, true); //timer=1us
  timerAttachInterrupt(timer, &LED_Blink, true);
  timerAlarmWrite(timer, 500000, true); // 500ms
  timerAlarmEnable(timer);
}
 
void loop() {
}

-----------------------------------------

ブレッドボードです。

 とりあえず、Lチカはできました。

 でも、タイマー割込みは奥が深そうです。もう少し勉強しなければ・・・・・



最新の画像もっと見る

コメントを投稿