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

Таймеры

303

Представление конфигурации таймера позволяет сконфигурировать значения для регистров Prescaler и Period, как показано на рисунке 2. CubeMX сгенерирует весь необходимый код инициализации внутри функции MX_TIMx_Init(). Кроме того, всегда в одном

итом же диалоговом окне конфигурации можно разрешить связанные с таймером IRQ

изапросы к DMA.

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

11.3. Таймеры общего назначения

Большинство таймеров STM32 являются таймерами общего назначения. В отличие от базовых таймеров, рассмотренных нами ранее, они предоставляют гораздо больше возможностей взаимодействия благодаря четырем независимым каналам, которые можно использовать для измерения входных сигналов, для вывода сигналов с учетом времени, для генерации сигналов широтно-импульсной модуляции (ШИМ, англ. Pulse-Width Modulation, PWM). Таймеры общего назначения, однако, предлагают гораздо больше функциональных возможностей, которые мы постепенно откроем в этой части главы.

11.3.1.Генератор временного отсчета с внешними источниками тактового сигнала

На рисунке 3 показана структурная схема таймера общего назначения17. Некоторые части диаграммы замаскированы: мы рассмотрим их более подробно позже. Путь, выделенный красным цветом, используется для питания таймера, когда в качестве источника тактового сигнала выбран сигнал шины APB: внутренний тактовый сигнал CK_INT подается на предделитель Prescaler (PSC), который, в свою очередь, определяет, насколько быстро увеличивается/уменьшается регистр счетчика Counter Register (CNT). Этот регистр сравнивается с содержимым регистра автоперезагрузки auto-reload register (который заполняется значением поля TIM_Base_InitTypeDef.Period). Когда они совпадают, генерируется событие UEV и срабатывает соответствующий IRQ, если он разрешен.

17 Рисунок построен на основе рисунка, найденного в справочном руководстве RM0368 (http://www.st.com/web/en/resource/technical/document/reference_manual/DM00096844.pdf) от ST.

Таймеры

304

Рисунок 3: Структурная схема таймера общего назначения

На рисунке 3 видно, что таймер может получать «стимулирование» от других источников. Их можно разделить на две основные группы:

Источники тактового сигнала, которые используются для тактирования тай-

мера. Они могут поступать от внешних источников, подключенных к выводам микроконтроллера, или от других таймеров, подключенных к микроконтроллеру. Имейте в виду, что таймер не может работать без источника тактового сигнала, поскольку он используется для инкрементирования регистра счетчика.

Источники запуска (Trigger sources), которые используются для синхронизации таймера с внешними источниками, подключенными к выводам микроконтроллера, или с другими таймерами, подключенными внутри. Например, можно сконфигурировать таймер так, чтобы он начал отсчет, когда его запустит (triggers) внешнее событие. В этом случае таймер тактируется одним источником тактового сигнала (который может быть как шиной APBx, так и внешним источником тактового сигнала, подключенным к выводу ETR2), а управляется (то есть то, когда он начинает отсчет и т. д.) другим устройством.

Взависимости от типа таймера и его фактической реализации, таймер может тактироваться от:

Внутреннего TIMx_CLK, предоставленного RCC (показано в параграфе 11.2)

Внутреннего триггерного входа от 0 до 3

ITR0, ITR1, ITR2 и ITR3, использующие другой таймер (ведущий) в качестве предделителя этого таймера (ведомого) (показано в параграфе 11.3.1.2)

Таймеры

305

Выводов внешнего входного канала (показано в параграфе 11.3.1.2)

Вывод 1: TI1FP1 или TI1F_ED

Вывод 2: TI2FP2

Внешних выводов ETR:

Вывод ETR1 (показано в параграфе 11.3.1.2)

Вывод ETR2 (показано в параграфе 11.3.1.1)

Напротив, таймер может быть запущен от:

Внутренних триггерных входов от 0 до 3

ITR0, ITR1, ITR2 и ITR3, использующие другой таймер в качестве ведущего (показано в параграфе 11.3.2)

Выводов внешнего входного канала (показано в параграфе 11.3.2)

Вывод 1: TI1FP1 или TI1F_ED

Вывод 2: TI2FP2

Внешних выводов ETR1

Давайте изучим эти способы тактирования/запуска таймера от внешнего источника на основе анализа практических примеров.

11.3.1.1. Режим внешнего тактирования 2

Таймеры общего назначения могут тактироваться от внешних источников, устанавливая их в двух разных режимах: Режим внешнего источника тактового сигнала 1 и 2 (External Clock Source Mode). Первый доступен, когда таймер сконфигурирован в режиме ведомого. Мы будем изучать этот режим в следующем параграфе.

Напротив, второй режим активируется просто с помощью внешнего источника тактового сигнала. Он позволяет использовать более точные и выделенные источники и, в конечном итоге, еще больше снизить частоту отсчета. Фактически, когда выбран Режим внешнего тактирования 2, формула для вычисления частоты возникновения событий обновления становится следующей:

Событие обновления =

 

ВнешТС

 

)(Prescaler +1)(Period +1)(RepetitionCounter +1)

(Предделитель

ВнешТС

 

 

[2]

где ВнешТС – частота внешнего источника, а ПредделительВнешТС – делитель частоты источника, который может принимать значения 1, 2, 4 и 8.

Источник тактового сигнала таймера общего назначения может быть выбран с помощью

функции HAL_TIM_ConfigClockSource() и экземпляра структуры TIM_ClockConfigTypeDef,

которая определена следующим образом:

typedef struct {

 

 

uint32_t ClockSource;

/* Источник тактового сигнала TIM

*/

uint32_t ClockPolarity;

/* Полярность тактового сигнала TIM

*/

uint32_t ClockPrescaler;

/* Предделитель тактового сигнала TIM

*/

uint32_t ClockFilter;

/* Фильтр тактового сигнала TIM

*/

} TIM_ClockConfigTypeDef;

 

 

fDTS

Таймеры

306

ClockSource: задает источник тактового сигнала, используемого для питания тай-

мера. Может принимать значение из таблицы 7. По умолчанию выбран режим

TIM_CLOCKSOURCE_INTERNAL.

ClockPolarity: задает полярность (активный фронт) тактового сигнала, использу-

емого для питания таймера. Может принимать значение из таблицы 8. По умол-

чанию выбран режим TIM_CLOCKPOLARITY_RISING.

ClockPrescaler: задает предделитель для внешнего источника тактового сигнала.

Может принимать значение из таблицы 9. По умолчанию выбрано значение

TIM_CLOCKPRESCALER_DIV1.

ClockFilter: это 4-битное поле, задает частоту, используемую для выборки внеш-

него тактового сигнала, и размер применяемого к нему цифрового фильтра. Цифровой фильтр состоит из счетчика событий, в котором требуется N последовательных событий для подтверждения перепада сигнала на выходе. Обратитесь к техническому описанию вашего микроконтроллера за тем, как вычисляется

(Dead-Time Signal – частота сигнала мертвого времени). По умолчанию фильтр от-

ключен.

Таблица 7: Доступные режимы источника тактового сигнала для таймеров общего назначения и расширенного управления

Режим источника тактового

 

сигнала

Описание

TIM_CLOCKSOURCE_INTERNAL

Таймер тактируется от шины APBx, к которой подключен.

TIM_CLOCKSOURCE_ETRMODE1

Данный режим называется Режимом внешнего тактирова-

 

ния 118 и доступен, когда таймер сконфигурирован в

 

режиме ведомого. Таймер может тактироваться внутрен-

 

ним/внешним источником, подключенным к выводу

 

ITR0, ITR1, ITR2, ITR3, TI1FP1, TI2FP2 или ETR1.

TIM_CLOCKSOURCE_ETRMODE2

Данный режим называется Режимом внешнего тактирова-

ния 2. Таймер может тактироваться от внешнего источника, подключенного к выводу ETR2.

Таблица 8: Доступные режимы полярности внешнего тактового сигнала для таймеров общего назначения и расширенного управления

Режим полярности внешнего

 

тактового сигнала

Описание

 

 

TIM_CLOCKPOLARITY_RISING

Таймер синхронизируется с передним (нарастающим)

 

фронтом внешнего источника тактового сигнала

TIM_CLOCKPOLARITY_FALLING

TIM_CLOCKPOLARITY_BOTHEDGE

Таймер синхронизируется с задним (спадающим) фронтом внешнего источника тактового сигнала

Таймер синхронизируется с передним и задним фронтами внешнего источника тактового сигнала (это увеличит частоту дискретизации)

18 В документации ST эти режимы также называются Режимами внешнего запуска 1 и 2 (ETR1 и ETR2, англ.

External Trigger mode).

Таймеры

307

Таблица 9: Доступные режимы предделителя внешнего тактового сигнала для таймеров общего назначения и расширенного управления

Режим предделителя внешнего

 

 

тактового сигнала

Описание

 

 

 

 

TIM_CLOCKPRESCALER_DIV1

Предделитель не используется

 

TIM_CLOCKPRESCALER_DIV2

Захват выполняется один раз каждые 2 события

TIM_CLOCKPRESCALER_DIV4

Захват выполняется один раз каждые 4

события

TIM_CLOCKPRESCALER_DIV8

Захват выполняется один раз каждые 8

событий

Давайте создадим пример, который показывает, как использовать внешний источник тактового сигнала для таймера TIM3. Пример состоит в направлении сигнала с вывода MCO на вывод TIM3_ETR2, который соответствует выводу PD2 для всех плат Nucleo, предоставляющих данный таймер. Это легко сделать с помощью Morpho-разъемов, как показано на рисунке 4 для Nucleo-F030R8 (для вашей Nucleo используйте инструмент CubeMX, чтобы идентифицировать вывод MCO и соответствующую схему выводов из Приложения C).

Рисунок 4: Как направить вывод MCO к выводу TIM3_ETR на плате Nucleo-F030R8

Вывод MCO разрешен и подключен к источнику тактового сигнала LSE, который работает на частоте 32,768 кГц19. Следующий код показывает наиболее важные части примера.

Имя файла: src/main-ex3.c

23void MX_TIM3_Init(void) {

24TIM_ClockConfigTypeDef sClockSourceConfig;

26htim3.Instance = TIM3;

27htim3.Init.Prescaler = 0;

28htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

29htim3.Init.Period = 16383;

19 К сожалению, ранние выпуски плат Nucleo не предоставляют внешний низкочастотный источник тактового сигнала. Если это ваш случай, измените примеры так, чтобы использовался LSI-генератор. Более того, в микроконтроллере STM32F103R8 невозможно направить ни LSI, ни LSE на вывод MCO. По этой причине в этом примере на Nucleo-F103R8 в качестве источника MCO используется HSI.

Таймеры

308

30htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

31htim3.Init.RepetitionCounter = 0;

32HAL_TIM_Base_Init(&htim3);

33

34sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;

35sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;

36sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;

37sClockSourceConfig.ClockFilter = 0;

38HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

39

40HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);

41HAL_NVIC_EnableIRQ(TIM3_IRQn);

42}

43

44void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) {

45GPIO_InitTypeDef GPIO_InitStruct;

46if(htim_base->Instance==TIM3) {

47/* Разрешение тактирования периферии */

48__HAL_RCC_TIM3_CLK_ENABLE();

49__HAL_RCC_GPIOD_CLK_ENABLE();

50

51/**Конфигурация выводов GPIO TIM3

52PD2 ------> TIM3_ETR

53*/

54GPIO_InitStruct.Pin = GPIO_PIN_2;

55GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

56GPIO_InitStruct.Pull = GPIO_NOPULL;

57GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

58HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

59}

60}

Строки [26:32] конфигурируют таймер TIM3, устанавливая его период на 19999. Строки [34:38] конфигурируют внешний источник тактового сигнала для TIM3. Поскольку LSE-генератор работает на частоте 32,768 кГц, то используя уравнение [2], мы можем вычислить частоту UEV, которая равна:

Событие обновления =

 

32768

 

= 2 Гц = 0,5 с

(1)(0

+1)(16383 +1)(0

+1)

 

 

Наконец, строки [48:58] включают TIM3 и конфигурируют вывод PD2 (который соответствует выводу TIM3_ETR2) в качестве источника входного сигнала.

Прочитайте внимательно

Важно подчеркнуть, что порт D GPIO должен быть включен, прежде чем мы сможем использовать его в качестве источника тактового сигнала для TIM3, используя макрос __GPIOD_CLK_ENABLE(). То же самое относится и к TIM3, кото-

рый включается с помощью __TIM3_CLK_ENABLE(): это необходимо, поскольку внешние тактовые сигналы подаются на предделитель не напрямую, а