LoginSignup
0
2

More than 1 year has passed since last update.

XIAO nRF52840でディープスリープからRTCタイマーを用いてウェイクアップする

Last updated at Posted at 2023-03-24

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);
    }
  }
}


これですっきり解決。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2