次はSTM32ボードを積極的に使ていきたい(6) - Lチカ
Arduino STM32環境 Blue PillボードでのLチカの3連発
基本に戻って、Lチカ(1秒間隔でLEDをチカチカ)のメモです。
3つの方法についてのメモです。
回路図
流れる電流は4.0mAくらいにしています。
I = (3.3v - 2.0 v) / 330Ω × 1000 = 3.94 mA (順方向電圧降下を2.0vとする)
※LEDを駆動する端子は訳アリでPA8にしています。
(1)delay()を使った方法
#define LED_PIN PA8 // TIMER1 1CH用出力ピン void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); }
LED_PINの出力をHIGH、LOWと変化させてLEDを点滅させています。
loop()で無限ループさせているので、他に処理が出来ません。
そこで、次にタイマー割り込みを使ってみます。
(2)タイマー割り込みを使った方法
#define LED_PIN PA8 // TIMER1 1CH用出力ピン uint8_t sw = LOW; void handle_timer() { if (sw == LOW) { sw = HIGH; } else { sw = LOW; } digitalWrite(LED_PIN, sw); } void setup() { pinMode(LED_PIN, OUTPUT); Timer1.pause(); // タイマー停止 Timer1.setPrescaleFactor(7200); // システムクロック 72MHzを10kHzに分周 Timer1.setOverflow(10000); // 最大値を1秒に設定 Timer1.attachInterrupt( // 割り込みハンドラの登録 TIMER_UPDATE_INTERRUPT, // 呼び出し条件は、カウンターオーバーフロー更新時 handle_timer // 呼び出す関数 ); Timer1.setCount(0); // カウンタを0に設定 Timer1.refresh(); // タイマ更新 Timer1.resume(); // タイマースタート } void loop() { }
Timer1はあらかじめ用意されているTimerオブジェクト変数です。
Arduino STM32では標準でタイマー割り込み機能(API)が提供されています。
Blue PillボードではTimer1、Timer2、Timer3、Timer4の4つが利用出来ます。
1秒間隔で割り込み関数を呼び出すための設定として、
分周設定 : 7200分の1
最大値設定 : 10,000カウント
を行っています。
システムクロック72MHzを7200分の1に分周した10kHzをタイマーのクロックとして
設定しています。
10kHzは0.0001秒に1回、カウンターの値をカウントアップします。
そのカウント値が10,000に達した時に、UPDATEイベントが発生するように指定します。
0.0001秒× 10,000 = 1.0秒 ですね。
Timer1.attachiInterupt()で割り込み処理を行う関数を設定しています。
引数のTIMER_UPDATE_INTERRUPT は、カウンター値を0に戻す更新時に
呼び出す指定で、2つ目の引数に指定した関数を呼び出します。
呼び出されるhanle_timer()でLEDの制御を行っています。
attachiInterupt()では、TIMER_UPDATE_INTERRUPT他に別途、4つの比較値(レジスタ)
に一致した条件での割り込み関数を呼び出すことも出来ます。
ですので、1つのタイマーで複数の異なるカウント値で割り込み処理が可能です。
(3)PWM出力を使った方法
#define LED_PIN PA8 // TIMER1 1CH用出力ピン void setup() { pinMode(LED_PIN, PWM); // LED_PINをPWMに設定 Timer1.pause(); // タイマー停止 Timer1.setPrescaleFactor(7200); // システムクロック 72MHzを10kHzに分周 Timer1.setOverflow(10000*2); // 周期を2秒に設定 pwmWrite(LED_PIN, 10000); // PWMパルス幅を1秒に設定 Timer1.setCount(0); // カウンタを0に設定 Timer1.refresh(); // タイマ更新 Timer1.resume(); // タイマースタート } void loop() { }
PWMを使っってLEDを点滅させています。
PWMもタイマー制御機能の一部です。
前述(1)、(2)はCPUがLEDの点灯・消灯制御を行っていましたが、
この方法ではタイマーが勝手にLEDの制御を行ってくれます。
CPUの負荷は0%ですね。
制約が少々あります。
任意のI/Oピンを制御することは出来ません。
TimerにはPWM出力を行うピンが割り当てられています。
LED_PINに指定したPA8はTimer1で利用出来るI/Oピンです。
(正確にはTimer1のCH1に割り当てれれているI/Oピン)
PWM出力の設定として、周期とパスル幅の設定が必要ですが、
周期は
Timer1.setPrescaleFactor(7200);
Timer1.setOverflow(10000*2);
パルス幅は
pwmWrirte(LED_PIN, 10000);
で周期の半分の幅1秒を設定しています。
この設定で、2秒周期のうち1秒間はHIGH,残り1秒間はLOWとなり
LEDを点滅させることが出来ます。
Timer1は同時に4つのPWM出力が可能です。
ただし、周期は同じでパスル幅のみ別々に設定が可能です。
タイマーは他にTimer2、Timer3、Timer4が独立して利用出来ます。
BluePillボードにて各タイマーが制御できるI/Oピンについては、
下記のサイトが参考になります。
・stm32duono Blue Pill
http://wiki.stm32duino.com/index.php?title=Blue_Pill
(特にpinoutの情報)
pinoutのPDFをダウンロードしてパウチして利用すると便利です。
2018/12/14 追記
タイマーに関するドキュメントを下記のリンク先にまとめました。
・タイマークラスライブラリ HardwareTimer
https://scrapbox.io/ArduinoSTM32/HardwareTimer
・libmaple API タイマーのサポート
https://scrapbox.io/ArduinoSTM32/Timer_support(timer.h)
« 次はSTM32ボードを積極的に使ていきたい(5) - NTSCビデオ出力 | トップページ | 久しぶりのPICマイコン、ちょっとハマった »
「arduino」カテゴリの記事
- Freenove Mecanum ホイール カー キットを購入しました(2025.05.28)
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
「ARM」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- PocketGoで遊んでみる(1)(2020.03.24)
- Arduino用 MML文演奏ライブラリの作成 その1(2019.04.01)
- BluePillボードで4桁7セグLEDの制御(2019.03.21)
「STM32」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- 「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!(2021.03.26)
- SPI接続フラッシュメモリモジュールを入手しました(2020.05.13)
- Arduino STM32でキャラクタ液晶ディスプレイを使う(2019.06.01)
« 次はSTM32ボードを積極的に使ていきたい(5) - NTSCビデオ出力 | トップページ | 久しぶりのPICマイコン、ちょっとハマった »
コメント