Перейти к содержанию

Синхронизация таймеров (ведущий и ведомый)

Таймеры STM32 соединены внутри кристалла: один может запускать, останавливать, сбрасывать или тактировать другой без участия программы. Так получают 32-битный счётчик из двух 16-битных, одновременный старт нескольких ШИМ или запуск АЦП в нужной точке периода.

Обновлено Редакция GAW

Синхронизация таймеров — связь таймеров STM32 внутри кристалла, при которой один таймер (ведущий, master) выдаёт сигнал триггера TRGO, а другой (ведомый, slave) по этому сигналу сбрасывается, запускается, останавливается или считает его импульсы. Ведущий выбирает, что выдать на TRGO, полем MMS в TIMx_CR2; ведомый выбирает источник полем TS и действие полем SMS в TIMx_SMCR (RM0090, разд. 18.3.15). Всё это работает аппаратно, без прерываний и задержек программы.

Что выдаёт ведущий

MMSСигнал TRGO
000Reset — бит UG
001Enable — разрешение счёта CNT_EN
010Update — событие обновления
011Compare Pulse — импульс при флаге CC1IF
100…111опорный сигнал канала OC1REF…OC4REF

Что делает ведомый

SMSРежим ведомого
100сброс — фронт триггера обнуляет счётчик и обновляет регистры
101стробирование — счёт идёт, пока триггер в высоком уровне
110триггер — фронт запускает счётчик, но не сбрасывает
111внешний такт 1 — счётчик считает фронты триггера

Коды 001–011 того же поля — это режим энкодера. Источником триггера служат внутренние входы ITR0…ITR3 от других таймеров или собственные входы таймера.

Типичные схемы

  • Каскад. Ведущий с MMS = 010 становится предделителем ведомого с SMS = 111 — так из двух 16-битных таймеров получается 32-битный счёт.
  • Окно счёта. Ведомый в режиме стробирования считает только тогда, когда опорный сигнал ведущего OC1REF активен (MMS = 100, SMS = 101) — пример RM0090.
  • Общий старт. Несколько таймеров ШИМ в режиме триггера стартуют от одного ведущего и работают со строго заданным сдвигом фаз.
  • Запуск по триггеру. Ведомый в одноимпульсном режиме выдаёт импульс через заданное время после события ведущего.

RM0090 требует включить тактирование ведомого до прихода событий от ведущего и не менять его на ходу. Тот же механизм есть у таймеров STM32F1 (RM0008, разд. 14.3.20, 15.3.15). Сигнал TRGO таймеров также служит внешним запуском для АЦП STM32.

Частые вопросы

Как сделать 32-битный счётчик из двух 16-битных таймеров?

По примеру RM0090 (разд. 18.3.15): первый таймер в режиме ведущего с MMS = 010 выдаёт импульс TRGO на каждом событии обновления, второй выбирает его через вход ITRx (поле TS) и в режиме внешнего такта 1 (SMS = 111) считает эти импульсы. Второй таймер становится старшей частью счёта, первый — младшей. У STM32F4 проще взять 32-битный TIM2 или TIM5.

Как запустить несколько таймеров одновременно?

Ведущему ставят MMS = 001 (Enable): на TRGO выходит сигнал разрешения счёта CNT_EN, и ведомые в режиме триггера (SMS = 110) стартуют по его фронту (RM0090, разд. 18.4.2–18.4.3). Бит MSM нужен, только если CNT_EN ведущего сам управляется его триггерным входом: тогда MSM задерживает действие триггера, чтобы ведущий и ведомые стартовали одновременно (RM0090, разд. 18.4.2–18.4.3).

Какой ITRx выбрать?

Связи между таймерами фиксированы и сведены в таблицу внутренних триггеров справочного руководства (у RM0090 — табл. 99). Например, в примере RM0090 выход TRGO TIM1 приходит на вход ITR0 таймера TIM2. Номер входа у каждой пары таймеров свой, поэтому его смотрят в таблице, а не подбирают.

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 18.3.15 — таймеры связаны внутри; ведущий может сбросить, запустить, остановить или тактировать ведомый; тактирование ведомого включают до прихода событий и не меняют на ходу; пример: TIM1 с MMS = 010 выдаёт TRGO на каждом UEV, TIM2 по ITR0 (TS = 000) в режиме внешнего такта 1 (SMS = 111) — предделитель; стробирование TIM2 сигналом OC1REF TIM1 (MMS = 100, SMS = 101); 18.4.2 — MMS: 000 Reset, 001 Enable, 010 Update, 011 Compare Pulse, 100…111 OC1REF…OC4REF; 18.4.3 — SMS: 001…011 энкодер, 100 сброс, 101 стробирование, 110 триггер, 111 внешний такт 1; табл. 99 — внутренние входы ITRx
  2. STMicroelectronics. RM0008 Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx, Rev 21 — разд. 14.3.20 (TIM1, TIM8) и 15.3.15 (TIM2…TIM5) — Timer synchronization у STM32F1: те же режимы ведущего и ведомого

Нашли ошибку?