Watchdog timer что это
Watchdog is an independent timer module that uses an independent clock source. It can reset or interrupt the MCU. The watchdog is useful to avoid unknown bugs. Suppose the program goes to an infinite loop, it can clear the watchdog’s timer value, then the system can be reset.
The watchdog in Atmega328p can works in 3 different mode, interrupt, system reset, interrupt and system reset. It is clocked by the internal 128KHz oscillator. If the watchdog timer is enabled, it would work in all sleep mode, and consume a significant part of power. So disabling this module when it is unnecessary. The working mode and en/disable is controlled by a fuse bit (High fuse bit.WDTON) and the Watchdog Timer Control Register (WDTCSR). The following picture shows the selection of different modes [1].
Watchdog working mode
Watchdog interrupt : When the WDTON fuse bit is 1 (unprogrammed), WDE = 0 and WDIE = 1, the watchdog timer interrupt is enabled. The timer interrupt can be used to wakeup the MCU from sleep mode. The timer uses the internal 128KHz oscillator, and the overflow value is 2^11 = 2K. Each cycle takes 1/128K. So the shortest overflow time is 2K * 1/128K = 1/64 = 0.015625ms ≈ 16ms.
The clock source can be prescaled according to following table [2]. This is also true for other two modes.

Watchdog reset : Watchdog timer expiration will reset the MCU. Go to the reset handler
Relavent registers and fuse bits
High fuse byte
| No. | Name | Meaning | Default value |
|---|---|---|---|
| 4 | WDTON | Watchdog timer is always on and works in reset mode | 1 |
MCU Status Register
| No. | Name | Meaning | Default value |
|---|---|---|---|
| 3 | WDRF | Watchdog System Reset Flag: This bit is set if a watchfog system reset occurs. The reset routine can use this bit to detect which reset source causes the reset. | 0 |
Watchdog Timer Control Register (WDTCSR)
| No. | Name | Meaning | Default value |
|---|---|---|---|
| 7 | WDIF | Watchdog interrupt flag, set and clear by hardware, writing 1 to clear | 0 |
| 6 | WDIE | Watchdog interrupt enable | 0 |
| 5 | WDP3 | Watchdog Timer Prescaler 3 | 0 |
| 4 | WDCE | Watchdog change enable: set WDCE and WDE to 1 before modifying WDE and WDPn. It would be reset to 0 by hardware after 4 cycles. | 0 |
| 3 | WDE | Watchdog System Reset Enable :it enable the reset mode. This bit is set by hardware immediately after software set the MCUSR.WDRF. | 0 |
| 2 | WDP2 | Watchdog Timer Prescaler 2 | 0 |
| 1 | WDP1 | Watchdog Timer Prescaler 1 | 0 |
| 0 | WDP0 | Watchdog Timer Prescaler 0: WDP[3:0] selects the prescaler according to the above figure. | 0 |
Modifying WDTCSR. 1). set WDE and WDCE to 1 together. 2) set WDCE = 0, and other bits together within 4 cycles.
Watchdog example
Working in interrupt mode and wake up the powerdown MCU every 8s, then blink the led. Source code
Arduino high fuse bytes is 0xde, so the WDTON is 1 unprogrammed. Then just modify the WDE, WDIE and WDPn bits.
Аппаратный «watchdog» или незаменимый помощник в борьбе с зависанием
В одной компании было много терминалов, и одна из неблагодарных задач для техподдержки — ездить по точкам и перезапускать операционную систему внутри терминалов. Было решено бросить вызов этой проблеме в виде разработки аппаратного сторожевого таймера.
В итоге мы получили устройство, которое подключается к расширительному спаренному USB-разъему на материнской плате.

Данное устройство имеет следующие возможности:
- Имитация нажатия кнопок POWER и RESET;
- Управление питанием USB-устройством (при условии, что у него нет отдельного источника);
- Управление гальванически развязанной контактной группой (реле). Можно поставить в разрез цепи питания;
- Индикаторные светодиоды (одним можно управлять, второй показывает режимы работы).
Алгоритм работы прост: внутри находятся два настраиваемых таймера, которые постоянно отсчитывают заданное время, по истечению которого имитируется нажатие соответствующих кнопок (POWER и RESET). Чтобы предотвратить случайную перезагрузку, необходимо периодически послать команду сброса таймера.
Лучше, чтобы за процедуру сброса таймеров отвечало целевое приложение, а не стороннее или системное (Cron, служба расписаний) по причине того, что вероятность сбоя в системе меньше, чем в приложении (хотя, у кого как).
Обмен информацией аналогичен консольному.
| команда | Описание | Пример |
|---|---|---|
| help | Краткая справка по командам | help |
| LED1 | Управление светодиодом, по умолчанию выключен | LED1 ON LED1 OFF |
| RELAY | Управление реле, по умолчанию включено | RELAY ON RELAY OFF |
| KEY1 | Имитация нажатия кнопки 1, по умолчанию не нажата | KEY1 ON KEY1 OFF |
| KEY2 | Имитация нажатия кнопки 2, по умолчанию не нажата | KEY2 ON KEY2 OFF |
| C1 | Управление таймером 1, связанным с кнопкой 1. Установка времени в секундах, максимальное значение 32767. Для отключения функции таймера, необходимо задать время равное 0. |
C1 RES C1 SET 60 C1 SET 0 |
| C2 | Управление таймером 2, связанным с кнопкой 2. Установка времени в секундах, максимальное значение 32767. Для отключения функции таймера, необходимо задать время равное 0. |
C2 RES C2 SET 60 C2 SET 0 |
| USB | Управление питанием USB, по умолчанию включено | USB ON USB OFF |
В случае удачного выполнения команды возвращает «OK».
В случае некорректных данных возвращает «ERROR».
Признаком конца строки служит символ возврата каретки «\r». Также поддерживается режим «\r\n».

Устройство выполнено на базе контроллера STM32F103CA с аппаратной поддержкой USB. Библиотека работы с USB версии V4.0.0. Напряжение работы 3.3В получаем с помощью линейного стабилизатора из 5В на USB. Во всех управляющих цепях используются транзисторы в ключевом режиме. Также не забываем про защитный диод от токов самоиндукции в катушки реле (в моем случае он оказался встроенным).
Arduino — WDT
![]()
A watchdog timer (WDT) is a hardware timer that automatically generates a system reset if the main program neglects to periodically service it. It is often used to automatically reset an embedded device that hangs because of a software or hardware fault. The Arduino Uno board has an ATmega328P chip as its controlling unit, which has a Watchdog Timer that helps the system recover from scenarios when the system hangs or freezes due to errors in the code or due to conditions that may arise due to hardware issues.
How does the Watchdog timer work?
The watchdog timer uses an internal 128kHz clock source and needs to be configured according to the need of the application. When enabled, it starts counting from 0 to a value selected by the user. If the watchdog timer is not reset by the time it reaches the user-selected value, the timer resets the microcontroller.
The main program usually has a loop that it constantly goes through performing various functions. The watchdog timer is loaded with an initial value greater than the worst-case time delay through the main program loop, so each time it goes through the main loop the code resets the watchdog timer. If a fault occurs and the main program does not get back to reset the timer before it counts down to zero, an interrupt is generated to reset the processor. This way, the watchdog timer can detect a fault on an unattended Arduino program and attempt corrective action with a reset. After the reset, a register can also be read to determine if the watchdog timer generated the reset or if it was a normal reset. This register on the Arduino is called the Watchdog Reset Flag Register (WDRF).
The ATmega328P watchdog timer can be configured for 10 different time settings (the time after which the watchdog timer overflows, thus causing a reset). The various times are: 16ms, 32ms, 64ms, 0.125s, 0.25s, 0.5s, 1s, 2s, 4s and 8s.
Now that we have a basic idea of how the timer works, to learn how to configure it. We’ll use a simple example of the on-board LED blinking on the Arduino UNO.
Once you run the aforementioned program, the LED on board will blink for a certain time before entering the while loop. The while loop here substitutes for a system in the hanged state. Since the watchdog timer is not reset in the while loop, the timer causes a system reset and the LED starts blinking again before the system hangs and restarts again. This keeps continuing in a loop.
Note: The watchdog timer is disabled at the start of the code and a delay of 3 seconds is used before enabling the timer. The delay is important in order to let the bootloader in Arduino to check if a new code is being uploaded and give it time to burn the code into the flash.
In this blog, we learned about the Watchdog timer in the Arduino UNO, how it works, and saw a simple sketch to enable it.
Сторожевой таймер (watchdog)
В данном уроке рассматривается устройство и работа со сторожевым таймером, для управления которым предлагается использовать библиотеку GyverWDT (by N1gra), предоставляющую полный контроль за WDT и доступ ко всем его настройкам и режимам работы. Библиотека очень лёгкая и подходит для большинства МК AVR, т.е. в частности для всех плат Arduino на их базе. Сторожевой таймер в МК AVR представляет собой независимый асинхронный блок, тактирующийся от отдельного внутреннего RC генератора, частота которого составляет около 128 кГц (несколько зависит от температуры и напряжения питания). Следует учесть, что изначально данный генератор спроектирован как энергоэффективный источник тактирования, и не предполагает высокой точности, отклонение частоты при производстве составляет около 10%. При желании этот генератор может тактировать и ядро AVR, в случае, если внешний кварцевый резонатор не предусмотрен, а внутренний RC генератор на 8МГц не удовлетворяет требованиям энергопотребления. Сторожевой таймер представляет из себя простой 10-битный счетный регистр, он инкрементируется при каждом фронте тактового сигнала, приходящего из делителя. Как только значение в этом счетном регистре достигнет 1023 – произойдет тайм-аут, а сторожевой таймер, в зависимости от установленного режима, инициирует сброс МК или вызывает прерывание. Чтобы предотвратить тайм-аут, можно сбросить счет сторожевого таймера в 0, воспользовавшись короткой функцией Watchdog.reset() библиотеки GyverWDT, или ассемблерной инструкцией “WDR”. Зачем нужен сторожевой таймер? Он позволяет автоматически перезагрузить контроллер в случае зависания программы, что может быть просто необходимо в автономных проектах. Помимо этого, библиотека GyverWDT предоставляет возможность использовать сторожевой таймер и в других целях, например для генерации прерываний с высоким приоритетом без использования основных аппаратных таймеров, что может очень пригодиться в сложных проектах, например для регулярного опроса датчиков. Не стоит забывать, что сторожевой таймер остается активным во всех, даже самых глубоких режимах сна, и может разбудить контроллер прерыванием. Полезным может оказаться и комбинированный режим сторожевого таймера, в котором он может одновременно опрашивать датчики, выступать сторожевым таймером для внешнего устройства, и следить за работой собственного ядра, чтобы в случае зависания сбросить его. Делители частоты сторожевого таймера

Почему приблизительная? Потому что частота генератора сторожевого таймера уже при производстве имеет приличный разброс, и если на малых значениях делителя это практически не проявляется (16 мс +/- 1.6 мс), то на больших это может стать серьезной проблемой (8 с +/- 1 с). Не стоит забывать, что RC генератор, в отличии от кварцевого резонатора, имеет небольшую зависимость частоты от температуры и напряжения питания.
Библиотека GyverWDT
Для работы с Watchdog можно использовать встроенную avr библиотеку, но у нас есть своя библиотека с более широким набором настроек: GyverWDT. Отдельная страница с документацией и ссылка на загрузку здесь. Функции библиотеки GyverWDT:
- Watchdog.reset(); короткая и быстрая команда сброса сторожевого таймера в 0, вызывается внутри программы , для подтверждения нормальной работы.
- Watchdog.disable(); короткая команда остановки работы сторожевого таймера. Вызывается для полного отключения watchdog.
- Watchdog.enable(mode, prescaler); функция для конфигурации и запуска таймера (см. пример)
Зачем нужен комбинированный режим? Он позволяет одновременно использовать как прерывания, так и сброс, что может оказаться очень мощным инструментом. Как это работает:
