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), поняли, для чего он нужен и закрепили свои знания на практике.

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

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

Исходный код

 

 

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

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

 

 

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

 

STM Independent watchdog IWDG

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

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

*