STM Урок 138. Independent watchdog (IWDG). Часть 2

В предыдущей части урока мы познакомились со сторожевым таймером, как организован IWDG в контроллере STM32, познакомились со схемой урока, создали и настроили проект.

Откроем файл main.c и для наших светодиодов напишем макросы для удобства дальнейшего написания и чтения кода

 

 

Добавим глобальную переменную, в которой мы будем считать прерывания таймера TIM2

 

 

В функции main() запустим таймер TIM2

А наш сторожевой таймер отдельно запускать не надо, автоматически добавленный вызов функции MX_IWDG_Init всё уже проделает — и инициализацию и старт.

Мы можем зайти в тело данной функции и посмотреть, что после настроек делителя и счётчика мы вызываем уже функцию HAL_IWDG_Init, тело которой мы также можем посмотреть.

Вот здесь таймер стартует

__HAL_IWDG_START(hiwdg);

Далее мы получаем доступ к регистрам с помощью занесения числа 0x5555 в ключевой регистр.

Затем заносятся значения в регистры

hiwdg->Instance->PR = hiwdg->Init.Prescaler;

hiwdg->Instance->RLR = hiwdg->Init.Reload;

И затем мы перезагружаем счётчик сторожевого таймера занесением в ключевой регистр значения 0xAAAA.

Вернёмся в наш файл main.c и запустим также и таймер 2

 

 

 

Добавим обработчик прерываний от таймера, в котором будем считать от 0 до 9, тем самым, анализируя значение нашего глобального счётчика, будем зажигать по очереди наши светодиоды

 

 

Подключим наш программатор к порту USB компьютера, соберём код и попытаемся прошить контроллер.

У нас скорее всего сразу ничего не получится и мы увидим вот такую ошибку

 

Чтобы справиться с данной ошибкой, зайдём в настройки отладки

 

 

Перейдём по закладке в Debugger, где нажмём следующую кнопку

 

 

В открывшихся настройках выберем следующий пункт

 

 

 

Сохраним наши настройки. Попробуем ещё раз прошить проект, скорее всего он теперь прошьётся и наши светодиоды начнут мигать по очереди

 

 

Но мы вовремя не перезагрузили сторожевой таймер, поэтому, как только отгорит седьмой светодиод и начнёт гореть восьмой, система тут же перезагрузится и процесс возобновится сначала

 

 

Чтобы этого не случилось, мы должны заблаговременно перезагрузить счётчик нашего сторожевого таймера IWDG. Перезагрузим его в начале 5 и 10 цикла, тогда программа будет работать непрерывно, если конечно ничего с ней не случится и ничего не повиснет

 

 

 

Соберём код и прошьём контроллер.

Теперь наши светодиоды мигают непрерывно с первого до десятого.

Давайте попробуем перезагрузить наш сторожевой таймер без использования библиотеки HAL. Мы закомментируем соответствующую строку и просто занесём в ключевой регистр нужное число

 

 

Соберём код, прошьём контроллер. У нас по-прежнему всё правильно работает. Я, конечно, советую всё-таки по возможности использовать библиотеку HAL.

Теперь представим, что наш таймер вдруг сломался и перестал считать. У нас тогда по истечении известного интервала после последней перезагрузки сторожевого таймера должна будет перезагрузиться система.

Давайте попробуем данную ситуацию как-то смоделировать.

Для этого добавим обработчик внешнего прерывания от кнопки, в котором мы остановим наш таймер

 

 

Соберём код, прошьём контроллер.

Нажмём на кнопку и наш таймер остановится

 

 

Через некоторое время система перезагрузится и код начнёт выполняться с самого начала.

Также можно смоделировать другую ситуацию. Конечно в жизни такая не случится. Мы изменим интервал перезагрузки сторожевого таймера. Мы его сделаем меньше 5 секунд, так как он у нас перезагружается раз в 5 секунд, и он уже не успеет вовремя перезагрузиться, и вместо него опять же перезагрузится контроллер.

Для этого нам достаточно изменить делитель или значение счётчика сторожевого таймера IWDG.

В обработчике прерывания от кнопке закомментируем строку с остановкой таймера TIM2 и вместо этого изменим делитель, сделав его вдвое меньше, тем самым у нас количество секунд в интервале тоже станет вдвое меньше и составит приблизительно 3,68 секунды. Для этого мы будем должны включить в соответствующем регистре только 2-й бит. Не забываем предварительно получить доступ к изменению предделителя, занеся определённый код в ключевой регистр

 

 

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

Теперь закомментируем изменение предделителя, а изменим значение счётчика, уменьшив его также вдвое, что будет означать одно и то же и интервал также составит около 3,68 секунды. Запись ключевого значения в соответствующий регистр оставляем, так как для изменения числа в счётчике используется такое же ключевое значение

 

 

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

Таким образом, в данном занятии мы познакомились с сторожевым таймером (IWDG), поняли, для чего он нужен и закрепили свои знания на практике.

Всем спасибо за внимание!

 

 

 

Исходный код

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

STM Independent watchdog IWDG

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

STM Independent watchdog IWDG

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*