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

Когда мы говорили о таймерах, то упоминали так называемый «сторожевой» таймер (англ. watchdog). Для чего он нужен? Допустим, вы попытались обратиться в запрещённую или не существующую область памяти (при условии что MemManage_Fault() вы сами не разрешали) — сработает внутреннее прерывание и начнётся выполнение функции HardFault_Handler(), в которой по-умолчанию — вечный цикл. Другими словами устройство превратиться в кирпич и перестанет реагировать. Вы наверняка встречались с такой проблемой ранее, скажем, в телефоне. К тому же, вы сами могли допустить ошибку и попасть в вечный цикл случайно.

Единственный способ вывести устройство из такого состояния — отключить питание и включить его снова.

Have you tried turning it off and on again? // The IT Crowd

Для решения подобных ситуаций служит сторожевой таймер. Причём он может быть двух видов.

Если устройство было перезагружено из-за сторожевого таймера (например, из-за IWDG), то в специальном регистре RCC появится флаг.

Таймер IWDG тактируется от собственного источника — низкоскоростной RC-цепочки (LSI). Потому-то он и называется независимым — его работа никак не зависит от основной программы (тактирующего сигнала ядра). Однако, данный источник очень не стабилен по частоте (может плавать в пределах ±9% в зависимости от температуры), да и к тому же при заявленной частоте 40 кГц может иметь реальную в переделах от 30 до 60 кГц. Таймер WWDG берёт тактовый сигнал от шины APB1 с некоторым делителем. Мы рассмотрим работу только с независимым сторожевым таймером, применяя стандартную библиотеку периферии.

Таймер IWDG имеет 12 разрядов, т.е. максимальное значение счётчика — 212 - 1 = 0xFFF. Так же мы можем выставить предделитель для LSI от 4 до 256. Допустим что нам требуется перезагрузить устройство, если в течении 1,5 секунды оно не сбросила счётчик к первоначальному значению. Возьмём за частоту LSI — 40 кГц. Тогда при предделителе равном 256 частота работы таймера будет примерно 156 Гц. Значит, что бы подождать 1.5 секунды нужно 156 * 1,5 = 234 такта. Настроим IWDG.

Пример использования

Код можно найти на GitHub: CMSIS, SPL.


Назад | Оглавление | Дальше


1 В книге Making Embedded Systems Элисии Уайт (одна из ведущих подкаста Embedded.FM) приводится забавная история про сторожевой таймер. Дело в том, что в инженерном жаргоне обновление значения счётчика сторожевого таймера используется слово kick, т.е. пинать. Элисия работала в pet-friendly компании (допускалось приводить домашних животных на работу), где проводились code-review. Когда её начальник увидел в главном цикле вызов функции KickTheDog() — он возмутился и сказал что не позволит пинать собак в его компании. Пришлось дать функции другое название -- PetTheDog(), т.е. «гладить собаку».