micro:bitをArduino環境で使う (2)GPIOTEを使ったLチカ
今後色々と利用するために、nRF51822のリファレンス・マニュアルをちびちびと読解しています。
今日はGPIOTE(GPIO tasks and events)を使ってLチカをやってみました。
GPIOTEは、GPIOのピンの入力に対するイベント、または出力に対するタスクを定義することが出来ます。
GPIOTEは便利なのですが、4チャンネル(4つしか定義出来ない)です。
Arduino IDE環境では、GPIOピンのピン入力割り込みに利用されています。
具体的には、attachInterrupt()、detachInterrupt()です。
4チャンネル(4つしか定義出来ない)の制約から、attachInterrupt()は同時に4つまで
の利用となります。
とりえず、GPIOTEの利用の練習として、前回のLチカで利用してみました。
GPIOTEの0チャンネルを利用してLEDのポートをトグルでHIGH、LOW出力するタスクを
定義して、割り込み関数でタスクを実行します。
スケッチ
#include "nrf.h" const int COL1 = 3; // Column #1 control const int LED = 26; // 'row 1' led uint8_t sw =0; extern "C" void TIMER2_IRQHandler(void) { NRF_TIMER2->EVENTS_COMPARE[0] = 0; // 割り込みイベントクリア NRF_GPIOTE->TASKS_OUT[0] = 1; // タスク実行 //sw =!sw; //digitalWrite(LED, sw); } void setup() { uint32_t ulPin; Serial.begin(115200); Serial.println("microbit is ready!"); // GPIOピンの設定 pinMode(COL1, OUTPUT); digitalWrite(COL1, LOW); // COL1ピンの設定 //pinMode(LED, OUTPUT); // LEDピンの設定 // GPIOTEの設定:LEDピン・トグルタスクを定義する ulPin = g_ADigitalPinMap[LED]; // LEDの実ピン番号の取得 NRF_GPIOTE->CONFIG[0] = // チャネル0に機能設定 (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | // タスクモード (ulPin << GPIOTE_CONFIG_PSEL_Pos) | // ピン番号設定 (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos) | // 動作指定:トグル (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos); // ピン出力初期値 NRF_GPIOTE->POWER = 1; // GPIOTE有効 //タイマ設定 NRF_TIMER2->TASKS_STOP = 1; // タイマストップ NRF_TIMER2->TASKS_CLEAR = 1; // カウンタクリア NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer; // モード設定:タイマモード NRF_TIMER2->PRESCALER = 8; // プリスケーラ設定:128分周(125KHz) NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; // カウンタ長設定:16ビット長指定 NRF_TIMER2->CC[0] = 62500/2; // コンパレータ0の設定:0.5秒周期 NRF_TIMER2->INTENSET = // 割り込み設定:コンパレータ0と比較 (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos); NRF_TIMER2->SHORTS = // ショートカット設定:クリアタスク指定 (TIMER_SHORTS_COMPARE0_CLEAR_Enabled << TIMER_SHORTS_COMPARE0_CLEAR_Pos); // タイマ割り込み設定 NVIC_SetPriority(TIMER2_IRQn, 3); // 割り込み優先度設定 NVIC_ClearPendingIRQ(TIMER2_IRQn); // 保留割り込みクリア NVIC_EnableIRQ(TIMER2_IRQn); // 割り込み許可 NRF_TIMER2->TASKS_START = 1; // タイマスタート } void loop(){ __SEV(); __WFE(); __WFE(); }
割り込み関数内で、前回のLED用のポート出力をdigitalWrite()で制御をコメントアウトして、
代わりにNRF_GPIOTE->TASKS_OUT[0] = 1 でチャネル0のタスクを実行しています。
そのタスクの定義は、下記で行っています。
// GPIOTEの設定:LEDピン・トグルタスクを定義する ulPin = g_ADigitalPinMap[LED]; // LEDの実ピン番号の取得 NRF_GPIOTE->CONFIG[0] = // チャネル0に機能設定 (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | // タスクモード (ulPin << GPIOTE_CONFIG_PSEL_Pos) | // ピン番号設定 (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos) | // 動作指定:トグル (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos); // ピン出力初期値 NRF_GPIOTE->POWER = 1; // GPIOTE有効
LEDピンのタスクを定義しています。
NRF_GPIOTE->TASKS_OUT[0] = 1によるタスク実行指示で、
動作指定をトグルにし、初期設定状態はLOWとしています。
この定義を行った場合、pinMode()によるピン機能の設定は不要となります。
割り込み関数で、NRF_GPIOTE->TASKS_OUT[0] = 1実行される度に
タスクが実行され、LEDピンの出力がトグルでHIGH,LOWと変化します。
次は、PPI(Programmable Peripheral Interconnect)を使って、
割り込みを利用せずにLチカをやってみます。
PPIは、イベントに対して実行するタスクを割り当てることが出来ます。
タイマ(TIMER2)のコンパレータとの一致イベントNRF_TIMER2->EVENTS_COMPARE[0]と
LEDの点滅タスクNRF_GPIOTE->TASKS_OUT[0] を結び付けてれば、Lチカするはずです。
前回のLチカスケッチでは、loop()で無駄に無限ループをしていました。
省電力対策を調べたところ、
void loop(){ __SEV(); __WFE(); __WFE(); }
でスリープモードになり、割り込み発生時にウェイクして処理を実行してくれるようです。
参考にしたサイト
How do you put the nrf51822 chip to sleep? [closed]
« micro:bitをArduino環境で使う (1)タイマー割り込みでLチカ | トップページ | microbitのエディタをブログに表示するテスト »
「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)
「micro:bit」カテゴリの記事
- 豊四季Tiny Basic for micro:bit のマニュアルを更新しました(2020.11.21)
- micro:bitで8x8ドットNeopixelを使ったメッセージ表示(2018.05.15)
- 豊四季Tiny BASIC for micro:bit をV0.08に更新しました(2018.05.14)
- micro:bitをArduino環境で使う (7) シリアル通信(2018.02.07)
- 豊四季Tiny BASIC for micro:bit をV0.07に更新しました(2018.02.04)
« micro:bitをArduino環境で使う (1)タイマー割り込みでLチカ | トップページ | microbitのエディタをブログに表示するテスト »

コメント