Как настроить сторожевой таймер для платы arduino Nano 33 BLE Sense?
Для платы 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);
}
}
Спасибо.
@tjbtjbtjb, 👍2
Обсуждение2 ответа
Лучший ответ:
На самом деле, для 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
Вы не хотите обновлять сторожевой таймер в ISR. Можно застрять, но ISR постоянно срабатывает. Я видел, как это происходило много раз, особенно когда на него попадал плохой переходный процесс. Обычно я использую внешний, поэтому он вызывает сброс всего пакета. Я делаю это, задействуя все. Не все сторожевые таймеры в процессорах могут выполнять внешний сброс.
Выше я привел пример работы с UNO и хотел бы аналог с nano ble., @tjbtjbtjb
Он отлично работает с UNO, Nano и многими другими. У меня нет возможности попробовать., @Gil
- Как управлять встроенными светодиодами Arduino Nano 33 BLE Sense?
- WatchDog на Arduino Nano — не восстанавливается
- Вывод 5В не выводит никакого напряжения в Arduino Nano ble 33
- Последовательный порт Arduino nano 33 BLE не работает с приложением С#
- Функция availableForWrite() возвращает ошибку при компиляции для Arduino nano 33 BLE
- Почему простое мигание светодиодом не работает при использовании ШИМ mbed.h и Arduino Nano BLE?
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
Небольшой поиск дал эту ссылку, и этот код, похоже, сработал: 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