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

Таймеры

321

Рисунок 13: Как сконфигурировать таймер в режиме ведомого

Вместо этого чтобы включить режим ведущего, мы должны выбрать этот режим в представлении конфигурации таймера, как показано на рисунке 14. После выбора режима ведущего можно выбрать событие источника TRGO (TRGO source event).

Рисунок 14: Как сконфигурировать таймер в режиме ведущего

11.3.3.Программная генерация связанных с таймером событий

Таймеры обычно генерируют события при выполнении определенного условия. Например, они генерируют событие обновления (UEV), когда регистр счетчика (CNT) совпадает со значением Period. Тем не менее, мы можем заставить таймер генерировать определенное событие программно. Каждый таймер предоставляет специальный регистр, называемый генератором события (Event Generator, EGR). Некоторые биты этого регистра используются для срабатывания события, связанного с таймером. Например, первый бит, называемый генератором обновления (Update Generator, UG), когда он установлен, позволяет генерировать событие UEV. Этот бит автоматически сбрасывается после генерации события.

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

HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim,

uint32_t EventSource);

Таймеры

322

которая принимает указатель на дескриптор таймера и генерируемое событие. Параметр EventSource может принимать одно из значений таблицы 15.

Таблица 15: Программно-инициируемые события

Источник события

Описание

TIM_EVENTSOURCE_UPDATE

Источник события – Обновление таймера

TIM_EVENTSOURCE_CC1

Источник события – Захват/Сравнение 1 таймера

TIM_EVENTSOURCE_CC2

Источник события – Захват/Сравнение 2 таймера

TIM_EVENTSOURCE_CC3

Источник события – Захват/Сравнение 3 таймера

TIM_EVENTSOURCE_CC4

Источник события – Захват/Сравнение 4 таймера

TIM_EVENTSOURCE_COM

Источник события – Подключение таймера (Timer COM)

TIM_EVENTSOURCE_TRIGGER

Источник события – Запуск таймера

TIM_EVENTSOURCE_BREAK

Источник события – Вход сброса таймера (Timer Break)

TIM_EVENTSOURCE_UPDATE играет две важные роли. Первая связана с тем, как регистр Period (то есть регистр TIMx->ARR) обновляется при работе таймера. По умолчанию содержимое регистра ARR передается во внутренний теневой регистр (shadow register), когда генерируется событие TIM_EVENTSOURCE_UPDATE, если таймер не сконфигурирован иначе. Подробнее об этом позже.

Событие TIM_EVENTSOURCE_UPDATE также полезно, когда выход TRGO таймера, сконфигурированного в качестве ведущего, установлен в режиме TIM_TRGO_RESET: в этом случае ведомый таймер будет запускаться только в том случае, если регистр TIMx->EGR используется для генерации события TIM_EVENTSOURCE_UPDATE (то есть , бит UG установлен).

Следующий код показывает, как работает программная генерация событий (пример основан на микроконтроллере STM32F401RE). TIM3 и TIM4 – два таймера, сконфигурированные в режиме ведущего и ведомого соответственно. TIM4 сконфигурирован для работы в режиме ETR1 (то есть он тактируется ведущим таймером). TIM3 сконфигурирован для запуска выхода TRGO (который внутренне подключен к линии ITR2) при установке бита UG регистра TIM3->EGR. Наконец, мы генерируем событие UEV вручную каждые 200 мс из процедуры main().

int main(void) {

...

while (1) {

HAL_TIM_GenerateEvent(&htim3, TIM_EVENTSOURCE_UPDATE); HAL_Delay(200);

}

...

}

void MX_TIM3_Init(void){ TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig;

htim3.Instance = TIM3; htim3.Init.Prescaler = 65535;

htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 120;

htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

Таймеры

323

HAL_TIM_Base_Init(&htim3);

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

}

void MX_TIM4_Init(void) { TIM_SlaveConfigTypeDef sSlaveConfig;

htim4.Instance = TIM4; htim4.Init.Prescaler = 0;

htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 1;

htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim4);

sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; sSlaveConfig.InputTrigger = TIM_TS_ITR2; HAL_TIM_SlaveConfigSynchronization_IT(&htim4, &sSlaveConfig);

}

11.3.4. Режимы отсчета

В начале данной главы мы видели, что базовый таймер отсчитывает от нуля до задан-

ного значения Period. Таймеры общего назначения и расширенного управления могут от-

считывать другими способами, как показано в Таблице 4. На рисунке 15 показаны три основных режима отсчета.

Рисунок 15: Три основных режима отсчета таймера общего назначения