Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2742
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Независимый и оконный сторожевые таймеры

461

Window: это поле устанавливает соответствующее значение «окна», в пределах ко-

торого разрешено повторное обновление таймера. Может задаваться в диапазоне от значения поля Counter (по умолчанию) до 0x3F.

Counter: задает период таймера, то есть значение перезагрузки при обновлении

таймера. Может задаваться в диапазоне от 0x7F (значение по умолчанию) до 0x3F.

EWIMode: данное поле разрешает прерывание раннего пробуждения (EWI), и оно мо-

жет принимать значения WWDG_EWI_ENABLE и WWDG_EWI_DISABLE.

Для конфигурации и запуска таймера WWDG мы используем функцию CubeHAL:

HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);

Когда разрешен режим EWI таймера WWDG, мы должны реализовать ISR WWDG_IRQHandler() и разместить в ней вызов функции:

void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg);

Правильный способ оповещения о возникновении прерываний состоит в реализации процедуры обратного вызова:

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg);

Для обновления таймера WWDG во временном окне, мы используем функцию:

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter);

где параметр Counter соответствует значению перезагрузки в регистре счетчика WWDG. Наконец, учитывая, что таймер WWDT тактируется сигналом шины APB, нам необходимо разрешить тактирование данного периферийного устройства, воспользовавшись

макросом __HAL_RCC_WWDG_CLK_ENABLE().

17.3. Отслеживание системного сброса, вызванного сторожевым таймером

Может быть полезно отследить, когда системный сброс вызван истечением сторожевого таймера. Это может помочь нам понять, что происходит во время сеанса отладки. Два специальных бита в регистре Системы сброса и тактирования (Reset and Clock Control, RCC) позволяют отследить данное событие.

Чтобы определить, был ли вызван сброс таймером IWDG, мы можем проверить соответствующий флаг, используя следующий макрос:

__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST);

в то время как для таймера WWDG мы можем проверить этот флаг, используя макрос:

__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST));

Независимый и оконный сторожевые таймеры

462

17.4. Заморозка сторожевых таймеров во время сеанса отладки

Во время сеанса отладки таймеры WWDG и IWDG будут продолжать отсчет. Это помешает нам выполнить пошаговую отладку. Мы можем сконфигурировать интерфейс отладки так, чтобы он останавливал сторожевые таймеры при приостановке микроконтроллера при помощи следующих макросов:

__HAL_DBGMCU_FREEZE_IWDG(); __HAL_DBGMCU_FREEZE_WWDG();

17.5. Выбор сторожевого таймера, подходящего для вашего приложения

Оба сторожевых таймера имеют сходные функциональные возможности, и оба они делают одно и то же: сбрасывают микроконтроллер, если мы не обновим их счетчик в течение определенного интервала времени. Но когда лучше отдать предпочтение одному таймеру, а когда другому?

Таймер IWDG предпочтителен, когда мы должны быть уверены в работе основного тактового сигнала. Поскольку IWDG тактируется независимо LSI-генератором, действительно полезно отслеживать такие неисправности. Более того, если мы используем ОСРВ, мы можем сконфигурировать независимый поток, настроив его с максимальным приоритетом, который использует программный таймер для периодического обновления таймера IWDG. Это также помогает нам понять, что ядро правильно планирует потоки.

Таймер WWDG более предпочтителен таймеру IWDG, когда мы должны быть уверены в том, что некоторые операции выполняются в фиксированном и четко охарактеризованном временном окне. Если данная процедура выполняется меньше или больше заданного времени, она не сможет обновить таймер во временном окне, что приведет к системному сбросу. Более того, WWDG является подходящим выбором, если мы хотим выполнить критические операции (например, перевести машину в безопасное состояние или сохранить специальные данные в энергонезависимой памяти): благодаря IRQ с ранним предупреждением мы можем получать уведомления о наступающем системном сбросе.