Сторожевой таймер AT91SAM7X Печать
Добавил(а) microsin   

Сторожевой таймер (Watchdog Timer, WDT) может использоваться для предотвращения зависания системы, если её программа попадет в глухую блокировку (deadlock).

WDT основан на 12-битном, считающим вниз счетчике, на котором можно задать сторожевой период (watchdog period) до 16 секунд (счетчик тактируется медленными тактами 32.768 кГц). WDT может генерировать общий сброс или сброс только процессора. Дополнительно WDT может быть остановлен, если процессор находится в режиме отладки (debug mode) или в режиме ожидания (idle mode).

AT91SAM7X Watchdog Timer Block Diagram fig16 1

Рис. 16-1. Блок схема WDT.

[Функциональное описание WDT]

Watchdog Timer (WDT) получает питание от VDDCORE и перезапускается при сбросе процессора. 12-битный, считающий вниз счетчик WDT загружается значением, определенным в поле WV регистра режима (Mode Register, WDT_MR). WDT использует использует медленную тактовую частоту (Slow Clock), поделенную на 128, чтобы установить максимальный сторожевой период 16 секунд (типовая частота Slow Clock составляет 32.768 кГц).

После сброса процессора значение WV будет 0xFFF, что соответствует максимальному значению счетчика с разрешенной генерацией внешнего сброса (поле WDRSTEN в значении 1 после Backup Reset). Это означает, что по умолчанию WDT работает после сброса, т. е. после включения питания. Пользователь должен либо запретить WDT (установкой бита WDDIS в WDT_MR), если он не хочет его использовать, либо должен перепрограммировать WDT так, чтобы его максимальный сторожевой период соответствовал требованию приложения.

Регистр режима (Watchdog Mode Register, WDT_MR) можно записать только один раз. Сбросить WDT_MR может только сброс процессора. Запись регистра WDT_MR перезагружает WDT новыми запрограммированными параметрами режима.

Если WDT был перезапущен записью в регистр WDT_CR, то регистр WDT_MR не должен быть запрограммирован в течение 3 периодов Slow Clock после момента записи в WDT_CR. В любом случае программирование нового значения в WDT_MR автоматически инициирует инструкцию рестарта.

При нормальном функционировании пользовательская программа перезагружает WDT с регулярными интервалами до того, как произойдет его переполнение, путем записи регистра управления (Control Register, WDT_CR) с битом WDRSTT в значении 1. Тогда WDT немедленно перезагружается значением из WDT_MR и перезапускается, и также сбрасывается и перезапускается делитель на 128 Slow Clock. Регистр WDT_CR имеет защиту от записи, поэтому его нельзя случайно записать без специальной защитной процедуры. Для корректной записи WDT_CR предусмотрен специальный, жестко заданный ключ доступа. Если программа не успела перезагрузить WDT в течение запрограммированного защитного периода, то передается сигнал wdt_fault в контроллер сброса (Reset Controller), если установлен бит WDRSTEN в Mode Register (WDT_MR). Кроме того, установится бит WDUNF в регистре состояния Watchdog Status Register (WDT_SR).

Чтобы предотвратить срабатывание WDT из-за зависания программы, перезагрузка WDT должна произойти в окне времени между значениями счетчика от 0 до WDD, где WDD определяется регистром режима (WatchDog Mode Register, WDT_MR).

Любая попытка перезапустить WDT, когда его счетчик находится между значениями WDV и WDD, приведет к ошибке WDT, даже если WDT запрещен. Бит WDERR обновится в WDT_SR, и будет выставлен сигнал wdt_fault в контроллер сброса (Reset Controller).

Обратите внимание, что эта функция может быть запрещена путем программирования значения WDD, которое будет больше или равно значению WDV. В такой конфигурации перезапуск WDT разрешен во всем диапазоне его счетчика [0; WDV] без генерации ошибки. Это конфигурация по умолчанию после сброса (значения WDD и WDV равны).

Установка бит состояния WDUNF (Watchdog Underflow) и WDERR (Watchdog Error) приведет к срабатыванию прерывания, если установлен бит WDFIEN в регистре режима WDT_MR. Сигнал wdt_fault для контроллера сброса приведет к сбросу WDT, если установлен бит WDRSTEN, как это было указано в описании процедуры программирования контроллера сброса (Reset Controller, RSTC [1]). В этом случае сбрасываются процессор и WDT, и сбросятся флаги WDERR и WDUNF.

Если был сгенерирован сброс, или если был прочитан регистр WDT_SR, то биты состояния сбрасываются, прерывание очищается, и сигнал wdt_fault в контроллер сброса не выдается.

Запись в WDT_MR перезагружает и перезапускает счетчик WDT.

Когда процессор находится в состоянии отладки (debug state) или режиме ожидания (idle mode), счетчик WDT может быть остановлен. Это зависит от значения, запрограммированного в биты WDIDLEHLT и WDDBGHLT регистра режима WDT_MR.

AT91SAM7X Watchdog Behavior fig16 2

Рис. 16-2. Поведение WDT.

Диаграмма на рис. 16-2 показывает алгоритм работы WDT. Черными кружками помечены аварийные ситуации для программы (Watchdog Fault), которые приводят к срабатыванию WDT и сбросу системы.

[Регистры WDT]

Интерфейс пользователя WDT составляют три 32-битных регистра, показанные в таблице 16-1. В столбце "Смещение" указано смещение относительно базового адреса AT91C_BASE_WDTC (0xFFFFFD40).

Таблица 16-1. Карта памяти регистров Watchdog Timer (WDT).

Смещение Регистр Мнемоника Доступ(1) Значение после сброса
0x00 Control Register (регистр управления) WDT_CR WO -
0x04 Mode Register (регистр режима) WDT_MR RW(2) 0x3FFF2FFF
0x08 Status Register (регистр состояния) WDT_SR RO 0x00000000

Примечания:

(1) WO означает только запись (Write Only), RW означает чтение и запись (Read Write), RO означает только чтение (Read Only).
(2) Запись в течение работы программы после сброса можно осуществить не более одного раза.

Watchdog Timer Control Register (WDT_CR)

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
KEY - - - - - - -
-
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
-
- - - - - - - - - - - - - - WDRSTT

WDRSTT: Watchdog Restart

0 не оказывает эффекта.
1 перезапускает сторожевой таймер, он начинает заново считать вниз от значения поля WDD в регистре WDT_MR.

KEY: Password

Специальное защитное поле, предназначенное для предотвращения случайного доступа на запись к регистру WDT_CR. В поле KEY должно быть записано значение 0xA5. Запись сюда любого другого значения отменит операцию записи (т. е. установка бита WDRSTT не приведет к перезапуску WDT).

Watchdog Timer Mode Register (WDT_MR)

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
- - WDIDLEHLT WDDBGHLT WDD
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
WDDIS WDRPROC WDRSTEN WDFIEN WDV

WDV: Watchdog Counter Value

Определяет значение, загруженное в 12-битный счетчик WDT (Watchdog Counter).

WDFIEN: Watchdog Fault Interrupt Enable

0 Событие сторожевого таймера Watchdog Fault (переваливание через 0 или ошибка, underflow или error) не приведет к прерыванию.
1 Событие сторожевого таймера (underflow или error) выставит запрос на прерывание.

WDRSTEN: Watchdog Reset Enable

0 Событие сторожевого таймера (underflow или error) не приводит к сбросу (т. е. WDT отключен).
1 Событие сторожевого таймера (underflow или error) приведет к сбросу Watchdog reset (т. е. WDT работает и следит за поведением программы).

WDRPROC: Watchdog Reset Processor

0 если WDRSTEN == 1, то Watchdog fault (underflow или error) сбросит все (и аппаратуру, и процессор).
1 если WDRSTEN == 1, то Watchdog fault (underflow или error) активирует сброс процессора.

WDD: Watchdog Delta Value

Определяет разрешенное окно времени (значения счетчика) для перезагрузки WDT. Если в момент записи WDT_CR с WDRSTT = 1 значение счетчика WDT меньше или равно WDD, то эта запись перезапустит таймер (это должна при нормальной работе делать программа, чтобы предотвратить сброс системы). Если значение счетчика WDT больше WDD, то запись WDT_CR с WDRSTT = 1 приведет к ошибке Watchdog error.

WDDBGHLT: Watchdog Debug Halt

0 WDT работает, когда процессор находится в режиме отладки (debug state).
1 WDT остановлен, когда процессора находится в режиме отладки.

WDIDLEHLT: Watchdog Idle Halt

0 WDT работает, когда система находится в режиме ожидания (idle mode).
1 WDT остановлен, когда система находится в режиме ожидания.

WDDIS: Watchdog Disable

0 разрешает работу WDT.
1 запрещает работу WDT.

Watchdog Timer Status Register (WDT_SR)

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
- - - - - - - - - - - - - - -
-
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
-
- - - - - - - - - - - - - WDERR WDUNF

WDUNF: Watchdog Underflow

0 с момента последнего чтения WDT_SR не было события перехода через 0 счетчика (Watchdog underflow).
1 как минимум один Watchdog underflow произошел с момента последнего чтения WDT_SR.

WDERR: Watchdog Error

0 с момента последнего чтения WDT_SR не было события ошибки WDT (Watchdog error).
1 как минимум одна ошибка WDT (Watchdog error) произошла с момента последнего чтения WDT_SR.

[Ссылки]

1. SAM7X512 / SAM7X256 / SAM7X128 DATASHEET site:microchip.com.
2. Сторожевой таймер (WatchDog, WDT) в микроконтроллерах ARM AT91SAM7X.