Если спросить нескольких разработчиков, для чего нужен таймер STM32, ответы почти наверняка будут разными. Один использует его для регулировки яркости светодиода, другой измеряет длительность ультразвукового импульса, а третий управляет силовым преобразователем или считывает квадратурный энкодер.
Во всех этих случаях работает один и тот же аппаратный блок — счётчик, тактируемый выбранным источником. Понимание этой базовой архитектуры позволяет рассматривать разные режимы таймера не как набор несвязанных функций, а как разные способы использования одного аппаратного механизма.
Из каких частей состоит таймер STM32
| Регистр | Назначение |
|---|---|
PSC | Делит входную частоту перед подачей на счётчик |
CNT | Содержит текущее значение счётчика |
ARR | Задаёт предел счёта или период |
CCR1–CCRx | Хранят значения сравнения либо захваченные значения CNT |
CCMR1/CCMR2 | Настраивают каналы на захват, сравнение или PWM; в некоторых TIM присутствует CCMR3 |
CCER | Включает каналы и задаёт полярность входов и выходов |
CR1 | Управляет направлением счёта, выравниванием, preload и запуском счётчика |
SMCR | Выбирает внешние тактовые сигналы, триггеры и slave-режимы |
DIER | Разрешает прерывания и запросы DMA |
SR | Содержит флаги обновления, захвата, сравнения, триггера и аварии |
EGR | Позволяет программно сформировать событие, например Update |
RCR | Задаёт число циклов между событиями Update |
BDTR | Управляет dead time, входами Break, блокировкой и главным разрешением выходов |
Полный набор этих регистров есть не у каждого TIM — он зависит от типа таймера.
Типы таймеров STM32
Базовые таймеры
Базовые таймеры используются прежде всего как внутренняя временная база. Во многих STM32 эту роль выполняют TIM6 и TIM7.
Они содержат предделитель, счётчик, регистр автоперезагрузки и логику Update. Таймер может формировать прерывания, запросы DMA и внутренние триггеры для других периферийных блоков, например DAC.
Каналов захвата и сравнения у базовых таймеров обычно нет, поэтому они не подходят для Input Capture, Output Compare или вывода PWM на GPIO.
Таймеры общего назначения
Это наиболее универсальная группа STM32-таймеров. На них строятся PWM, Input Capture, Output Compare, подсчёт внешних импульсов, One-Pulse и работа с квадратурными энкодерами.
Большинство таких таймеров имеют до четырёх каналов. Счётчик может быть 16- или 32-разрядным и, если это предусмотрено конкретным TIM, работать вверх, вниз или в центрированном режиме.
Несколько каналов одного таймера используют общие PSC, ARR и CNT. Поэтому они могут иметь разное заполнение PWM, но работают с одной временной базой.
Таймеры с сокращённым числом каналов
Некоторые экземпляры TIM имеют только один или два канала. Их временная база устроена так же, как у обычного таймера общего назначения, но доступных входов и выходов меньше.
Такие таймеры удобны для отдельных PWM-сигналов, простого захвата или сравнения, когда нет смысла занимать более функциональный TIM.
В отдельных семействах они также поддерживают комплементарный выход и генерацию dead time, что позволяет использовать их для управления одним полумостом.
Таймеры расширенного управления
К таймерам расширенного управления обычно относятся TIM1 и TIM8, хотя конкретный набор зависит от семейства STM32. Они сохраняют функции таймеров общего назначения, но добавляют средства для управления электродвигателями и силовой электроникой.
Такие таймеры поддерживают комплементарные PWM-выходы, dead time, входы Break, MOE и repetition counter. В отдельных режимах также доступны Commutation Event и DMA Burst для синхронного обновления выходов и нескольких регистров.
Эти возможности позволяют выполнять критические временные и защитные функции аппаратно, без зависимости от задержки ISR.
Низкопотребляющие таймеры LPTIM
LPTIM — отдельный тип таймера, рассчитанный на работу при низком энергопотреблении. В зависимости от конкретного STM32 он может использовать низкочастотные или асинхронные источники и продолжать работу в некоторых режимах Stop.
LPTIM применяют для периодического пробуждения микроконтроллера, подсчёта внешних импульсов и автономного формирования временных событий.
Набор функций зависит от поколения периферии. Более новые реализации могут поддерживать Input Capture, DMA, repetition counter и несколько каналов, тогда как ранние варианты значительно проще.
Таймер высокого разрешения HRTIM
HRTIM предназначен для задач, где временного разрешения и возможностей обычного TIM недостаточно. Его используют прежде всего в цифровых источниках питания, DC/DC-преобразователях и других системах силовой электроники.
Вместо одного счётчика с несколькими каналами HRTIM использует master timer и несколько связанных timing units. Это позволяет формировать многофазные и фазосдвинутые PWM-сигналы, точно синхронизировать ADC и аппаратно обрабатывать fault-сигналы.
По архитектуре HRTIM заметно отличается от обычных TIM, поэтому его следует рассматривать как специализированный таймерный блок, а не просто как более быстрый таймер.
Тактирование таймера и расчёт временной базы
Первым делом нужно определить фактическую тактовую частоту таймера fTIM.
Во многих семействах действует типовая схема: если делитель APB равен 1, таймер получает PCLK; если делитель больше 1, тактовая частота TIM во многих STM32 удваивается относительно PCLK. Это правило не универсально: в отдельных сериях используются TIMPRE, дополнительные мультиплексоры и другие варианты дерева RCC. Поэтому fTIM нужно определять по clock tree и Reference Manual конкретного микроконтроллера.
Предделитель формирует рабочую частоту счётчика:
После этого CNT изменяется один раз за каждый такт счётчика.
Для обычного счёта вверх без repetition counter частота события Update равна:
Если используется RCR:
Добавление единицы обязательно: в PSC, ARR и RCR записываются значения на единицу меньше соответствующего коэффициента деления или числа циклов.
Пример расчёта события с частотой 1 кГц
Пусть частота таймера составляет 72 МГц, PSC = 71, а ARR = 999.
Тогда:
Один тик соответствует 1 мкс.
Событие Update возникает с частотой:
Важно не путать эти величины. Сам счётчик работает на частоте 1 МГц, а событие обновления формируется через каждые 1000 тиков.
Разрядность счётчика
Большинство таймеров STM32 используют 16-разрядный CNT с диапазоном от 0 до 65 535. В некоторых семействах TIM2, TIM5 и отдельные другие экземпляры имеют 32-разрядный счётчик.
При частоте счёта 1 МГц 16-разрядный таймер переполнится через 65,536 мс, а 32-разрядный — примерно через 4295 секунд, или 71,6 минуты.
Большой диапазон удобен при измерении низких частот, создании свободно работающей аппаратной метки времени и захвате сигналов с длинным периодом. В противном случае переполнения приходится учитывать программно.
Режимы счёта таймера STM32
Счёт вверх
Счётчик начинается с нуля, увеличивается до ARR, а затем возвращается к нулю.
0 → 1 → 2 → … → ARR → 0
Это основной режим для периодических прерываний, временных измерений и edge-aligned PWM.
Счёт вниз
Счётчик начинает с ARR и уменьшается до нуля, после чего значение загружается снова.
ARR → … → 2 → 1 → 0 → ARR
Режим доступен у таймеров расширенного управления и у многих таймеров общего назначения. Базовые и некоторые одно- или двухканальные TIM его не поддерживают.
Центрированный режим
Значение сначала растёт от нуля до ARR, а затем уменьшается обратно:
0 → 1 → … → ARR → … → 1 → 0
Такой счёт применяется в center-aligned PWM. Полный период включает движение в обе стороны, поэтому при одинаковых PSC и ARR частота получается примерно вдвое ниже, чем в edge-aligned режиме.
Событие Update, preload и shadow-регистры
Update Event синхронизирует обновление временной базы и перенос новых значений из буферизованных регистров в активные shadow-регистры. В зависимости от настройки он также может установить UIF и сформировать прерывание или запрос DMA.
При счёте вверх Update обычно возникает при переполнении, при счёте вниз — при переходе через ноль, а в center-aligned режиме возможны события на обеих границах счёта. Update также можно сформировать программно через UG в EGR или через slave-mode controller. UDIS запрещает генерацию Update Event, а URS ограничивает источники update request для UIF, прерывания и DMA.
Как работает preload
Для буферизованных регистров существуют два уровня хранения: preload-регистр, куда пишет программа, и активный shadow-регистр, который непосредственно используется аппаратной логикой.
PSC всегда буферизован. Для ARR и CCR соответствующий preload включается отдельно. Например, при включённом preload для ARR новое значение периода не влияет на текущий цикл сразу: оно переносится в активный регистр при следующем Update Event.
То же относится к CCR, если для канала включён preload. Это особенно важно для PWM, где изменение значения сравнения в середине периода может сформировать слишком короткий или слишком длинный импульс.
Для Output Compare preload нужен не всегда. Если новая точка сравнения должна вступить в силу немедленно, ожидание следующего Update Event, наоборот, будет нежелательным.
Функции каналов таймера STM32
Output Compare
В режиме Output Compare событие возникает, когда текущее значение счётчика совпадает со значением соответствующего регистра CCR:
В этот момент таймер может сформировать прерывание или запрос DMA, изменить состояние выходного канала либо использовать событие как внутренний источник синхронизации, если такая маршрутизация предусмотрена выбранным TIM.
Output Compare удобен там, где действие должно произойти в точно заданной точке временной шкалы, но постоянный PWM-сигнал не требуется. Например, с его помощью можно запускать ADC в определённый момент управляющего цикла или формировать последовательность импульсов с разными интервалами.
Как избежать накопления временной ошибки
При периодическом Output Compare следующую точку лучше рассчитывать от предыдущего значения CCR:
uint32_t next = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_2);
next += interval_ticks;
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, next);
Если каждый раз вычислять новое значение от текущего CNT, задержка обработки прерывания будет постепенно попадать в период и накапливаться.
Само аппаратное сравнение при этом происходит вовремя. Задержаться может ISR и, соответственно, запись следующего CCR.
Формирование PWM
PWM использует тот же механизм сравнения CNT и CCR, но выполняет его непрерывно. ARR задаёт период, а CCR определяет длительность активной части сигнала.
Для edge-aligned PWM со счётом вверх:
Для PWM Mode 1 при активной высокой полярности:
Например, при ARR = 999 и CCR = 500 заполнение составляет 50%.
PWM Mode 1 и PWM Mode 2
При счёте вверх в PWM Mode 1 внутренний сигнал канала активен, пока CNT < CCR. В PWM Mode 2 логика сравнения обратная.
Фактическая полярность сигнала на GPIO дополнительно определяется настройками CCER. Поэтому PWM Mode 1 сам по себе не означает, что на физическом выводе активным обязательно будет высокий уровень.
Center-aligned PWM
В center-aligned PWM фронты располагаются симметрично относительно середины периода. Такой режим часто используют в электроприводах и силовых преобразователях, где важно согласовать моменты переключения ключей с измерениями ADC.
Частота и разрешение PWM
Разрешение по заполнению зависит от количества отсчётов CNT за один период.
Например, если таймер с частотой 100 МГц формирует edge-aligned PWM на 100 кГц без дополнительного предделения, на период приходится:
Это соответствует примерно 10 битам разрешения по заполнению.
Чем выше требуемая частота PWM, тем меньше отсчётов остаётся внутри периода. Поэтому высокая частота и высокое разрешение по заполнению требуют достаточной частоты самого таймера.
Изменение заполнения во время работы
Для обновления CCR без искажения текущего PWM-периода используется preload, описанный выше.
Новое значение можно записать через:
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, new_ccr);
CCR меняет длительность активной части сигнала, тогда как ARR влияет на его период и частоту.
После конфигурации PWM канал необходимо отдельно запустить:
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Init() выполняет настройку, но сам по себе не запускает PWM-выход.
Input Capture
В режиме Input Capture таймер сохраняет текущее значение CNT при появлении выбранного фронта внешнего сигнала. Захваченное значение записывается в CCR, а событие при необходимости формирует прерывание или запрос DMA.
В отличие от программного опроса GPIO, момент фронта фиксируется аппаратно и не зависит от задержки входа процессора в ISR.
Input Capture применяется для измерения частоты, периода и длительности импульса, а также для работы с тахометрами, ультразвуковыми датчиками и другими внешними временными сигналами.
Пересчёт отсчётов во время
В CCR хранится значение счётчика, а не время. Длительность одного отсчёта:
Интервал между двумя захватами:
Если CNT работает на частоте 1 МГц, один тик равен 1 мкс.
Переполнение счётчика
При измерении длинных интервалов необходимо учитывать переход счётчика через максимальное значение.
Для свободно работающего 16-разрядного таймера:
uint16_t delta =
(uint16_t)(current_capture - previous_capture);
Такое модульное вычитание корректно обрабатывает переход 0xFFFF → 0x0000, пока интервал между захватами меньше полного диапазона счётчика.
Если между двумя входными событиями может произойти несколько переполнений, нужно отдельно считать события Update, уменьшить частоту CNT либо использовать 32-разрядный таймер.
Цифровой фильтр входа
Входные каналы таймера могут использовать цифровую фильтрацию. Сигнал проходит выборку, и слишком короткие изменения уровня могут быть отброшены как помеха.
Более сильная фильтрация улучшает устойчивость к коротким импульсным помехам, но одновременно увеличивает задержку и минимальную длительность сигнала, который способен пройти на вход таймера.
Поэтому значение фильтра нужно выбирать по частоте входного сигнала и требуемой помехоустойчивости, а не просто устанавливать максимально возможное.
Предделитель Input Capture
На поддерживаемых таймерах можно выполнять захват не каждого входного события, а каждого второго, четвёртого или восьмого.
Это снижает частоту запросов при быстром входном сигнале. При расчёте результата выбранный коэффициент предделения необходимо учитывать.
PWM Input
PWM Input предназначен для одновременного измерения периода и длительности активного состояния внешнего PWM-сигнала.
Обычно два канала Capture подключаются внутри таймера к одному входу. Один фиксирует период, второй — противоположный фронт, а slave-mode controller сбрасывает CNT в начале каждого нового периода.
В результате один CCR содержит период сигнала, а второй — длительность импульса:
и коэффициент заполнения:
PWM Input занимает два канала захвата для одного входного сигнала, поэтому доступность такой конфигурации зависит от внутренней маршрутизации конкретного TIM.
Подсчёт внешних импульсов
Таймер может измерять не только время, но и количество внешних событий. Вместо внутреннего тактового сигнала счётчик получает импульсы от датчика или другого устройства.
Такой режим используют, например, в расходомерах, тахометрах, импульсных счётчиках и производственном оборудовании.
External Clock Mode 1
В External Clock Mode 1 внешний тактовый сигнал подаётся через TI1 или TI2 и проходит через входную логику таймера перед поступлением на счётчик.
Можно выбрать активный фронт, настроить цифровой фильтр и, если это поддерживается конкретным TIM, использовать входной предделитель.
External Clock Mode 2
External Clock Mode 2 использует вход ETR как источник тактирования счётчика. Для него предусмотрены собственные настройки полярности, фильтра и предделителя.
Поскольку ETR используется как отдельный источник clock, slave-mode controller в совместимых конфигурациях можно задействовать для другой функции. Например, один TIM может считать импульсы через ETR, а другой через TRGO/ITR задавать измерительное окно или сбрасывать счётчик.
При работе с внешними сигналами нужно учитывать максимальную частоту и минимальную длительность импульса. Слишком короткие импульсы или слишком сильная цифровая фильтрация могут привести к пропуску событий.
Энкодерный режим
В Encoder Mode таймер использует два входных канала для обработки квадратурных сигналов A и B.
Фазовый сдвиг между ними позволяет аппаратно определить направление вращения, а CNT автоматически увеличивается или уменьшается без обработки каждого фронта процессором.
Классическая реализация STM32 поддерживает три основных режима: Mode 1 и Mode 2 дают разрешение ×2 по одному из входов, а Mode 3 считает переходы обоих входов и даёт ×4.
Если энкодер выдаёт 1024 полных квадратурных периода на оборот, эффективное разрешение в Mode 3 составит:
При 3000 об/мин частота входных переходов составит:
Это значение необходимо учитывать при настройке цифрового фильтра. Слишком сильная фильтрация может привести к пропуску корректных переходов на высокой скорости.
При длительном отслеживании положения нужно также учитывать переполнение CNT. Для циклического счётчика переход между максимальным значением и нулём является нормальной частью работы и должен корректно обрабатываться программой.
One-Pulse Mode
One-Pulse Mode позволяет сформировать одиночный импульс после программного запуска или внешнего триггера.
В типовой конфигурации таймер начинает счёт после события, выдерживает программируемую задержку, формирует импульс заданной длительности и после завершения цикла останавливается.
Для счёта вверх задержка и длительность импульса определяются комбинацией CCR, ARR, выбранного PWM mode и полярности выхода. Поэтому конкретные формулы нужно брать из конфигурации используемого режима, а не применять одну универсальную формулу ко всем вариантам.
One-Pulse Mode используют для аппаратных стробов, одиночных управляющих импульсов и запуска внешних устройств без программного переключения GPIO в критические моменты времени.
Синхронизация таймеров
Таймеры STM32 могут передавать события друг другу через внутреннюю trigger-систему. Один TIM работает как master и формирует TRGO, а другой принимает его через TRGI, обычно связанный с одной из линий ITR.
Slave-таймер может по trigger сбросить CNT (Reset Mode), начать счёт (Trigger Mode) или считать только пока trigger активен (Gated Mode). Это позволяет строить аппаратные измерительные окна, синхронно запускать несколько таймеров и каскадировать их для увеличения временного диапазона.
Несколько TIM также можно синхронизировать для формирования PWM с определённым фазовым соотношением. Кроме того, timer events используются для аппаратного запуска ADC и DAC. Например, ADC можно запускать в заданной точке PWM-периода, что особенно полезно при измерении токов и напряжений в силовой электронике.
Примеры настройки через HAL
Ниже приведены базовые примеры для PWM, Input Capture, Output Compare и энкодерного режима. Предполагается, что тактирование периферии, GPIO Alternate Function и NVIC уже настроены в CubeMX либо в функциях MSP.
Названия полей HAL и доступность отдельных параметров различаются между сериями STM32Cube, поэтому перед переносом кода его нужно сверить с HAL для конкретного семейства.
PWM на TIM3, канал 1
Пусть таймер получает 72 МГц. При PSC = 71 счётчик работает на 1 МГц, а ARR = 999 задаёт период 1000 мкс. Получается PWM с частотой 1 кГц и примерно 10 битами разрешения по заполнению.
TIM_HandleTypeDef htim3 = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 71;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; /* Около 50% */
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(
&htim3,
&sConfigOC,
TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
Изменение заполнения во время работы:
/* Около 25% при ARR = 999 */
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 250);
Если требуется обновлять ARR и CCR одновременно, их лучше менять через preload и применять на общей границе Update Event.
Input Capture на TIM2, канал 1
TIM_IC_InitTypeDef sConfigIC = {0};
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 4;
if (HAL_TIM_IC_ConfigChannel(
&htim2,
&sConfigIC,
TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
В универсальном примере фильтр отключён. Ненулевое значение ICFilter следует выбирать по требованиям входного сигнала и таблице фильтра в Reference Manual конкретного TIM.
Обработчик вычисляет интервал только после второго захвата:
static uint32_t previous_capture = 0U;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if ((htim->Instance == TIM2) &&
(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1))
{
uint32_t current_capture =
HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uint32_t delta =
current_capture - previous_capture;
previous_capture = current_capture;
/*
* При частоте CNT = 1 МГц delta соответствует
* интервалу в микросекундах.
*/
}
}
Для 16-разрядного таймера тип переменной должен соответствовать ширине счётчика либо результат нужно ограничить маской 0xFFFF. Если между фронтами возможно несколько переполнений, одного модульного вычитания недостаточно.
Output Compare на TIM4, канал 2
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
sConfigOC.Pulse = 5000;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(
&htim4,
&sConfigOC,
TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
Следующий compare-момент рассчитывается от предыдущего CCR:
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
if ((htim->Instance == TIM4) &&
(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2))
{
uint32_t next =
__HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_2);
next += 5000U;
__HAL_TIM_SET_COMPARE(
htim,
TIM_CHANNEL_2,
next);
}
}
Так задержка входа в ISR не накапливается от периода к периоду. Если обработчик выполняется слишком долго и новая точка сравнения уже оказалась позади текущего CNT, следующее совпадение произойдёт только после очередного оборота счётчика.
Энкодерный режим
После настройки TI1, TI2, фильтра и Encoder Mode таймер запускается одной функцией:
if (HAL_TIM_Encoder_Start(
&htim2,
TIM_CHANNEL_ALL) != HAL_OK)
{
Error_Handler();
}
Текущее положение считывается из CNT:
uint32_t raw_position =
__HAL_TIM_GET_COUNTER(&htim2);
Если выбран 32-разрядный TIM2, знаковое приращение между двумя чтениями можно вычислять так:
static uint16_t previous_count = 0U;
uint16_t current_count =
(uint16_t)__HAL_TIM_GET_COUNTER(&htim2);
int16_t delta =
(int16_t)(current_count - previous_count);
previous_count = current_count;
Такой подход корректно обрабатывает переход через границу 32-разрядного счётчика, если между чтениями перемещение не превышает половины его диапазона. Для 16-разрядного TIM используются uint16_t и int16_t по тому же принципу.
Как выбрать нужную функцию таймера
| Задача | Подходящий режим |
|---|---|
| Периодический запуск программной задачи | Прерывание Update |
| Генерация сигнала с регулируемым заполнением | PWM |
| Действие в заданной точке счёта | Output Compare |
| Измерение времени внешнего фронта | Input Capture |
| Измерение частоты и заполнения входного PWM | PWM Input |
| Подсчёт импульсов от датчика | External Clock Mode 1 или 2 |
| Работа с квадратурным энкодером | Encoder Mode |
| Один импульс после внешнего события | One-Pulse Mode |
| Синхронный запуск нескольких таймеров | Master/Slave Trigger |
| Запуск ADC в определённой фазе PWM | Compare Event или TRGO |
| Управление полумостом | Комплементарный PWM продвинутого таймера |
| Аварийное отключение силовых выходов | Break Input |
| Автономная работа в Stop | LPTIM |
| Высокоточная цифровая силовая электроника | HRTIM |
Эта таблица помогает выбрать общий режим, но не гарантирует, что он есть у конкретного TIM. Например, TIM6 не сможет работать с энкодером, а обычный TIM3 не имеет Break и комплементарных выходов уровня TIM1.
В заключение
Хорошее понимание таймеров меняет сам подход к разработке на STM32. Там, где точность времени действительно важна, лучше не заставлять процессор постоянно контролировать события программно, а использовать аппаратные возможности периферии. Это делает поведение системы более предсказуемым, снижает зависимость от задержек кода и оставляет процессору ресурсы для задач, которые действительно требуют вычислений.
Если проект переходит от прототипа к серийному устройству, YPCB может проверить реализацию связанных с таймерами цепей на уровне платы — от PWM и внешних входов до интерфейсов силовых драйверов и защитных сигналов — до запуска производства.
Часто задаваемые вопросы
Обычно достаточно любого TIM общего назначения с доступным PWM-каналом.
Обычно нет, потому что каналы одного TIM используют общие PSC и ARR.
Когда требуется большой диапазон счёта без увеличения PSC и потери временного разрешения.
Да, если выбранные каналы совместимы и могут работать с общей временной базой.
Когда события происходят слишком часто для эффективной обработки каждого из них через ISR.
Да; для увеличения доступного интервала можно снизить частоту CNT или использовать 32-разрядный таймер.
Когда таймер должен продолжать работу при низком энергопотреблении или в поддерживаемых режимах Stop.
Когда обычного TIM недостаточно для высокоточного управления силовыми преобразователями, сложного PWM или жёсткой синхронизации переключений.
