Сторожевой таймер (watchdog) представляет собой важный элемент практически в любом микроконтроллере, который позволяет этому микроконтроллеру справиться с нештатной ситуацией, например, при зависании. Если говорить вкратце о сути работы сторожевого таймера, то он перезагружает программу, если до определенного времени она не выполнила команду сброса этого сторожевого таймера. Такая функция очень полезна в построении автономных встраиваемых систем.
Поскольку в радиомодуле NRF24LE1 имеется полноценный микроконтроллер, то в нем также присутствует сторожевой таймер, который будет рассмотрен в данном материале.
Сторожевой таймер в NRF24LE1 обладает следующими характеристиками и особенностями: минимальное время таймаута 7.8125 мс, максимальное время таймаута 512 с, для тактирования по умолчанию используется внутренний осциллятор на 32.768 КГц, регистр таймера 16-разрядный. Для управления сторожевым таймером имеется регистр WDSV. Он содержит 6-битное значение счетчика и разделяется на два байта – MSByte (старший байт) и LSByte (младший байт). Для записи значения в этот регистр сначала нужно произвести запись в LSByte, а затем в MSByte. То же самое касается считывания информации из регистра.
Сторожевой таймер активируется, когда завершается запись обоих байтов. Обратный отчет ведется от записанного значения, умноженного на 256, до 0. Когда значение счетчика становится равным 0, микроконтроллер перезагружается. Чтобы избежать сброса, можно записать в регистр новое или то же самое значение. Таймаут сторожевого таймера в секундах можно определить следующим образом: WDSV*256/32768. Настройка тактирования сторожевого таймера осуществляется с помощью регистра CLKLFCTRL.
Для того, чтобы настроить сторожевой таймер, сначала нужно определить источник тактирования. Для внутреннего генератора 32.768 КГц нужно в биты Bit2:1 регистра CLKLFCTRL записать 01. Для проверки того, активировался ли генератор, можно прочитать значение шестого бита в этом регистре. После этого можно записывать значения в байты LSByte и MSByte регистра WDSV. Для упрощения работы со сторожевым таймером в NRF24LE1 имеются две полезные функции библиотеки Nordic Library. Функция hal_wdog_init() инициализирует сторожевой таймер с начальным значением, которое принимается в качестве 16-битного аргумента. Функция hal_wdog_restart() перезагружает сторожевой таймер, чтобы избежать сброса.
Для понимания работы сторожевого таймера в NRF24LE1 приведен код программы и соответствующая данному примеру схема.
#include"reg24le1.h"
#include"hal_delay.h"
#include "hal_wdog.h"
void main()
{
CLKLFCTRL = 0x02; // запускаем тактирование 32.768 КГц
while(!( CLKLFCTRL & 0x40)); // ждем готовности тактового генератор
P0DIR = 0; // Линии порта 0 на выход
P0 = 0xff; // Линии порта 0 в высокий лог. уровень
delay_ms(200); // ждем 200 мс
P0 = 0x00; // Линии порта 0 в низкий лог. уровень
hal_wdog_init(0x0200); // таймаут 4 с
while(1); // бесконечный цикл
}
© digitrode.ru