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

Таймеры

309

сначала синхронизируются с тактовым сигналом шины APBx через отдельные логические блоки.

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

У STM32 таймеры общего назначения и расширенного управления могут быть сконфигури-

рованы для работы в режиме ведущего (master) или ведомого (slave)20. Когда таймер сконфигурирован для работы в качестве ведомого, он может питаться от внутренних линий ITR0, ITR1, ITR2 и ITR3, от внешнего тактового сигнала, подключенного к выводу ETR1, или от других источников тактового сигнала, подключенных к источникам TI1FP1 и TI2FP2, соответствующих выводам входных каналов 1 и 2. Данный режим работы назы-

вается Режимом внешнего тактирования 1 (External Clock Mode 1).

Режимы внешнего тактирования 1 и 2 довольно запутаны для всех новичков платформы STM32. Оба режима являются способом тактирования таймера с использованием внешнего источника тактового сигнала, но первый режим достигается конфигурацией таймера в режиме ведомого (это фактически форма «запуска»), а второй – просто выбором другого источника тактового сигнала. Мне не известно происхождение данной номенклатуры и каковы практические последствия этого различия. Однако здесь важно отметить, что способы конфигурации таймера в режиме ETR1 или ETR2 совершенно разные, как мы увидим в следующем примере.

Из рисунка 16 видно, что входы TI1FP1 и TI2FP2 – это не что иное, как входные каналы TI1 и TI2 таймера после применения входного фильтра.

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

HAL_TIM_SlaveConfigSynchronization() и экземпляр структуры TIM_SlaveConfigTypeDef, ко-

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

typedef struct {

 

 

 

uint32_t SlaveMode;

/*

Выбор режима ведомого

*/

uint32_t InputTrigger;

/*

Источник триггерного входа

*/

uint32_t TriggerPolarity;

/*

Полярность триггерного входа

*/

uint32_t TriggerPrescaler; /*

Предделители триггерного входа

*/

uint32_t TriggerFilter;

/*

Фильтр триггерного входа

*/

} TIM_SlaveConfigTypeDef;

 

 

 

SlaveMode: когда таймер сконфигурирован в режиме ведомого, он может быть

затактирован/запущен несколькими источниками. Это поле может принимать значение из таблицы 10. В данном параграфе речь пойдет о режиме TIM_SLAVE-

MODE_EXTERNAL1.

InputTrigger: задает источник, который запускает/тактирует таймер, сконфигу-

рированный в режиме ведомого. Может принимать значение из таблицы 11.

TriggerPolarity: задает полярность источника запуска/тактирования. Может при-

нимать значение из таблицы 12.

20 Как мы увидим далее, таймер может быть сконфигурирован для работы в режиме ведущего и ведомого одновременно.

fDTS

Таймеры

310

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

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

ние TIM_TRIGGERPRESCALER_DIV1.

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

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

стота сигнала мертвого времени). По умолчанию фильтр отключен.

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

Режимы ведомого

Действие

Описание

TIM_SLAVEMODE_DISABLE

Отключен

Режим ведомого отключен (значение по

 

 

умолчанию).

TIM_SLAVEMODE_RESET

Триггер Нарастающий фронт выбранного триггерного входа (trigger input, TRGI) переинициализирует счетчик и генерирует обновление регистров.

TIM_SLAVEMODE_GATED

Триггер Тактирование счетчика активируются при высоком уровне триггерного входа (TRGI). Счетчик останавливается (но не сбрасывается), как только срабатывает триггер. Управление происходит и запуском, и остановкой счетчика.

TIM_SLAVEMODE_TRIGGER

TIM_SLAVEMODE_EXTERNAL1

TIM_SLAVEMODE_COMBINED_RESETTRIGGER21

Триггер Счетчик запускается от нарастающего фронта TRGI (но он не сбрасывается). Управление происходит только запуском счетчика.

Такт. Нарастающие фронты выбранного TRGI сигнал тактируют счетчик.

Триггер Нарастающий фронт выбранного триггерного входа (TRGI) переинициализирует счетчик, генерирует обновление регистров и запускает счетчик.

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

ведомого

Источник запуска/тактирования

Описание

TIM_TS_ITR0

Источником запуска/тактирования является линия

 

ITR0 (которая внутренне подключена к ведущему тай-

 

меру).

TIM_TS_ITR1

Источником запуска/тактирования является линия ITR1 (которая внутренне подключена к ведущему таймеру).

21 Данный режим доступен только в некоторых микроконтроллерах STM32F3.

Таймеры

311

Таблица 11: Доступные источники запуска/тактирования для таймера, работающего в режиме ведомого (продолжение)

Источник запуска/тактирования

Описание

 

 

TIM_TS_ITR2

Источником запуска/тактирования является линия

 

ITR2 (которая внутренне подключена к ведущему тай-

 

меру).

TIM_TS_ITR3

Источником запуска/тактирования является линия ITR3 (которая внутренне подключена к ведущему таймеру).

TIM_TS_TI1F_ED

TIM_TS_TI1FP1

Источником запуска/тактирования является линия

TIM_TS_TI1F_ED.

Источником запуска/тактирования является линия TIM_TS_TI1FP1, соответствующая каналу 1.

TIM_TS_TI2FP2

TIM_TS_ETRF

TIM_TS_NONE

Источником запуска/тактирования является линия TIM_TS_TI2FP2, соответствующая каналу 2.

Источником запуска/тактирования является вывод

ETR1.

Внешний источник тактирования/запуска отсутствует.

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

Режим полярности источника запуска/тактирования Описание

TIM_TRIGGERPOLARITY_INVERTED Используется, когда внешним источником тактового сигнала является ETR1. ETR1 неинвертирован, активен на высоком уровне или переднем (нарастающем) фронте.

TIM_TRIGGERPOLARITY_NONINVERTED

TIM_TRIGGERPOLARITY_RISING

TIM_TRIGGERPOLARITY_FALLING

TIM_TRIGGERPOLARITY_BOTHEDGE

Используется, когда внешним источником тактового сигнала является ETR1. ETR1 инвертирован, активен на низком уровне или заднем (спадающем) фронте.

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

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

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

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

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

 

 

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

Описание

 

TIM_TRIGGERPRESCALER_DIV1

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

 

TIM_TRIGGERPRESCALER_DIV2

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

TIM_TRIGGERPRESCALER_DIV4

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

события

TIM_TRIGGERPRESCALER_DIV8

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

событий

Таймеры

312

Когда выбран Режим внешнего тактирования 1, формула для вычисления частоты возникновения событий обновления принимает вид:

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

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

[3]

 

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

где

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

– частота источника тактового сигнала, подключенного к вы-

воду ETR1, частота внутреннего/внешнего источника тактового сигнала запуска, подключенного к внутренним линиям ITR0..ITR3, или частота сигнала, подключенного к внешним каналам TI1FP1..T2FP2.

Итак, давайте вспомним то, что мы рассмотрели до сих пор:

таймер может тактироваться внешним источником, если он работает только в режиме ведущего22, подключив этот источник к выводу ETR2;

если таймер работает в режиме ведомого, он может тактироваться сигналом, подключенным к выводу ETR1, любым источником запуска, подключенным к внутренним линиям ITR0…ITR2 (следовательно, источником тактового сигнала может быть только другой таймер) или входным сигналом, подключенным к каналам таймера TI1 и TI2, которые становится TI1FP1 и TI2FP2, если активирован каскад фильтрации входа (input filtering stage).

Давайте создадим еще один пример, который показывает, как использовать внешний источник тактового сигнала для таймера TIM3. Пример состоит в направлении сигнала с вывода MCO на вывод TI2FP2 (то есть второй канал таймера TIM3), который в NucleoF030R8 соответствует выводу PA7. Это легко сделать с помощью Morpho-разъемов, как показано на рисунке 5 (для вашей Nucleo используйте инструмент CubeMX для идентификации выводов MCO и TI2FP2).

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

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

22 Как мы увидим позже, режим ведущего/ведомого для таймера не является исключительным: таймер может быть сконфигурирован на одновременную работу в качестве ведущего и ведомого.

Таймеры

313

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

24void MX_TIM3_Init(void) {

25TIM_SlaveConfigTypeDef sSlaveConfig;

27htim3.Instance = TIM3;

28htim3.Init.Prescaler = 0;

29htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

30htim3.Init.Period = 16383;

31htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

32

HAL_TIM_Base_Init(&htim3);

33

 

34sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;

35sSlaveConfig.InputTrigger = TIM_TS_TI2FP2;

36sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;

37sSlaveConfig.TriggerFilter = 0;

38HAL_TIM_SlaveConfigSynchronization(&htim3, &sSlaveConfig);

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_GPIOA_CLK_ENABLE();

50

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

52PA7 ------> TIM3_CH2

53*/

54GPIO_InitStruct.Pin = GPIO_PIN_7;

55GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

56GPIO_InitStruct.Pull = GPIO_NOPULL;

57GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

58GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;

59HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

60}

Строки [34:38] конфигурируют TIM3 в режиме ведомого. Источник триггерного входа установлен на TI2FP2, а таймер синхронизируется с передним (нарастающим) фронтом входного сигнала. Наконец, строки [54:59] конфигурируют PA7 в качестве входного вывода для второго канала TIM3.

11.3.1.3.Использование CubeMX для конфигурации источника тактового сигнала таймера общего назначения

Конфигурирование источника тактового сигнала таймера общего назначения может быть кошмаром, особенно для новичков платформы STM32. CubeMX может упростить этот

Таймеры

314

процесс, хотя требует хорошего понимания режимов ведущего/ведомого и режимов

ETR1 и ETR2.

Чтобы сконфигурировать таймер в Режиме внешнего тактирования 2 (External Clock Mode 2), достаточно выбрать ETR2 в качестве источника тактового сигнала в представлении Pinout, как показано на рисунке 6.

Рисунок 6: Как выбрать режим ETR2 в IP tree pane

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

Рисунок 7: Как сконфигурировать таймер, работающий в режиме ETR2

Чтобы сконфигурировать таймер в Режиме внешнего тактирования 1 (External Clock Mode 1), мы должны выбрать этот режим в пункте Slave mode, а затем выбрать источник запуска Trigger Source (который в данном случае является источником тактового сигнала для таймера), как показано на рисунке 8.