STM32: сторожевые таймеры (WDT)

В статье приведено описание сторожевых таймеров 32-разрядных ARM-микроконтроллеров серии STM32 от компании STMicroelectronics. Рассмотрена архитектура и состав регистров сторожевых таймеров, а также приведены практические примеры программ.

Рис. 1. Функциональная схема сторожевого таймера IWDG
Рис. 1. Функциональная схема сторожевого таймера IWDG

Введение
Все микропроцессорные устрой­ства подвержены влиянию различ­ных помех, которые могут нарушить их работу и даже привести к «зависа­нию» программы. Это в свою очередь приводит к останову системы управле­ния и может повлечь за собой крайне опасные ситуации. Источниками помех могут являться различные коммутационные устрой­ства в питающей сети, воздействие электромагнитных полей, атмосфер­ные явления в виде разрядов молний и тому подобное. Защититься от подоб­ных помех не всегда возможно, поэтому в случае «зависания» процессора необ­ходимо автоматически восстановить его работу, например, путём переза­пуска. Это позволит восстановить рабо­ту системы и обеспечит высокий уро­вень безопасности систем. В своё время разработчики процессо­ров решили эту задачу с помощью сто­рожевых таймеров, получивших назва­ние «сторожевая собака». Идея решения заключается в том, что сторожевой тай­мер инициализируется и запускается самим процессором в начале работы программы. После чего данный таймер самостоятельно отсчитывает заданное время, и если в течение этого времени процессор ни разу не перезагрузит его, то таймер обнулится и перезапу­стит процессор. Таким образом, при нормальной работе процессора тай­ мер будет регулярно перезапускаться, а в случае «зависания» процессора тай­ мер через заданное время сформирует сигнал сброса для процессора и пере­ запустит его. Микроконтроллеры серии STM32 [1] имеют два таких таймера. Один из них называется «независимый сторожевой таймер» (Independent Watchdog, IWDG), а другой – «оконный сторожевой тай­ мер» (Window Watchdog, WWDG). Рас­ смотрим каждый из них отдельно.

Независимый сторожевой таймер
Таймер IWDG тактируется специали­зированным низкочастотным сигналом LSI, благодаря чему он продолжает работу, даже если пропадает системный тактовый сигнал. Таймер осуществля­ет обратный отсчёт от заданного зна­чения до нуля. Сброс процессора тай­ мер производит при достижении счёт­чиком таймера нуля. Этот таймер лучше всего подходит для тех приложений, которым необ­ходимо, чтобы сторожевой таймер был запущен как полностью независи­мый процесс, вне основного приложе­ния, но у которого были бы не слишком высокие требования к временным пара­ метрам. Функциональная схема неза­висимого сторожевого таймера IWDG приведена на рисунке 1. Таймер IWDG запускается путём записи значения 0xCCCC в ключевой регистр IWDG_KR. Счётчик таймера начинает обратный отсчёт от значе­ния, заданного в регистре перезагрузки IWDG_RLR. По умолчанию этот регистр имеет значение 0xFFF. Когда счётчик досчитает до нуля, формируется сиг­нал сброса для процессора от тайме­ра IWDG. Каждый раз, когда в ключевой регистр IWDG_KR записывается зна­чение 0xAAAA, данные из регистра IWDG_RLR перегружаются в счётчик, что возобновляет отсчёт и предотвра­щает сброс процессора от IWDG. Если с помощью соответствующих битов конфигурации разрешена функ­ция «аппаратный сторожевой таймер», то сторожевой таймер автоматически запускается после подачи питания. Регистр предварительного делителя IWDG_PR позволяет программно задать коэффициент деления тактовой часто­ ты для сторожевого таймера IWDG. По умолчанию регистры IWDG_PR и IWDG_RLR защищены от записи. Пре­жде чем изменить их значения, необ­ходимо записать код 0x5555 в регистр IWDG_KR. Запись в ключевой регистр любого другого значения снова забло­кирует запись в регистры IWDG_PR и IWDG_RLR. Период таймера вычисляется при помощи формулы:

T=((4*2^IWDG_PR)* IWDG_RLR)/40 [мс].

Определить период отсчёта стороже­вого таймера для тактовой частоты 40 кГц  IWDG можно также с помощью таблицы 1.

Таблица 1. Минимальное и максимальное значения периода сторожевого таймера
Таблица 1. Минимальное и максимальное значения периода сторожевого таймера

В связи с нестабильностью внутрен­него RC генератора микроконтролле­ра, указанные в таблице значения вре­мени могут незначительно отличаться от реальных. Регистр статуса IWDG_SR позволяет определить, какие операции выполня­ет таймер в текущий момент. Когда микроконтроллер входит в режим отладки и его ядро останав­ливается, счётчик IWDG либо продол­жает работать, либо останавливается, в зависимости от конфигурационного бита DBG_IWDG_STOP в модуле DBG.

Регистры независимого сторожевого таймера

Карта регистров сторожевого тайме­ра IWDG приведена в таблице 2.

Таблица 2. Карта регистров IWDG и их значения после сброса
Таблица 2. Карта регистров IWDG и их значения после сброса

Ключевой регистр IWDG_KR имеет 16 бит для ключа KEY[15:0]. В эти биты программа должна регулярно записы­вать ключевое значение 0xAAAA, иначе сторожевой таймер произведёт сброс, когда счётчик достигнет значения 0. Запись ключевого значения 0x5555 в этот регистр разрешает доступ к реги­страм IWDG_PR и IWDG_RLR. Запись ключевого значения 0xCCCC запуска­ет сторожевой таймер, кроме случая, когда он уже запущен в режиме «аппа­ратный сторожевой таймер». Регистр предварительного делите­ ля IWDG_PR содержит три бита PR[2:0], которые задают коэффициент деления частоты сторожевого таймера. Изме­нить значение IWDG_PR можно толь­ ко тогда, когда бит PVU регистра IWDG_ SR сброшен. Соответствие между зна­чением бит PR[2:0] регистра IWDG_PR и коэффициент деления частоты сторо­жевого таймера приведены в таблице 1. При чтении этого регистра его зна­чение может быть некорректным, если операция чтения производится тог­ да, когда предыдущая операция запи­си в этот регистр ещё не завершилась. По этой причине значение, прочи­танное в этом регистре, действитель­но только тогда, когда бит PVU в реги­стре IWDG_SR сброшен. Регистр перезагрузки IWDG_RLR име­ет 12 бит RL[11:0], которые позволяют записать в него значение от 0 до 0xFFF. Это значение будет перезагружаться в счётчик сторожевого таймера каж­дый раз при записи значения 0xAAAA в регистр ключа IWDG_KR. Период тай­ мера вычисляется на основе этого зна­чения и тактовой частоты после пред­варительного делителя. Для того что­ бы изменить или прочитать значение регистра перезагрузки, необходимо убедиться, что бит RVU регистра IWDG_ SR сброшен. Регистр статуса IWDG_SR имеет два информационных бита. Бит 1 RVU устанавливается аппаратно и указывает, что идёт процесс обновле­ния значения перезагрузки. Очищается он аппаратно, когда операция обновле­ния значения перезагрузки завершена. Данная операция занимает до 5 циклов RC генератора на частоте 40 кГц. Зна­чение регистра перезагрузки можно обновлять только при сброшенном бите RVU. Бит 0 PVU устанавливается аппаратно и указывает, что идёт процесс обновле­ния значения предварительного дели­теля. Очищается он аппаратно, когда операция обновления значения предва­рительного делителя закончена. Данная операция также занимает до 5 циклов RC генератора на частоте 40 кГц. Зна­чение предварительного делителя мож­но обновлять только при сброшенном бите PVU. Если приложение использует несколько значений перезагрузки или предварительного делителя, то, прежде чем изменить значение перезагрузки, необходимо ждать, пока не будет сбро­шен бит RVU. Также, прежде чем изме­нить значение предварительного дели­теля, следует ждать, пока не будет сбро­шен бит PVU. Однако, после обновления значе­ния предварительного делителя или перезагрузки, необходимости анали­зировать состояние бит RVU и PVU, прежде чем продолжить выполнение кода, нет. Операция записи будет при­нята к исполнению и завершена даже в случае перехода в режим низкого потребления.

Примеры программ для независимого сторожевого таймера
В листинге 1 приведён пример функ­ций для работы с таймером IWDG. Ком­ментарии позволяют понять назна­чение всех операций, выполняемых в этой программе. Используя данные функции, задей­ствовать в программе сторожевой тай­ мер IWDG и осуществлять управление им не составит труда.

Листинг 1
// Функция инициализации сторожевого таймера IWDG
void Init_IWDG(u16 tw) // Параметр tw от 7мс до 26200мс
{
// Для IWDG_PR=7 Tmin=6,4мс RLR=Tмс*40/256
IWDG->KR=0x5555; // Ключ для доступа к таймеру
IWDG->PR=7; // Обновление IWDG_PR
IWDG->RLR=tw*40/256; // Загрузить регистр перезагрузки
IWDG->KR=0xAAAA; // Перезагрузка
IWDG->KR=0xCCCC; // Пуск таймера
}
// Функция перезагрузки сторожевого таймера IWDG
void IWDG_res(void)
{
IWDG->KR=0xAAAA; // Перезагрузка
}

Оконный сторожевой таймер
Таймер WWDG лучше всего подхо­дит для тех приложений, которые тре­буют, чтобы сторожевой таймер реаги­ровал на перезапуск в пределах точно­ го промежутка времени, то есть окна времени. Таймер тактируется сигналом, полученным делением сигнала такто­вой частоты PCLK1 с шины APB1. Он имеет конфигурируемое окно времени, которое служит для пере­ загрузки сторожевого таймера, и может быть задан так, чтобы обнаружи­вать неправильное поведение прог­раммы, в виде запаздывания или опе­режения в работе. Обычно этот сторожевой таймер используется для того, чтобы обнару­живать возникновение некорректной работы программного обеспечения, вызванное внешним вмешательством или непредвиденными логическими условиями, которые заставляют при­кладную программу отклоняться от своего нормального алгоритма. Функциональная схема оконного сторожевого таймера WWDG приведе­на на рисунке 2.

Рис. 2. Функциональная схема сторожевого таймера WWDG
Рис. 2. Функциональная схема сторожевого таймера WWDG

Фактически оконный сторожевой таймер является расширен­ ной версией традиционного встраива­емого сторожевого таймера. Оконный сторожевой таймер пред­ставляет собой 7-битный вычитающий счётчик, тактируемый сигналом PCLK1, поделённым на 4096 с помощью аппа­ратного 12-битного предварительного делителя и программно управляемого делителя от 1 до 8. Оконный сторожевой таймер акти­вируется путём установки бита WDGA в регистре WWDG_CR. С этого момен­та его нельзя отключить, за исключе­нием общего сброса. После активиза­ции сторожевой таймер начинает счёт в обратном направлении и генерирует сброс при изменении состояния счёт­чика с 0x40 на 0x3F, то есть при обнуле­нии шестого разряда таймера, условно обозначаемого как T6. Если программа перегружает счётчик, когда его значе­ние больше, чем значение в регистре окна времени, это также инициирует сброс. Чтобы предотвратить сброс процес­сора, прикладная программа, во время нормальной операции, должна регу­лярно производить запись в регистр WWDG_CR. Эта операция должна про­ изводиться только тогда, когда значе­ние счётчика меньше, чем значение в регистре окна времени. Значение, которое можно записать в регистр WWDG_CR, должно быть в пределах 0xFF…0x40. Счётчик таймера WWDG является автономным. Он всегда производит обратный отсчёт. Даже тогда, когда сто­рожевой таймер отключён. При вклю­чении сторожевого таймера необхо­димо установить бит T6 счётчика, что­ бы предотвратить немедленный сброс процессора. Биты T[5:0] содержат число, которое представляет собой временную задержку до сброса от WWDG. Регистр конфигурации WWDG_CFR содержит верхний предел окна време­ни. Чтобы предотвратить сброс, обрат­ный счётчик должен быть перезагру­жен тогда, когда его значение меньше, чем значение регистра окна времени, но больше 0x3F. На рисунке 3

Рис. 3. Временна′я диаграмма сторожевого таймера WWDG
Рис. 3. Временна′я диаграмма сторожевого таймера WWDG

представлена временна′я диаграмма, демонстрирующая окон­ный процесс работы сторожевого тай­ мера. Другой способ перезагрузить счётчик состоит в том, чтобы использовать пре­рывание от раннего пробуждения. Это прерывание разрешается установкой бита EWI в регистре WWDG_CFR. Ког­да обратный счётчик достигает значе­ния 0x40, генерируется прерывание от раннего пробуждения, и можно исполь­зовать соответствующий обработчик, чтобы перезагрузить счётчик и предот­вратить сброс от WWDG. Запрос этого прерывания очищает­ся записью нуля в разряд EWIF регистра WWDG_SR. При необходимости можно сгенери­ровать программный сброс процессо­ра путём установки в единичное состо­яние бита WDGA и сбросив бит T6. В таблице 3 приведён диапазон зна­чений периода таймера WWDG для тактовой частоты сигнала PCLK рав­ной 24 МГц, в зависимости от установ­ленных значений регистров таймера.

Таблица 3. Диапазон значения периода таймера WWDG
Таблица 3. Диапазон значения периода таймера WWDG

Для более точного расчёта периода необходимо использовать следующую формулу:

Twwdg = Tpclk1 * 4096 * 2^WDGTB * (T[5:0]+1).

Чтобы избежать немедленного сброса процессора, при записи данных в регистр WWDG_CR необходимо устанавливать бит T6 в единичное состояние. Когда микроконтроллер входит в режим отладки, счётчик WWDG будет продолжать работать или останавлива­ется, в зависимости от конфигураци­онного бита DBG_WWDG_STOP в модуле DBG.

Регистры оконного сторожевого таймера
Сторожевой таймер WWDG имеет три регистра. Карта этих регистров приве­дена в таблице 4.

Таблица 4. Карта регистров WWDG и их значения после сброса
Таблица 4. Карта регистров WWDG и их значения после сброса

Регистр управления WWDG_CR содержит бит WDGA для активации тай­ мера и 7-разрядный счётчик T[6:0]. Бит WDGA устанавливается программно, а очищается аппаратно, только путём общего сброса. Когда WDGA равен 1, сторожевой таймер включён и может производить сброс. С появлением каж­дого тактового импульса счётчик T[6:0] уменьшает своё значение на единицу. Сброс генерируется, когда счётчик меняет значение с 0x40 на 0x3F, то есть при обнулении разряда T6. Регистр конфигурации WWDG_CFR содержит три бита для настройки тай­ мера и 7 разрядов W[6:0] для установки окна времени. Разряд 9 EWI служит для разреше­ния прерывания раннего пробужде­ния процессора. Если он установлен, то при достижении счётчиком значения 0x40 генерируется прерывание. Обну­ляется этот бит аппаратно, путём обще­ го сброса микроконтроллера. Биты 8 и 7 группы WDGTB[1:0] назна­чают коэффициент дополнительно­ го деления частоты входного сигнала счётчика.
Они могут иметь следующие значения:
● 00 – деление на 1;
● 01 – деление на 2;
● 10 – деление на 4;
● 11 – деление на 8.

Разряды W[6:0] организуют 7-битное значение окна времени, с которым срав­нивается значение обратного счётчика. Регистр статуса WWDG_SR содержит всего один бит статуса EWIF, представ­ляющий собой флаг прерывания про­буждения процессора. Этот бит прини­мает единичное значение аппаратно, когда счётчик достигает значения 0x40 и тогда, когда прерывание выключено. Очищается он программно, записью в него нулевого значения. Запись в этот разряд значения 1 эффекта не имеет.

Примеры программ для оконного сторожевого таймера
В листинге 2 приведены функции для работы с таймером WWDG с коммента­риями, позволяющими понять назна­чение всех операций, выполняемых в этой программе. С помощью таких несложных функ­ций можно организовать контроль работы программы, обеспечивая тем самым защиту от сбоев. Подробнее ознакомиться с таймерами микро­контроллера STM32 можно на сайте STMicroelectronics [2].

Листинг 2
// Функция инициализации сторожевого таймера WWDG
void WWDG_Init(void)
{
// Инициализация прерывания
NVIC->ISER[0] |= NVIC_ISER_SETENA_0;
// Инициализация таймера WWDG
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; // Включить тактирование WWDG
WWDG->CFR |= WWDG_CFR_WDGTB0; // Задать частоту тактирования WWDG
WWDG->CFR |= 0x41; // Задать окно
WWDG->CR |= 0x7F; // Разрешить работу WWDG и установить начальное
значение
WWDG->SR &=~WWDG_SR_EWIF; // Очистить флаг EWI
WWDG->CFR |=WWDG_CFR_EWI; // Разрешить прерывания
}
// Функция обработки прерывания сторожевого таймера WWDG
void WWDG_IRQHandler(void)
{
WWDG->CR |= 0x7F; // Обновить значение таймера WWDG
WWDG->SR &=~WWDG_SR_EWIF; // Очистить флаг EWI
// Другие действия …
}
// Функция запуска сторожевого таймера WWDG
void WWDT_ON(void)
{
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; // Включить тактирование WWDG
WWDG->CR |= 0x7F; // Обновить значение таймера WWDG
WWDG->SR &=~WWDG_SR_EWIF; // Очистить флаг EWI
}
// Функция останова сторожевого таймера WWDG
void WWDT_OFF(void)
{
RCC->APB1ENR |= RCC_APB1ENR_WWDGRST; // Отключить тактирование WWDG
}

Источник: современная электроника ◆ № 5 2015

 

  • Сергей

    Спасибо за хорошую, понятную и нужную статью.

  • http://remontokna.com.ua remontokna.com.ua

    Микросхема Texas Instruments TPS3126 одновременно выполняет функции монитора напряжения питания и сторожевого таймера.