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

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

 

458

__IO HAL_IWDG_StateTypeDef

State;

/* Состояние работы IWDG

*/

} IWDG_HandleTypeDef;

 

 

 

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

typedef struct {

 

 

 

 

 

 

uint32_t Prescaler;

/* Выбирает предделитель IWDG

 

*/

uint32_t

Reload;

/*

Задает

значение

перезагрузки счетчика IWDG

*/

uint32_t

Window;

/*

Задает

значение

«окна» для

сравнения со счетчиком

*/

} IWDG_InitTypeDef;

Давайте изучим поля данной структуры Си.

Prescaler: в данном поле задается предделитель, который может принимать зна-

чения всех степеней 2 в диапазоне от 22 до 28. Чтобы задать это значение, CubeHAL

определяет семь различных макросов – IWDG_PRESCALER_4, IWDG_PRESCALER_8, …, IWDG_PRESCALER_256.

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

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

Window: для тех микроконтроллеров STM32, которые предоставляют оконный IWDG

(windowed IWDG), это поле устанавливает соответствующее значение «окна», в пределах которого ему разрешено обновлять таймер. Может принимать значение в диапазоне от 0x0 до 0xFFF (значение по умолчанию).

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

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

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

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

17.2. Системный оконный сторожевой таймер

WWDG – это 7-разрядный таймер нисходящего отсчета, тактируемый сигналом от шины APB. В отличие от таймера IWDG, таймер WWDG предназначен для обновления в заданном временном окне, в противном случае он запускает сброс микроконтроллера. То, как работает таймер WWDG, может показаться немного нелогичным для новичков. Давайте пошагово объясним, как он работает.

WWDG является 7-разрядным таймером (см. рисунок 1). Его регистр счетчика может быть установлен от 0x7F до 0x40. Это значение будет использоваться для перезагрузки регистра счетчика при обновлении (мы будем называть это значение TS).

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

459

Рисунок 1: Содержимое регистра счетчика WWDG после сброса

Таймер WWDG обладает следующей особой характеристикой: когда 7-й бит счетчика (T6 на рисунке 1) переключается с 1 на 0, происходит системный сброс. Это означает, что, когда счетчик достигает значения TE = 0x3F, которое соответствует 01111112, микроконтроллер сбрасывается.

На WWDG подается основной тактовый сигнал шины APB. Тактовый сигнал делится предделителем, значение которого определяется фиксированным коэффициентом (4096) и программируемым коэффициентом согласно следующей формуле:

WWDG

i

,

где

0 i 3

= 4096 2

PSC

 

 

 

 

Например, предположим, что

WWDGPSC

= 4096·8, а тактовая частота шины APB равна

48 МГц, тогда мы получим, что счетчик уменьшается на 1 каждые 682,6 мкс.

Как было сказано ранее, таймер WWDG может обновляться только в пределах заданного временного окна – программируемого значения, которое может варьироваться от TS до 0x40: чем ближе к TS, тем шире окно. Например, если мы сконфигурируем регистр окна значением TW = 0x5F, мы можем заново обновить таймер WWDG только тогда, когда его счетчик отсчитает от 0x5F до 0x40. На рисунке 2 четко показана роль временного окна. Если мы попытаемся обновить таймер WWDG в серых областях, то есть между 0x7F и 0x60, или когда счетчик отсчитает ниже 0x3F, микроконтроллер будет сброшен.

Рисунок 2: Как временное окно определяет интервал счетчика, в течение которого разрешено обновлять таймер WWDG

Как долго длится временное окно? Оно определяется по следующей формуле:

WWDGОкно =

WWDGPSC (Период +1)

[2]

 

 

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

 

 

где

 

 

 

Период = TS − TW

[3]

 

Например, давайте предположим, что значение обновления счетчика (то есть TS) равно 0x7F, а значение окна (то есть TW) равно 0x5F. Кроме того, допустим, что частота шины APB равна 48 МГц, а программируемый коэффициент предделителя равен 8. Тогда мы получим следующее:

WWDGОкно =

4096 (23 ) (0x20 +1)

22,5 мс

48000000

MIN

 

 

 

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

460

Выражение представляет собой минимальный тайм-аут, который мы должны выждать, прежде чем сможем обновить счетчик WWDG. Напротив, максимальный тайм-аут представлен нижним и фиксированным значением 0x40. Используя снова [2], мы получим:

 

 

3

) (0x3F +1)

 

WWDG

=

4096 (2

43,6 мс

Окно

 

48000000

 

MAX

 

 

 

 

 

 

Это означает, что обновление таймера WWDG до 22,5 мс или после 43,6 мс с момента последнего обновления приведет к системному сбросу.

WWDG обладает еще одной важной характеристикой: когда счетчик достигает значения TI = 0x40 – всего за один «тик» до значения 0x3F, которое приведет к сбросу микроконтроллера, срабатывает специальный IRQ, если он разрешен. Это прерывание, назы-

ваемое прерыванием раннего пробуждения (Early Wakeup Interrupt, EWI), можно использо-

вать в конечном счете для обновления таймера WWDG или для перевода устройства в безопасное состояние. Специально предназначенная для этого ISR называется WWDG_IRQHandler(), и это первая ISR после пятнадцати исключений Cortex-M.

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

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

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

typedef struct {

 

 

 

WWDG_TypeDef

*Instance;

/* Указатель на дескриптор WWDG

*/

WWDG_InitTypeDef

Init;

/* Параметры инициализации WWDG

*/

HAL_LockTypeDef

Lock;

/* Блокировка объекта WWDG

*/

__IO HAL_WWDG_StateTypeDef

State;

/* Состояние работы WWDG

*/

} WWDG_HandleTypeDef;

 

 

 

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

typedef struct {

 

 

uint32_t Prescaler;

/* Выбирает предделитель WWDG

*/

uint32_t Window;

/* Задает значение «окна» для сравнения со счетчиком

*/

uint32_t Counter;

/* Задает значение перезагрузки счетчика WWDG

*/

uint32_t EWIMode;

/* Указывает, разрешено ли прерывание раннего пробуждения

 

 

WWDG или нет

*/

} WWDG_InitTypeDef;

 

 

Давайте изучим поля данной структуры Си.

Prescaler: в данном поле задается предделитель, который может принимать зна-

чения всех степеней 2 в диапазоне от 1 до 8. Чтобы задать это значение, CubeHAL определяет восемь различных макросов – WWDG_PRESCALER_1, WWDG_PRESCALER_2, …,

WWDG_PRESCALER_8.