Перейти к содержанию

Сторожевой таймер (watchdog)

Сторожевой таймер — независимый счётчик внутри микроконтроллера, который перезапускает его, если программа вовремя не подтвердила, что работает. Он спасает устройство от зависания из-за ошибки в коде, помехи или сбоя внешней микросхемы.

Обновлено Редакция GAW

Сторожевой таймер (watchdog timer, WDT) — счётчик с собственным генератором, который сбрасывает микроконтроллер, если программа вовремя не обнулила его. Нормально работающая программа периодически «кормит» сторожа, записывая в его регистр условленное значение. Если код завис в бесконечном цикле, ждёт ответа от неисправного датчика или испорчен помехой, обновление прекращается, счётчик доходит до конца, и сторож перезапускает устройство.

Сторожевые таймеры STM32

У STM32 их два. IWDG (независимый) считает такты отдельного генератора LSI, поэтому работает, даже если основная тактовая частота остановилась. Запускается записью 0xCCCC в IWDG_KR, обслуживается записью 0xAAAA, а остановить его можно только сбросом. Таймаут при LSI 40 кГц у STM32F1 — от 0,1 мс до 26,2 с (RM0008). WWDG (оконный) тактируется от шины APB1 и сбрасывает микроконтроллер не только при опоздании, но и при слишком раннем обновлении — до открытия окна. Подобрать предделитель, перезагрузку и окно поможет калькулятор сторожевых таймеров STM32.

Сторожевой таймер AVR

У ATmega328P сторож считает такты собственного генератора 128 кГц. Наибольшее время — 1024K тактов, около 8 с. Кроме сброса, WDT AVR умеет вызывать прерывание — так его используют для периодического пробуждения из режима сна, подробнее — в статье о режимах сна AVR. Изменить настройки можно только через последовательность с битом WDCE. Время срабатывания и код настройки для разных AVR считает калькулятор WDT AVR.

Точность

Генераторы сторожей — встроенные RC-цепи с большим разбросом. LSI у STM32F103 по даташиту DS5319 — от 30 до 60 кГц при номинальных 40 кГц, генератор 128 кГц у ATmega328P производитель прямо называет не рассчитанным на точность. Поэтому таймаут выбирают с запасом в обе стороны: он не должен сработать при нормальной работе на быстром генераторе и должен успеть сработать при зависании на медленном.

Частые вопросы

Как работает сторожевой таймер?

Таймер считает такты собственного генератора, и программа должна периодически его обнулять — «кормить» сторожа. Если программа зависла и перестала это делать, счётчик доходит до конца, и сторож сбрасывает микроконтроллер. Обнулять таймер ставят в одно место главного цикла, которое выполняется только при нормальной работе, а не в прерывание по таймеру.

Чем IWDG отличается от WWDG у STM32?

IWDG (независимый) тактируется от собственного генератора LSI и работает, даже если основная тактовая частота остановилась; остановить его после запуска нельзя. WWDG (оконный) тактируется от шины APB1, точнее и проверяет окно: обновить его можно не раньше и не позже заданного момента — так ловятся и зависания, и программа, которая выполняется слишком быстро.

Почему таймаут сторожевого таймера неточный?

Сторожа тактируются от встроенных RC-генераторов с большим разбросом. LSI у STM32F103 по даташиту — от 30 до 60 кГц при номинале 40 кГц, генератор 128 кГц у ATmega328P не рассчитан на точность. Для STM32F103 таймаут при самом быстром LSI в 1,5 раза короче расчётного, при самом медленном — в 1,33 раза длиннее, поэтому его выбирают с запасом в обе стороны.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — гл. 19 — IWDG: ключи 0xCCCC, 0xAAAA, 0x5555, таймауты от 0,1 мс до 26,2 с при 40 кГц; гл. 20 — WWDG и окно
  2. STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — таблица 25 — частота LSI 30…40…60 кГц
  3. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 11.8 — WDT: генератор 128 кГц, режимы прерывания и сброса, последовательность WDCE; наибольшее время 1024K тактов ≈ 8 с

Нашли ошибку?