Arduino開発環境にてタイマー割込みによりウェイクアップをやろうとしたところ、ライブラリの問題やら、IRQ重複やら案外手間取ったのでメモ。
※RTC1だと内部のタイマー関数等で使用しているIRQが重複してコンパイルエラーがでるためRTC2を使って回避するのがポイントっぽい。
Arduino IDE のインストール:
Arduino IDE をダウンロードし、インストール。
https://www.arduino.cc/en/software
Seeed XIAO nRF52840 のボード設定:
Arduino IDE の [ファイル] > [環境設定] に進み、追加のボードマネージャURLに以下のURLを追加。
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
[ツール] > [ボード] > [ボードマネージャ] に移動し、Seeed XIAO nRF52840 を検索してインストールして対象ボードを選択。
サンプルコード
以下、タイマー割込み時のウェイクの際にLEDを点灯させるテスト。
※当方のボードはSeeed XIAO nRF52840 Senseを使ったが無印のボード(Seeed XIAO nRF52840)でもいけるはず。
#include <Arduino.h>
#include <nrf.h>
const int ledPin = 13;
const uint32_t sleepTimeMs = 8000;
void setup() {
pinMode(ledPin, OUTPUT);
// Configure RTC2
NRF_RTC2->PRESCALER = 0; // No prescaling (16MHz clock)
NRF_RTC2->CC[0] = sleepTimeMs * 32.768; // Compare value (32.768kHz clock)
NRF_RTC2->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; // Enable COMPARE0 event
NRF_RTC2->INTENSET = RTC_INTENSET_COMPARE0_Msk; // Enable COMPARE0 interrupt
NVIC_EnableIRQ(RTC2_IRQn); // Enable RTC2 interrupt
NRF_RTC2->TASKS_START = 1; // Start RTC2
digitalWrite(ledPin, LOW);
}
void loop()
{
delay(2000);
digitalWrite(ledPin, HIGH);
// Enter deep sleep mode
__WFE();
__SEV();
__WFE();
}
extern "C" {
void RTC2_IRQHandler() {
if (NRF_RTC2->EVENTS_COMPARE[0] && (NRF_RTC2->INTENSET & RTC_INTENSET_COMPARE0_Msk)) {
NRF_RTC2->EVENTS_COMPARE[0] = 0;
NRF_RTC2->TASKS_CLEAR = 1;
digitalWrite(ledPin, LOW);
}
}
}
これですっきり解決。