Как настроить сторожевой таймер для платы arduino Nano 33 BLE Sense?

arduino-nano arduino-nano-ble watchdog

Для платы arduino Nano 33 BLE Sense стандартный файл avr/wdt.h недоступен. И кажется, что ни одна стандартная библиотека этого не предоставляет. Как использовать систему сторожевого таймера для этой платы? Я не нашел полной информации об этом.

Я нашел страницу https://www.mysensors.org/apidocs/group__avr__watchdog.html. которые позволяют настроить режим перезагрузки. И это работает. Но нет возможности настроить режим прерывания с помощью функции ISR(). Кроме того, нет пояснений по поводу манипулирования используемыми регистрами/переменными для любой тонкой конфигурации.

Простой пример кода с обычными асинхронными элементами, использующими механизм сторожевого таймера ISR(). Он хорошо работает с ATmega328 (например, UNO). Но я не нашел эквивалентной конфигурации для Nano 33 BLE с использованием nRF52840.

# include <avr/wdt.h>

volatile byte led;
int k;

ISR(WDT_vect) {
  Serial.println("Asynchronous stuff in ISR() function");
  digitalWrite(LED_BUILTIN,led);
  led=!led;
}

void setup() {
  pinMode(LED_BUILTIN,OUTPUT);  
  led=0;
  
  Serial.begin(9600);
  while(!Serial) {}
  Serial.println("== R E B O O T ==");

  WDTCSR = ( 1 << WDE ) | ( 1 << WDCE );
  WDTCSR = ( 1 << WDP2 ) | ( 1 << WDP0 ) | ( 1 << WDIE ) ; // Прерывание и тайм-аут 1/2 с
}

void loop() {
  Serial.print("Loop #");
  Serial.println(k);
  if (k++%2) {
    Serial.println("Some stuff (even branch)");
    delay(1200);
  }
  else {
    Serial.println("Some stuff (odd branch)");
    delay(4800);
  }
}

Спасибо.

, 👍2

Обсуждение

Небольшой поиск дал эту ссылку, и этот код, похоже, сработал: https://devzone.nordicsemi.com/f/nordic-qa/53904/nrf52840-watchdog-for-arduino-nano-33-ble-sense, @Tarabas

Да, но ваша ссылка содержит ту же информацию, что и я. Речь идет только о наборе сторожевого таймера с простой перезагрузкой, а не о наборе механизма ISR() в конце отсчета сторожевого таймера., @tjbtjbtjb

Я только что добавил простой пример кода, работающий с файлом uno. Ищем эквивалентный код для nano BLE., @tjbtjbtjb

Вы видели, что они использовали другие определения, чем вы? NRF_WDT->CONFIG = 0x01; и так далее. Я не вижу этого в вашем коде. Ваш код в настройке напрямую записывает в регистры MCU, которые не существуют в nano 33 BLE. Чтобы настроить его, вы должны взять на себя эти части. Другой вопрос, можно ли и как перехватить прерывание сторожевого таймера на процессоре nRF. Обычно прерывание сторожевого таймера просто сбрасывается - обычно в вашей прошивке этого не происходит. Если ваша идея состоит в том, чтобы синхронизировать выполнение некоторого кода, вы можете использовать для этого прерывание по таймеру, а не сторожевой таймер., @Tarabas


2 ответа


Лучший ответ:

0

На самом деле, для RF52940 я не уверен, что сторожевой таймер может предоставить необходимый механизм прерывания, несмотря на то, что он существует бит INTENSET для прерывания в соответствии с документацией по набору микросхем https://content.arduino.cc/assets/Nano_BLE_MCU-nRF52840_PS_v1.1.pdf). Но хороший способ — это, безусловно, использование таймеров (и можно использовать не один, очень хорошо).

Для того же поведения, что и код, приведенный ранее для UNO, вот код, который можно написать для Nano BLE, используя прерывание по таймеру (см. https://github.com/khoih-prog/NRF52_MBED_TimerInterrupt для полной и полезной документации).

#include "NRF52_MBED_TimerInterrupt.h"

volatile byte led;
volatile uint32_t count=0;
NRF52_MBED_Timer myTimer(NRF_TIMER_1); 
unsigned k=0;

void myHandler() {
  digitalWrite(LED_BUILTIN,led);
  led=!led;
  count++;
}

void setup() {
  pinMode(LED_BUILTIN,OUTPUT);  
  led=0;
  
  Serial.begin(9600);
  while(!Serial) {}
  Serial.println("== R E B O O T ==");

  if (myTimer.attachInterruptInterval(500*1000, myHandler)) // каждые 1/2 секунды
    Serial.println("myTimer launched");
  else
    Serial.println("Can not set the timer");
}

void loop() {
  Serial.print("Loop #");
  Serial.print(k);
  Serial.print(" and nb times in Handler : ");
  Serial.println(count);
  if (k++%2) {
    Serial.println("Some stuff (even branch)");
    delay(1200);
  }
  else {
    Serial.println("Some stuff (odd branch)");
    delay(4800);
  }
}
,

Re: * «Я не уверен, что сторожевой таймер может обеспечить необходимый механизм прерывания, несмотря на то, что существует бит INTENSET для прерывания в соответствии с документацией по чипсету». поездка на СБРОС чуть более чем за 60 мкс. Это может не делать то, что нужно OP. Так что, если это то, что вы имели в виду, да, это ограничено по сравнению с тем, что позволяет вам делать аналог AVR. Для тех, кому нужно всего 60 мкс до предстоящего сброса, использование INTENSET должно соответствовать их требованиям., @timemage


-1

Вы не хотите обновлять сторожевой таймер в ISR. Можно застрять, но ISR постоянно срабатывает. Я видел, как это происходило много раз, особенно когда на него попадал плохой переходный процесс. Обычно я использую внешний, поэтому он вызывает сброс всего пакета. Я делаю это, задействуя все. Не все сторожевые таймеры в процессорах могут выполнять внешний сброс.

,

Выше я привел пример работы с UNO и хотел бы аналог с nano ble., @tjbtjbtjb

Он отлично работает с UNO, Nano и многими другими. У меня нет возможности попробовать., @Gil