Синхронизация таймеров (ведущий и ведомый)
Таймеры STM32 соединены внутри кристалла: один может запускать, останавливать, сбрасывать или тактировать другой без участия программы. Так получают 32-битный счётчик из двух 16-битных, одновременный старт нескольких ШИМ или запуск АЦП в нужной точке периода.
Обновлено Редакция GAW
Синхронизация таймеров — связь таймеров STM32 внутри кристалла, при которой один таймер (ведущий, master) выдаёт сигнал триггера TRGO, а другой (ведомый, slave) по этому сигналу сбрасывается, запускается, останавливается или считает его импульсы. Ведущий выбирает, что выдать на TRGO, полем MMS в TIMx_CR2; ведомый выбирает источник полем TS и действие полем SMS в TIMx_SMCR (RM0090, разд. 18.3.15). Всё это работает аппаратно, без прерываний и задержек программы.
Что выдаёт ведущий
| MMS | Сигнал TRGO |
|---|---|
| 000 | Reset — бит UG |
| 001 | Enable — разрешение счёта CNT_EN |
| 010 | Update — событие обновления |
| 011 | Compare 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. Номер входа у каждой пары таймеров свой, поэтому его смотрят в таблице, а не подбирают.
Источники
- 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
- 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: те же режимы ведущего и ведомого
Нашли ошибку?
Смотрите также
- Таймеры STM32Тактирование, PSC/ARR, ШИМ, мёртвое время, захват, энкодер, OPM, синхронизация
- Событие обновления (UEV)Момент, когда таймер применяет новые ARR, PSC и CCRx
- Одноимпульсный режим (OPM)Один импульс заданной длины после задержки по внешнему триггеру
- Режим энкодера таймераАппаратный счёт сигналов A и B инкрементального энкодера
- АЦП STM32Группы каналов, режимы, триггеры, DMA, калибровка, датчик температуры, точность