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

Таймеры

293

Микроконтроллер STM32F410RB, представленный на рынке в начале 2016 года, реализует функцию, характерную для серии STM32L0/L4: таймер с пониженным энергопотреблением.

При работе с таймерами важно иметь прагматичный подход. В противном случае достаточно легко потеряться в их параметрах и в соответствующих процедурах HAL (модули HAL_TIM и HAL_TIM_EX являются одними из наиболее четко сформулированных в CubeHAL). По этой причине мы начнем изучать, как использовать базовые таймеры, функции которых также являются общими для более продвинутых таймеров STM32.

Таблица 3: Какие таймеры реализованы в каждом микроконтроллере STM32 из шестнадцати плат

Nucleo

11.2. Базовые таймеры

Базовые таймеры TIM6, TIM7 и TIM188 – самые простые таймеры, доступные в ассортименте STM32. Даже если они не предоставляются всеми микроконтроллерами STM32, важно подчеркнуть, что таймеры STM32 спроектированы так, что более продвинутые таймеры реализуют те же функции (таким же образом), что и менее мощные, как

8 Базовый таймер TIM18 доступен только в микроконтроллерах STM32F37x.

Таймеры

294

показано на рисунке 1. Это означает, что вполне возможно использовать таймер общего назначения так же, как и базовый таймер. CubeHAL также отражает эту аппаратную реализацию: базовые операции для всех таймеров выполняются с использованием функ-

ций HAL_TIM_Base_XXX.

Рисунок 1: Отношение между тремя основными категориями таймеров

На каждый таймер ссылаются с использованием экземпляра структуры Си TIM_HandleTypeDef, которая определена следующим образом:

typedef struct {

 

 

 

TIM_TypeDef

*Instance;

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

*/

TIM_Base_InitTypeDef

Init;

/* Требуемые параметры TIM для генерации

 

 

 

временного отсчета

*/

HAL_TIM_ActiveChannel

Channel;

/* Активные каналы

*/

DMA_HandleTypeDef

*hdma[7];

/* Массив дескрипторов DMA

*/

HAL_LockTypeDef

Lock;

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

*/

__IO HAL_TIM_StateTypeDef

State;

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

*/

} TIM_HandleTypeDef;

 

 

 

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

Instance (экземпляр): указатель на дескриптор таймера (TIM), который мы будем

использовать. Например, TIM6 является одним из базовых таймеров, доступных в большинстве микроконтроллеров STM32.

Init: это экземпляр структуры Си TIM_Base_InitTypeDef, которая используется для

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

Channel: определяет количество активных каналов в таймерах, обеспечивающих

один или несколько входных/выходных каналов (это не относится к базовым таймерам). Оно может принимать одно или несколько значений из перечисления enum HAL_TIM_ActiveChannel, и мы изучим его использование в следующем параграфе.

*hdma[7]: это массив, содержащий указатели на дескрипторы DMA_HandleTypeDef

для запросов к DMA, связанных с таймером. Как мы увидим позже, таймер может генерировать до семи запросов к DMA, используемых для управления его функциями.

Таймеры

295

State (состояние): используется внутри HAL для отслеживания состояния тай-

мера.

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

typedef struct {

 

 

uint32_t Prescaler;

/* Задает значение предделителя, используемое

 

 

для деления тактового сигнала TIM.

*/

uint32_t CounterMode;

/* Задает режим отсчета.

*/

uint32_t Period;

/* Задает значение периода, которое будет загружено

 

 

в активный регистр автоперезагрузки (ARR) при

 

 

следующем событии обновления.

*/

uint32_t ClockDivision;

/* Задает делитель тактового сигнала таймера.

*/

uint32_t RepetitionCounter; /* Задает значение кратности отсчетов счетчика.

*/

} TIM_Base_InitTypeDef;

 

 

Prescaler (предделитель): делит тактовый сигнал таймера на коэффициент в диа-

пазоне от 1 до 65535 (это означает, что регистр предделителя имеет 16-разрядное разрешение). Например, если шина, к которой подключен таймер, работает на частоте 48 МГц, то значение предделителя, равное 48, понижает частоту отсчета до 1 МГц.

CounterMode (режим отсчета): задает направление отсчета таймера и может при-

нимать одно из значений из таблицы 4. Некоторые режимы отсчета доступны только для таймеров общего назначения и расширенного управления. Для базовых

таймеров определяется только TIM_COUNTERMODE_UP.

Period (период): задает максимальное значение счетчика таймера, прежде чем он

повторно перезапустит отсчет. Он может принимать значение от 0x1 до 0xFFFF (65535) для 16-разрядных таймеров и от 0x1 до 0xFFFF FFFF для таймеров TIM2 и TIM5 в микроконтроллерах, реализующих их как 32-разрядные таймеры. Если

Period установлен в 0x0, таймер не запускается.

ClockDivision (делитель тактового сигнала таймера): это битовое поле задает со-

отношение деления между внутренним тактовым сигналом таймера и тактовой частотой дискретизации, используемых цифровыми фильтрами на выводах ETRx и TIx. Может принимать одно из значений из таблицы 5 и доступно только для таймеров общего назначения и расширенного управления. Мы будем изучать цифровые фильтры на входных выводах таймера позже в этой главе. Это поле также используется генератором мертвого времени (функция не описана в данной книге).

RepetitionCounter (кратность отсчетов счетчика): каждый таймер имеет специаль-

ный регистр обновления (update register), отслеживающий состояние переполнения/опустошения счетчика таймера. При этом также может генерироваться определенный IRQ, как мы увидим далее. RepetitionCounter сообщает, сколько раз таймеры переполнят/опустошат счетчик до того, как установится регистр обновления, и будет вызвано соответствующее событие (если разрешено). RepetitionCounter доступен только для таймеров расширенного управления.