Таймеры STM32: устройство, режимы и расчёт
Какие таймеры есть в STM32F103 и STM32F407, от какой частоты они считают и как из PSC, ARR и CCR получить нужный период, частоту ШИМ и скважность. Комплементарные выходы с мёртвым временем, вход аварийного отключения, захват, режим энкодера, одиночный импульс и связка таймеров — по RM0008, RM0090 и даташитам, с примерами на CMSIS.
Обновлено Редакция GAW
Таймеры STM32 — счётчики с предделителем, регистром периода и каналами сравнения и захвата. На них строятся периодические прерывания, ШИМ для светодиодов и двигателей, измерение частоты и длительности импульсов, чтение энкодеров и запуск АЦП и ЦАП по времени. Таймеров в микроконтроллере много и они разные: у расширенных есть комплементарные выходы с мёртвым временем, у базовых нет ни одного вывода.
Ниже — таймеры STM32F1 и STM32F4 по справочным руководствам RM0008 и RM0090. Устройство таймеров у них почти одинаково, поэтому большая часть сказанного подходит и к другим семействам. Подобрать PSC и ARR под нужную частоту можно в калькуляторе таймера, а все биты регистров описаны на страницах TIM STM32F1 и STM32F4.
Коротко
- Счёт: частота счётчика — fTIM/(PSC + 1), период — ARR + 1 отсчётов; PSC от 0 до 65535.
- Такт таймера равен частоте шины APB, если её делитель 1, и удвоенной частоте — если больше.
- ШИМ: f = fTIM/((PSC + 1)(ARR + 1)), скважность — CCR / (ARR + 1); по центру — период вдвое длиннее.
- Виды: расширенные TIM1 и TIM8 (комплементарные выходы, мёртвое время, BRK), общего назначения TIM2–TIM5 и TIM9–TIM14, базовые TIM6 и TIM7.
- У STM32F4 TIM2 и TIM5 32-битные, остальные таймеры у обоих семейств — 16-битные.
- Выходы TIM1 и TIM8 работают только после установки бита MOE.
Какие таймеры есть
| Таймер | Тип | Разрядность | Каналов | Комплементарные выходы | STM32F103x8/B | STM32F405/407 |
|---|---|---|---|---|---|---|
| TIM1, TIM8 | расширенный | 16 бит | 4 | есть | только TIM1, на APB2 | оба, на APB2, до 168 МГц |
| TIM2, TIM5 | общего назначения | 16 бит у F1, 32 бита у F4 | 4 | нет | TIM2, на APB1 | оба, на APB1, до 84 МГц |
| TIM3, TIM4 | общего назначения | 16 бит | 4 | нет | оба, на APB1 | оба, на APB1, до 84 МГц |
| TIM9, TIM12 | общего назначения | 16 бит | 2 | нет | нет | TIM9 на APB2, TIM12 на APB1 |
| TIM10, TIM11, TIM13, TIM14 | общего назначения | 16 бит | 1 | нет | нет | TIM10, TIM11 на APB2, TIM13, TIM14 на APB1 |
| TIM6, TIM7 | базовый | 16 бит | 0 | нет | нет | оба, на APB1 |
Таблица составлена по таблице 4 даташитов DS5319 и DS8626. У STM32F103x8 и STM32F103xB четыре таймера: TIM1 и TIM2–TIM4. В старших линейках STM32F1 таймеров больше: TIM8 есть у high-density и XL-density, TIM6 и TIM7 — у них и у connectivity line, TIM9–TIM14 — только у XL-density (RM0008, разделы 14–17). Кроме этих таймеров у ядра Cortex-M есть системный таймер SysTick, а у микроконтроллера — сторожевые IWDG и WWDG, которые рассчитывает калькулятор сторожевых таймеров.
Предделитель у всех таймеров 16-битный и делит на любое целое от 1 до 65536. Базовые TIM6 и TIM7 не имеют каналов и выводов: они нужны для отсчёта времени и для запуска ЦАП (RM0008, раздел 17.1).
Тактирование: почему таймер считает вдвое быстрее шины
Таймеры получают такт от своей шины APB по простому правилу: если делитель шины равен 1, частота таймеров равна частоте шины, иначе — удвоенной частоте шины (RM0008, раздел 7.2; RM0090, раздел 7.2). Отсюда частоты в типовых конфигурациях:
| Микроконтроллер | SYSCLK | APB1 | Таймеры APB1 | APB2 | Таймеры APB2 |
|---|---|---|---|---|---|
| STM32F103 | 72 МГц | 36 МГц (÷2) | 72 МГц | 72 МГц (÷1) | 72 МГц |
| STM32F407 | 168 МГц | 42 МГц (÷4) | 84 МГц | 84 МГц (÷2) | 168 МГц |
У STM32F42x/43x бит TIMPRE регистра RCC_DCKCFGR позволяет поднять частоту таймеров до HCLK. Частоты шин и таймеров для любой конфигурации тактирования показывает калькулятор тактирования STM32. Предельное разрешение таймера — один период такта: 13,9 нс при 72 МГц у STM32F103 (DS5319, таблица 40), 5,95 нс при 168 МГц у таймеров APB2 STM32F407 (DS8626, таблица 53).
Таймер можно тактировать и снаружи: от входа ETR или канала TI1/TI2 (внешний такт, режимы 1 и 2) или от выхода другого таймера. Частота внешнего такта — не выше половины частоты таймера: 36 МГц при 72 МГц (DS5319, таблица 40).
Счётчик: PSC, ARR и событие обновления
Основа таймера — 16-битный (у TIM2 и TIM5 STM32F4 — 32-битный) счётчик CNT, предделитель PSC и регистр автоперезагрузки ARR (RM0008, раздел 14.3.1). Счётчик считает импульсы с частотой
и в режиме счёта вверх идёт от 0 до ARR, затем начинает сначала и формирует событие обновления UEV — оно ставит флаг UIF, может вызвать прерывание или запрос DMA. Период событий обновления
Например, прерывание каждую миллисекунду на STM32F103 с таймером на 72 МГц: PSC = 71 даёт счёт 1 МГц, ARR = 999 — 1000 отсчётов, то есть 1 кГц. Те же формулы использует драйвер ST: макросы __LL_TIM_CALC_PSC и __LL_TIM_CALC_ARR в stm32f1xx_ll_tim.h. Самый длинный период 16-битного таймера на 72 МГц без предделителя — 910 мкс, с наибольшим предделителем — 59,6 с (DS5319, таблица 40).
Режимов счёта три (поля DIR и CMS регистра CR1):
- вверх — от 0 до ARR, событие обновления при переполнении;
- вниз — от ARR до 0, событие при опустошении;
- по центру — от 0 до ARR − 1, затем от ARR вниз до 1 (RM0008, раздел 14.3.2): события и при переполнении, и при опустошении, период вдвое длиннее. Три варианта CMS различаются только тем, на каком ходе счёта ставятся флаги сравнения.
Если ARR равен нулю, счётчик стоит (RM0008, 14.4.12). После сброса ARR = 0xFFFF, а у 32-битных TIM2 и TIM5 STM32F4 — 0xFFFF FFFF (RM0090, 18.4.12).
Буферизация и бит UG
Регистры PSC, ARR и CCR буферизованы: программа пишет в предварительный регистр, а рабочий обновляется на событии обновления. У PSC это так всегда, у ARR — при ARPE = 1 в CR1, у CCR — при OCxPE = 1 в CCMRx. Поэтому новые значения не рвут текущий период ШИМ, но и в самом начале работы попадают в рабочие регистры только после первого переполнения. Чтобы таймер сразу начал с правильными значениями, перед запуском записывают единицу в бит UG регистра EGR — это программное событие обновления (RM0008, раздел 14.3.9). Если при этом не нужно прерывание, сначала ставят URS = 1: тогда UIF выставляется только переполнением.
У TIM1 и TIM8 есть ещё счётчик повторений RCR: событие обновления формируется не на каждом переполнении, а на каждом RCR + 1. В режиме ШИМ по фронту RCR + 1 — это число периодов ШИМ, по центру — число полупериодов (RM0008, разделы 14.3.3 и 14.4.13).
ШИМ
Режимы ШИМ 1 и 2 включаются кодами 110 и 111 в поле OCxM регистра CCMRx (RM0008, раздел 14.3.9). В режиме 1 при счёте вверх опорный сигнал OCxREF держит единицу, пока CNT < CCRx, и ноль после; режим 2 — обратный. Полярность вывода отдельно меняет бит CCxP регистра CCER, а сам выход включает бит CCxE.
ШИМ по фронту (счёт вверх):
Если CCR больше ARR, выход постоянно в единице — скважность 100 %; если CCR = 0, постоянно в нуле. При счёте вниз в режиме 1 нулевая скважность невозможна (RM0008, раздел 14.3.9).
ШИМ по центру: счётчик идёт от 0 до ARR и обратно, импульс симметричен относительно вершины, период равен 2 · ARR отсчётам:
Такой ШИМ применяют для двигателей: фронты разных фаз не совпадают, а середина импульса удобна для запуска АЦП и измерения тока. RM0008 советует не писать в CNT, пока таймер считает по центру, и перед запуском формировать событие обновления битом UG.
Чем выше частота ШИМ, тем меньше ступеней скважности: при PSC = 0 их ARR + 1. Наибольшая частота при заданном разрешении для ШИМ по фронту:
| Разрешение | ARR | Таймер 72 МГц (STM32F103) | Таймер 168 МГц (TIM1, TIM8 STM32F407) |
|---|---|---|---|
| 8 бит | 255 | 281,25 кГц | 656,25 кГц |
| 10 бит | 1023 | 70,3 кГц | 164,1 кГц |
| 12 бит | 4095 | 17,6 кГц | 41,0 кГц |
| 16 бит | 65535 | 1,10 кГц | 2,56 кГц |
По центру частоты вдвое ниже. Перевести скважность в среднее напряжение, ток светодиода или период поможет калькулятор ШИМ.
Выходы TIM1 и TIM8: MOE
У расширенных таймеров кроме бита CCxE есть общий ключ выходов — бит MOE регистра BDTR. После сброса MOE = 0, и каналы не выдают сигнал, хотя счётчик и сравнение работают (RM0008, раздел 14.3.12). Это самая частая причина «неработающего» ШИМ на TIM1: установите TIM1->BDTR |= TIM_BDTR_MOE или бит AOE, чтобы MOE ставился на каждом событии обновления.
Комплементарные выходы и мёртвое время
У каналов 1–3 TIM1 и TIM8 есть второй, инверсный выход CHxN. Пара CHx и CHxN управляет верхним и нижним ключами полумоста, и между выключением одного ключа и включением другого генератор вставляет паузу — мёртвое время, чтобы оба транзистора не оказались открыты одновременно (RM0008, раздел 14.3.11). Длительность задаёт поле DTG[7:0] регистра BDTR (RM0008, 14.4.18):
| DTG[7:5] | Мёртвое время | Шаг |
|---|---|---|
| 0xx | DTG[7:0] · t_dtg | t_dtg = t_DTS |
| 10x | (64 + DTG[5:0]) · t_dtg | t_dtg = 2 · t_DTS |
| 110 | (32 + DTG[4:0]) · t_dtg | t_dtg = 8 · t_DTS |
| 111 | (32 + DTG[4:0]) · t_dtg | t_dtg = 16 · t_DTS |
Период t_DTS — такт таймера, умноженный на 1, 2 или 4 по полю CKD регистра CR1. Пример из RM0008: при t_DTS = 125 нс (8 МГц) доступны 0–15 875 нс с шагом 125 нс, 16–31,75 мкс с шагом 250 нс, 32–63 мкс с шагом 1 мкс и 64–126 мкс с шагом 2 мкс. Ту же формулу реализует макрос __LL_TIM_CALC_DEADTIME драйвера LL. Для 1 мкс:
- STM32F103, таймер 72 МГц, CKD = 00: t_DTS = 13,9 нс, 1000/13,9 = 72 — DTG = 72 (0x48), первый диапазон;
- STM32F407, TIM1 на 168 МГц: t_DTS = 5,95 нс, нужно 168 шагов — больше 127, поэтому второй диапазон с шагом 11,9 нс: 64 + 20 = 84 шага, DTG = 0x80 + 20 = 0x94.
Аварийное отключение: BRK
Вход BKIN — аварийная остановка выходов, например по сигналу компаратора перегрузки по току. Источником может быть и сбой кварца, обнаруженный системой CSS. Функция включается битом BKE, полярность — битом BKP регистра BDTR. При срабатывании бит MOE сбрасывается асинхронно, и выходы переходят в безопасные уровни, заданные битами OISx и OISxN регистра CR2, — это работает даже без тактового сигнала (RM0008, раздел 14.3.12). Вернуть выходы может только программа, записав MOE = 1, или бит AOE на следующем событии обновления. Поля LOCK регистра BDTR запрещают менять мёртвое время, полярности и настройки BRK до сброса — защита от сбойного кода в силовой электронике.
Захват: измерение частоты и длительности
В режиме захвата (CCxS ≠ 00 в CCMRx) регистр CCRx запоминает значение счётчика по фронту на входе канала и ставит флаг CCxIF; если новый захват пришёл, пока флаг не сброшен, ставится флаг потери CCxOF (RM0008, раздел 14.3.6). Перед захватом сигнал проходит:
- цифровой фильтр ICxF: фронт принимается, только если N отсчётов подряд показали новый уровень. Пример RM0008: сигнал дребезжит до 5 тактов — выбирают фильтр на 8 отсчётов, ICxF = 0011;
- выбор фронта битами CCxP и CCxNP: передний, задний или оба;
- предделитель ICxPSC: захват на каждом, втором, четвёртом или восьмом фронте.
Частота сигнала — частота счётчика, делённая на разность двух соседних захватов: f = fCNT/(CCRn − CCRn−1); разность считают в беззнаковой арифметике разрядности счётчика, тогда переполнение между захватами не мешает, если период меньше полного круга счёта.
Вход ШИМ (PWM input) измеряет период и длительность импульса одним таймером: оба канала 1 и 2 подключены к входу TI1, первый ловит передний фронт, второй — задний, а ведомый режим сброса (SMS = 100, TS = 101) обнуляет счётчик по каждому переднему фронту. Тогда CCR1 — период, CCR2 — длительность импульса (RM0008, раздел 14.3.7).
Режим энкодера
Инкрементальный энкодер подключают к каналам 1 и 2 без внешней логики. Режим выбирается полем SMS регистра SMCR: 001 — счёт по фронтам TI2, 010 — по фронтам TI1, 011 — по фронтам обоих сигналов (RM0008, раздел 14.3.16). В режиме 011 счётчик меняется на каждом фронте A и B — четыре отсчёта за период сигнала, то есть 4N отсчётов на оборот энкодера с N периодами. Направление определяет порядок фронтов, бит DIR показывает его аппаратно, а счётчик ходит между 0 и ARR — его надо задать до запуска.
Таблица 81 RM0008 описывает все сочетания: например, передний фронт TI1 при высоком уровне TI2 считает вниз, при низком — вверх. Фильтр и полярность входов работают как при захвате; для дифференциальных выходов энкодера RM0008 рекомендует компараторы, а индексный сигнал Z — подключить к линии EXTI и обнулять по нему счётчик. Энкодер и внешний такт в режиме 2 одновременно не работают.
Одиночный импульс
Бит OPM регистра CR1 останавливает счётчик на ближайшем событии обновления. Вместе с ведомым режимом запуска (SMS = 110) таймер выдаёт один импульс с заданной задержкой после фронта на входе: задержку задаёт CCR1, длительность — разность ARR − CCR1 (RM0008, раздел 14.3.15). Начальное значение счётчика должно быть меньше CCR1, а CCR1 — не больше ARR. В отсчётах: CCR1 = tDELAY · fCNT, ARR = (tDELAY + tPULSE) · fCNT — так считает макрос __LL_TIM_CALC_PULSE.
Связка таймеров
Таймер-ведущий выдаёт сигнал TRGO (поле MMS регистра CR2): событие обновления, совпадение канала, разрешение счёта. Ведомый принимает его по одной из линий ITR0–ITR3 (поле TS регистра SMCR) и в зависимости от SMS сбрасывается, считает только пока вход активен (стробирование), запускается или считает импульсы ведущего как внешний такт. Соединения линий фиксированы (RM0008, таблицы 82 и 86; RM0090, таблицы 94 и 98):
| Ведомый | ITR0 | ITR1 | ITR2 | ITR3 |
|---|---|---|---|---|
| TIM1 | TIM5 | TIM2 | TIM3 | TIM4 |
| TIM8 | TIM1 | TIM2 | TIM4 | TIM5 |
| TIM2 | TIM1 | TIM8 | TIM3 | TIM4 |
| TIM3 | TIM1 | TIM2 | TIM5 | TIM4 |
| TIM4 | TIM1 | TIM2 | TIM3 | TIM8 |
| TIM5 | TIM2 | TIM3 | TIM4 | TIM8 |
Если таймера-источника в микроконтроллере нет, соответствующая линия не работает. Так из двух 16-битных таймеров STM32F103 собирают 32-битный: TIM2 выдаёт TRGO на каждом переполнении (MMS = 010), а TIM3 по ITR1 считает эти события во внешнем режиме такта 1 (TS = 001, SMS = 111). Тем же сигналом TRGO таймеры запускают преобразования АЦП и ЦАП — коды источников описаны на страницах регистров АЦП STM32F1 и STM32F4.
DMA и отладка
Таймер может запрашивать DMA по событию обновления, по каналам и по триггеру (биты UDE, CCxDE и TDE регистра DIER). Так скважность меняется каждый период без участия процессора — например, при передаче данных светодиодам с последовательным интерфейсом или при формировании синуса. Режим пакетной передачи через регистры DCR и DMAR позволяет одним запросом обновить до 18 регистров таймера подряд (RM0008, 14.4.19).
Во время отладки таймеры по умолчанию продолжают считать, когда ядро остановлено на точке останова, и ШИМ двигателя продолжает работать. Чтобы таймер останавливался вместе с ядром, установите бит DBG_TIMx_STOP: у STM32F1 — в регистре DBGMCU_CR, у STM32F4 — в DBGMCU_APB1_FZ или DBGMCU_APB2_FZ.
Примеры на CMSIS
Прерывание каждую миллисекунду и ШИМ 1 кГц на канале 1 TIM2 (вывод PA0) у STM32F103 на 72 МГц:
#include "stm32f1xx.h"
void tim2_init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
/* PA0 = TIM2_CH1: alternate function push-pull, 2 MHz (MODE0 = 10, CNF0 = 10) */
GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0))
| GPIO_CRL_MODE0_1 | GPIO_CRL_CNF0_1;
TIM2->PSC = 71; /* 72 MHz / 72 = 1 MHz */
TIM2->ARR = 999; /* 1000 counts: 1 kHz, 1 ms */
TIM2->CCR1 = 250; /* 25 % duty */
TIM2->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; /* PWM mode 1 */
TIM2->CCER = TIM_CCER_CC1E;
TIM2->CR1 = TIM_CR1_ARPE;
TIM2->EGR = TIM_EGR_UG; /* load PSC, ARR and CCR1 now */
TIM2->SR = 0; /* UG has set UIF: clear it */
TIM2->DIER = TIM_DIER_UIE;
NVIC_EnableIRQ(TIM2_IRQn);
TIM2->CR1 |= TIM_CR1_CEN;
}
void TIM2_IRQHandler(void)
{
if (TIM2->SR & TIM_SR_UIF) {
TIM2->SR = ~TIM_SR_UIF; /* write 0 to clear, 1 leaves other flags */
/* 1 ms tick */
}
}
Режим энкодера на TIM3 STM32F407 (каналы 1 и 2 — PA6 и PA7 на AF2), счёт по обоим сигналам:
#include "stm32f4xx.h"
void encoder_init(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
/* PA6, PA7: alternate function AF2, pull-up for open-collector encoders */
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER6 | GPIO_MODER_MODER7))
| GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
GPIOA->PUPDR = (GPIOA->PUPDR & ~(GPIO_PUPDR_PUPD6 | GPIO_PUPDR_PUPD7))
| GPIO_PUPDR_PUPD6_0 | GPIO_PUPDR_PUPD7_0;
GPIOA->AFR[0] = (GPIOA->AFR[0] & ~(GPIO_AFRL_AFSEL6 | GPIO_AFRL_AFSEL7))
| (2U << GPIO_AFRL_AFSEL6_Pos) | (2U << GPIO_AFRL_AFSEL7_Pos);
TIM3->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0 /* TI1 and TI2 as inputs */
| (3U << TIM_CCMR1_IC1F_Pos) | (3U << TIM_CCMR1_IC2F_Pos); /* 8-sample filter */
TIM3->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; /* SMS = 011: count on both inputs */
TIM3->ARR = 0xFFFF;
TIM3->CR1 = TIM_CR1_CEN;
}
/* Position: (int16_t)TIM3->CNT, direction: TIM3->CR1 & TIM_CR1_DIR */
В обоих примерах регистры CCMR1, CCER и SMCR записываются целиком: после сброса они нулевые, и такая запись проще и понятнее. Регистры портов меняются только в полях своих выводов — почему это важно, объяснено в статье о GPIO STM32.
Частые ошибки
- Не учтено удвоение частоты — таймер на APB1 STM32F103 считает от 72 МГц, а не от 36 МГц, и период выходит вдвое короче расчётного.
- Нет бита UG перед запуском — первый период идёт со старыми PSC и ARR: после сброса это наибольший ARR и PSC = 0.
- Флаг UIF сразу после UG — программное событие обновления ставит флаг, и прерывание срабатывает сразу после включения. Сбросьте SR или установите URS перед UG.
- ШИМ на TIM1 не появляется — не установлен MOE в BDTR.
- Флаги сброшены через
&=— чтение-изменение-запись может стереть флаг, выставленный между чтением и записью. ПишитеTIMx->SR = ~TIM_SR_UIF: запись единицы флаги не меняет. - Частота ШИМ по центру вдвое ниже ожидаемой — период равен 2 · ARR отсчётам.
- CCR больше ARR — выход всё время в единице; это не ошибка таймера, а 100 % скважности.
- Ошибка в выборе линии ITR — связи таймеров фиксированы, проверяйте по таблице выше.
Частые вопросы
Как посчитать частоту ШИМ у STM32?
В режиме выравнивания по фронту f = f_TIM / ((PSC + 1) · (ARR + 1)), скважность — CCR / (ARR + 1). f_TIM — тактовая частота таймера: она равна частоте шины APB, если делитель шины 1, и вдвое выше, если делитель больше 1 (RM0008, раздел 7.2; RM0090, раздел 7.2). Например, у STM32F103 на 72 МГц PSC = 71 и ARR = 999 дают 1 кГц, а CCR = 250 — скважность 25 %. В режиме выравнивания по центру период вдвое длиннее: счётчик идёт до ARR и обратно.
Почему у STM32F103 таймер TIM2 считает от 72 МГц, если APB1 работает на 36 МГц?
Таймеры получают удвоенную частоту шины, если её делитель не равен 1. При 72 МГц шина APB1 обязана работать с делителем 2 (её предел — 36 МГц), поэтому TIM2, TIM3 и TIM4 тактируются 72 МГц. TIM1 на шине APB2 с делителем 1 тоже получает 72 МГц. У STM32F407 на 168 МГц таймеры APB1 считают от 84 МГц, таймеры APB2 — от 168 МГц.
Почему не работает ШИМ на TIM1 или TIM8?
У расширенных таймеров TIM1 и TIM8 есть общий ключ выходов — бит MOE регистра BDTR. После сброса он равен нулю, и каналы молчат, хотя счётчик и сравнение работают. Установите MOE (TIM1->BDTR |= TIM_BDTR_MOE) или бит AOE, чтобы MOE ставился автоматически. MOE сбрасывается аппаратно по входу аварийного отключения BKIN.
Как подключить энкодер к STM32?
Выходы A и B энкодера подают на каналы 1 и 2 таймера, в TIMx_SMCR пишут SMS = 011 — счёт по фронтам обоих сигналов, четыре отсчёта на каждый период сигнала. Входы настраивают как TI1 и TI2 (CC1S = 01, CC2S = 01), в ARR записывают предел счёта. Положение читается из CNT, направление — бит DIR. Сигнал индекса Z подключают к линии EXTI и обнуляют по нему счётчик.
Как задать мёртвое время на STM32?
Полем DTG регистра TIMx_BDTR у TIM1 и TIM8. При DTG < 128 мёртвое время равно DTG · t_DTS, дальше шаг растёт в 2, 8 и 16 раз. t_DTS — период такта таймера, умноженный на 1, 2 или 4 по полю CKD. У STM32F103 на 72 МГц шаг 13,9 нс, и 1 мкс — это DTG = 72; у STM32F407 на 168 МГц 1 мкс — DTG = 0x94 (84 шага по 11,9 нс). Подбирает значение макрос __LL_TIM_CALC_DEADTIME из драйвера LL.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — 7.2 — удвоение частоты таймеров; 14 — TIM1 и TIM8: счётчик, режимы счёта, счётчик повторений, захват, вход ШИМ, ШИМ по фронту и по центру (рисунки 84 и 85), мёртвое время и DTG, вход BRK, одиночный импульс, энкодер (таблица 81), таблица 82 — внутренние триггеры; 15 — TIM2–TIM5, таблица 86; 16 — TIM9–TIM14 (XL-density); 17 — TIM6 и TIM7
- STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — 7.2 — удвоение частоты таймеров у F405/407, 6.2 — у F42x/43x с битом TIMPRE; 17–20 — TIM1 и TIM8, TIM2–TIM5 (32-битные TIM2 и TIM5), TIM9–TIM14, TIM6 и TIM7; таблицы 94, 98 и 101 — внутренние триггеры
- STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — таблица 4 — таймеры TIM1–TIM4; таблица 40 — разрешение 13,9 нс, внешний такт до 36 МГц, период 16-битного счётчика до 910 мкс, наибольший счёт 59,6 с при 72 МГц
- STMicroelectronics. DS8626 Rev 12. STM32F405xx, STM32F407xx datasheet — таблица 4 — разрядность, каналы, DMA и наибольшие частоты всех таймеров; таблицы 52 и 53 — характеристики таймеров на APB1 и APB2
- STMicroelectronics. STM32CubeF1: драйвер LL (stm32f1xx_ll_tim.h) и заголовок CMSIS stm32f103xb.h — макросы __LL_TIM_CALC_PSC, __LL_TIM_CALC_ARR, __LL_TIM_CALC_DELAY, __LL_TIM_CALC_PULSE и __LL_TIM_CALC_DEADTIME — второй источник формул; имена битов для примеров
Нашли ошибку?
Смотрите также
- Таймер AVR и STM32Предделитель, OCRnA, PSC и ARR под частоту, мёртвое время, энкодер
- ЦАП на ШИМПульсации после RC, установление, разрешение
- Тактирование STM32PLL под нужную частоту, шины, флеш-память, регистры RCC и код
- GPIO STM32Режимы выводов, регистры F1 и F4, BSRR, AF, скорость, токи, 5 В, код
- STM32F1Cortex-M3: F100, F101, F102, F103, F105/107 — линейки и распиновки
- STM32F4Cortex-M4 с FPU: от F401 и F411 до F429 и F469 — линейки и распиновки
- Приоритеты прерываний NVICPRIGROUP, вытеснение и подприоритет, NVIC_IPR, AIRCR, bit-band