STM Урок 140. Window watchdog (WWDG). Часть 2

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

И у нас второй светодиод, только начав светиться, сразу потухал и процесс начинался сначала. Потому что мы не перезагружаем вовремя наш оконный сторожевой таймер. Давайте теперь посчитаем, в какое приблизительно время, или, точнее, в какой интервал времени мы должны уложиться с перезагрузкой нашего WWDG.

В принципе, здесь не надо ни каких сложных формул, предоставленных нам даташитом на контроллер. Мы и так всё посчитаем.

Сначала посчитаем, сколько времени нам требуется на один тик счётчика оконного сторожевого таймера. Для этого мы частоту 4 мегагерца разделим на 4096 и на 8. 4096 — это величина постоянная, а 8 — это наш предделитель. После деления мы на результат поделим единицу. После всех этих действий мы получим 8,192 милисекунды. Вот это и есть период одного тика. Мы помним что счётчик считает в обратную сторону от числа, которое мы в него занесли. А занесли мы в него 127. Поэтому сначала посчитаем, сколько тиков ему надо будет посчитать до первой границы, которую мы сделали равной 90. Получим 37. Умножаем 37 на 8,192 и получим результат, примерно равный 303,1 милисекунды. То есть мы знаем что в интервале от запуска WWDG до 303,1 милисекунды мы не должны его перезагружать. Теперь узнаем интервал от начала счёта до известной величины 0x3F или в десятичном выражении 63. Для этого мы 63 вычтем из 127 и получим значение 64. Вот столько тиков пройдёт у нас до перезагрузки системы. Посчитаем теперь этот интервал, умножив 64 на 8,192, и получим число примерно 524,3 милисекунды.

Теперь мы знаем, что мы должны перезагрузить наш оконный сторожевой таймер в интервале времени между 303,1 и 524,3 милисекунд. Так как таймер 2 у нас настроен на 400 милисекунд, то перезагружать нам его надо в каждый тик и мы как раз уложимся в нужном интервале.

 

 

Но здесь будет некоторая загвоздка. В первом кейсе нам его перезагружать не надо, так как он сработает сразу после старта WWDG, так как наш таймер 2 стартует сразу же после оконного сторожевого таймера. Можно, конечно между их стартами включить обычную задержку в 400 милисекунд, но мы так делать не будем, как то не эстетично. Пока мы никак делать не будем а всего лишь перезагрузим WWDG в каждом кейсе кроме нулевого

 

 

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

У нас будут светодиоды бежать от первого до последнего, и, казалось бы, всё работает. Но работает не всё. Здесь я не смогу показать то, что у нас, когда начинается каждый следующий цикл, то первый светодиод будет гореть немного дольше остальных. Всё это происходит потому, что здесь имеет место перезагрузка системы, так как мы в нулевом кейсе не перезагружаем счётчик. Поэтому в этом кейсе мы сделаем проверку на флаг первого цикла, и если он у нас не в нуле, то перезагрузим оконный сторожевой таймер, а если в нуле, то установим его в единицу

 

 

 

Если мы теперь соберём код и прошьём контроллер, то у нас цикл пойдёт правильно.

Ну и теперь. как и в случае с независимым сторожевым таймером, в обработчике прерываний от кнопки «сломаем» наш таймер 2, то есть остановим его. Для этого мы всего лишь раскомментируем код остановки таймера, а остальной код работы с регистрами удалим

 

HAL_TIM_Base_Stop_IT(&htim2);

IWDG->KR = 0x00005555U;

//IWDG->PR = IWDG_PR_PR_2; // IWDG_PRESCALER_64

IWDG->RLR = 1150;

 

Соберём код, прошьём контроллер и в момент работы программы нажмём кратковременно нашу кнопку

 

 

Контроллер почти сразу перезагрузится, так как таймер 2 остановится, а сторожевой таймер перестанет обновляться. Вот это и будет эмуляция реакции сторожевого таймера на зависание.

Теперь поиграем со скоростью работы таймера 2 и заставим его работать с периодом между тиками не равными 400, а с такими чтобы они были либо меньше интервала до верхней границы счёта, либо больше интервала до нижней границы счёта.

В обработчике прерываний от кнопки закомментируем остановку таймера, а изменим число сравнения

 

 

Интервал между тиками таймера 2 теперь будет составлять 1 / (8000000/2000/1100) = 0,275. А это меньше чем интервал счёта до верхней границы и получится такая ситуация, что WWDG будет перезагружаться слишком рано, что по условию его работы недопустимо и у нас будет перезагружаться наша программа.

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

Попробуем установить другое число в регистр сравнения таймера 2

 

 

В этом случае мы получим следующий период тиков: 1 / (8000000/2000/2200) = 0,55. Это значение периода больше интервала до окончания счёта счётчика обратного отсчёта сторожевого таймера (0,524). Хоть и не на много, но все равно сработает.

Проверим это, собрав код и прошив контроллер. И при нажатии на кнопку система также будет перезагружаться.

Чтобы убедиться окончательно в правильности наших расчётов занесём в регистр сравнения таймера 2 следующее число по нажатию кнопки

 

 

В этом случае мы получим следующий период тиков таймера 2: 1 / (8000000/2000/1800) = 0,45. Это значение больше чем мы установили в Cube MX, но всё же входит в интервал между 0,303 и 0,524. Поэтому при нажатии кнопки у нас будет просто происходить некоторое небольшое замедление мигания наших светодиодов, но система у нас перезагружаться не будет.

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

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

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

 

 

 

Исходный код

 

 

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

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

 

 

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

STM Window watchdog (WWDG)

 

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

STM Window watchdog (WWDG)

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

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

*