CMSIS STM32 Урок 9. Использование IWDG

«Не забывайте кормить собаку, иначе она начнет кусаться». В микроконтроллерах 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. Вот список всех возможных значений: 

  1. 0x5555 – открыть доступ к IWDG_PR и IWDG_RLR
  2. 0x0000 – закрыть доступ к IWDG_PR и IWDG_RLR
  3. 0xCCCC – Разрешить тактирование модуля IWDG. (Нет команды «запретить»)
  4. 0xAAAA – покормить собаку (восстановить счетчик)

Пример: настроить сторожевой таймер на 25,6 секунд и запустить его:

IWDG->KR = 0xCCCC;	// Тактировать модуль IWDG (и запустить таймер)
IWDG->KR = 0x5555; // Открыть доступ к записи регистров
IWDG->RLR = 4000;  // Начальное значение счетчика будет 4000
IWDG->PR = 6;	// Делитель частоты 256
IWDG->KR = 0x0000; // Закрыть доступ к записи

Так сторожевой таймер будет настроен и запущен. Нет способов остановить его. Мы в ответе за тех, кого приручили. Обновить счетчик можно только одним способом:

IWDG->KR = 0xAAAA;

Я вставляю этот код в событие, которое должно происходить каждую секунду, так получаю высочайшую отказоустойчивость. Такая простая и очень полезная вещь.

<< Предыдущий урок || Следующий урок >>

Оставить комментарий к этой статье или задать вопрос можно здесь (клик)

Если вы еще не подписаны на наш канал, то сейчас самое подходящее время