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

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

«Все, что может пойти не так, пойдет не так», – утверждает закон Мерфи1. И это горь-

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

Почти все встраиваемые микроконтроллеры, представленные на рынке, оснащены сторожевым таймером (WatchDog Timer, WDT)2. Сторожевой таймер обычно реализуется в виде таймера, работающего в режиме автономного таймера с нисходящим отсчетом, который вызывает сброс микроконтроллера при достижении им нуля, или если счетчик таймера не перезагружается до своего начального значения в четко определенном временном окне (в этом случае мы поговорим об оконном сторожевом таймере). После включения сторожевого таймера микропрограмма должна «постоянно» обновлять регистр счетчика сторожевого таймера до его начального значения, в противном случае линия сброса микроконтроллера устанавливается таймером на низкий уровень, и наступает аппаратный сброс.

Разумное управление сторожевым таймером может помочь нам справиться со всеми нежелательными ситуациями, которые приводят к неисправным состояниям встроенной микропрограммы (необработанные исключения, переполнение стека, доступ к недопустимым ячейкам памяти, повреждение SRAM из-за нестабильного источника питания, и т. д.). Более того, если WDT может предупредить нас, когда истекает таймер, мы можем попытаться восстановить регулярные действия микропрограммы или, по крайней мере, перевести устройство в безопасное состояние.

Микроконтроллеры STM32 предоставляют два независимых друг от друга сторожевых таймера: Независимый сторожевой таймер (Independent Watchdog, IWDG) и системный Оконный сторожевой таймер (System Window Watchdog, WWDG). Они обладают почти одинаковыми характеристиками, за исключением нескольких, которые делают один таймер более подходящим, чем другой, в некоторых специфических приложениях. В данной главе показано, как использовать CubeHAL для программирования этих двух важных и часто неэффективно используемых периферийных устройств.

17.1. Независимый сторожевой таймер

IWDG – это 12-разрядный таймер нисходящего отсчета, тактируемый низкочастотным внутренним (LSI) генератором: это объясняет прилагательное «независимый», означающее, что данное периферийное устройство не питается от периферийного тактового

1Автор книги предпочитает менее известный закон Смита, который гласит: «Мерфи был оптимистом».

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

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

457

сигнала, который, в свою очередь, генерируются от HSIили HSE-генераторов. Это важная характеристика, которая позволяет таймеру IWDG работать даже в случае сбоя основного тактового сигнала: сторожевой таймер продолжает отсчитывать, даже если процессор остановлен, и при достижении нуля он сбрасывает микроконтроллер. Если микропрограмма разработана правильно, предусматривая решение данной проблемы, микроконтроллер может восстановиться после сбоя тактового генератора с помощью внутреннего генератора (HSI).

В семействах STM32F0/F3/F7/L0/L4 данный таймер может работать в оконном режиме (windowed mode). Это означает, что мы можем установить временное окно (в диапазоне от 0x0 до 0xFFF), которое задает, когда можно обновить счетчик таймера. Если мы обновим таймер до того, как счетчик достигнет значения «окна» (window value), микроконтроллер будет сброшен таким же образом, как и при достижении таймером нуля. Это позволяет гарантировать, что «действия» выполняются в правильном направлении, особенно когда микроконтроллер выполняет повторяющиеся задачи, которые работают в четко определенном временном окне (temporal window).

Сколько времени отсчитывает таймер IWDG до сброса микроконтроллера? Следующая формула устанавливает частоту событий обновления таймера IWDG:

 

(2

IWDG

PSC

)(Период +1)

 

 

Событие обновления IWDG =

Тактовый сигнал LSI

 

[1]

где Период задается в диапазоне от 0 до 4095, а IWDGPSC соответствует отдельному 3-раз- рядному предделителю, который задается в диапазоне от 2 до 8. Например, если пред-

положить, что LSI-генератор работает на частоте 32 кГц, Период равен 0xFFF, а

IWDGPSC

равен 2, мы получим, что таймер IWDG обнулится после:

 

 

 

2

)(4096)

 

 

Событие обновления IWDG =

(2

 

0,5 с

 

 

32000

 

 

 

 

 

Таймер IWDG также поддерживает функцию аппаратного сторожевого таймера

(hardware watchdog feature). Специальный бит области байтов конфигурации (option bytes)

– области Flash-памяти, которую мы изучим в Главе 21, конфигурирует таймер так, чтобы он автоматически запускал отсчет после каждого системного сброса.

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

17.1.1.Использование CubeHAL для программирования таймера IWDG

Для манипулирования периферийным устройством IWDG HAL объявляет структуру Си IWDG_HandleTypeDef, которая определена следующим образом:

typedef struct {

 

 

 

 

 

 

IWDG_TypeDef

*Instance;

/* Указатель

на дескриптор IWDG

*/

IWDG_InitTypeDef

Init;

/*

Параметры

инициализации

IWDG

*/

HAL_LockTypeDef

Lock;

/*

Блокировка объекта IWDG

 

*/

3 В Главе 19 об управлении питанием мы увидим, как устранить данное ограничение