
«Не забывайте кормить собаку, иначе она начнет кусаться». В микроконтроллерах STM32 присутствует сторожевой таймер, так называемый Watch Dog. Полное название IWDG (Independent watchdog или независимый сторожевой таймер). Ваша программа должна то и дело обращаться к этому таймеру и пополнять его значение, это называется Feed Watchdog (покормить сторожевого пса), иначе контроллер перезапустится.
Ядро микроконтроллера тактируется одним из высокочастотных генераторов (HSI или HSE), часы реального времени тактируются низкочастотным генератором LSE, а сторожевой таймер тактируется независимым встроенным RC генератором на 40 кГц (LSI) через делитель частоты.
Это проверенная временем надежная система защиты устройства от зависания.
Микроконтроллер может зависнуть от
- Радиации
- Мощной электромагнитной помехи
- Проблемного кварца
- На морозе
- При очень высокой влажности
- Кригово прорагмного кода
Этот таймер IWDG считает в обратном направлении, а по достижении нуля перезапускает микроконтроллер. Максимально возможное значение для счетчика IWDG RLR = 4095. Максимальный делитель частоты DIV = 256, минимальный DIV = 4. Таким образом, несложно будет вычислить время, через которое перезагрузится микроконтроллер, если основная программа зависнет.
1 / (40000 / DIV / RLR), секунд Предположим, RLR мы сделали 4095, DIV сделали 16. 1 / (40000 / 16 / 4095) = 1,638 секунд. Если не обновить таймер за это время, микроконтроллер перезапустится. Значение делителя записывается в регистр IWDG_PR (по умолчанию он = 0)

А значение RLR записывается в регистр IWDG_RLR (по умолчанию = 4095)

Но нельзя просто так взять и записать регистры PR и RLR без разблокировки доступа, т. к. они не доступны для записи без ввода специального «ключа» в регистр IWDG_KR. Вот список всех возможных значений:
- 0x5555 – открыть доступ к IWDG_PR и IWDG_RLR
- 0x0000 – закрыть доступ к IWDG_PR и IWDG_RLR
- 0xCCCC – Разрешить тактирование модуля IWDG. (Нет команды «запретить»)
- 0xAAAA – покормить собаку (восстановить счетчик)
Пример: настроить сторожевой таймер на 25,6 секунд и запустить его:
IWDG->KR = 0xCCCC; // Тактировать модуль IWDG (и запустить таймер)
IWDG->KR = 0x5555; // Открыть доступ к записи регистров
IWDG->RLR = 4000; // Начальное значение счетчика будет 4000
IWDG->PR = 6; // Делитель частоты 256
IWDG->KR = 0x0000; // Закрыть доступ к записи
Так сторожевой таймер будет настроен и запущен. Нет способов остановить его. Мы в ответе за тех, кого приручили. Обновить счетчик можно только одним способом:
IWDG->KR = 0xAAAA;
Я вставляю этот код в событие, которое должно происходить каждую секунду, так получаю высочайшую отказоустойчивость. Такая простая и очень полезная вещь.
<< Предыдущий урок || Следующий урок >>
Оставить комментарий к этой статье или задать вопрос можно здесь (клик)
Если вы еще не подписаны на наш канал, то сейчас самое подходящее время

