- Лоботрясы

Поиск
Перейти к контенту

Главное меню:

Статьи по STM32

Читать в Яндекс.Подписках



    STM32. Выбор режима и источника тактирования 
Просмотров: 2452
Режимы тактирования
 
     После «небольшого» перерыва, продолжаем грызть STM32 :-)
     Разберёмся подробнее с режимами тактирования счётчика. Помимо стандартного счёта вверх, счётчик можно настроить и на счёт вниз, при этом можно выбрать режим выравнивания по центру (счёт вверх-вниз) или по фронту.
 
     Режим выравнивания по фронту
     С обычным режимом счёта вверх мы уже сталкивались.
     В режиме счёта вниз, счётчик считает со значения в регистре автоперезагрузки TIMx_ARR до нуля, после чего происходит его перезагрузка значением, находящимся в TIMx_ARR и генерируется событие переполнения счётчика. После каждого переполнения (т.е. обнуления) будет генерироваться событие обновления UEV, а также устанавливаться флаг прерывания по событию обновления UIF (в регистре статуса TIMx_SR). Для выбора режима счёта вниз (декрементации) необходимо установить в «1» бит DIR регистра TIMx_CR1 (см. 1 часть про таймеры).
 
     Режим выравнивания по центру.
     В этом режиме счётчик считает вверх-вниз: сначала он считает от 0 до значения TIMx_ARR - 1 (при этом возникает событие переполнения), а потом считает со значения TIMx_ARR до 1 (генерируется событие обнуления). После этого счётчик перезапускается опять с нуля. Содержимое регистра направления счёта DIR обновляется аппаратно, т.е. трогать его не стоит ;-)
 
     Для выбора режима счёта, необходимо провести небольшие манипуляции с регистром TIMx_CR1, а именно – с битами CMS (а биты CKD пригодятся при рассмотрении выбора источника тактирования чуть ниже :-)
CKD: деление тактового сигнала (Clock_Division) – эти биты указывают соотношение между частотой тактирования таймера (CK_INT) и частотой сигнала синхронизации, используемого в цифровых фильтрах (ETRTIx)
00: tDTS = tCK_INT
01: tDTS = 2 × tCK_INT
10: tDTS = 4 × tCK_INT
CMS: выбор режима выравнивания по центру
00 – Режим выравнивания по фронту (Edge-aligned mode). Счетчик считает вверх или вниз в зависимости от бита направления (DIR).
01 – Режим 1 выравнивания по центру (Center-aligned mode 1). Счетчик считает вверх и вниз поочередно. Флаги прерывания сравнения выхода каналов, настроенных на выход (CCxS=00 в регистре TIMx_CCMRx) устанавливаются только тогда, когда счетчик считает вниз.
10 – Режим 2 выравнивания по центру (Center-aligned mode 2). Счетчик считает вверх и вниз поочередно. Флаги прерывания сравнения выхода каналов, настроенных на выход (CCxS=00 в регистре TIMx_CCMRx) устанавливаются только тогда, когда счетчик считает вверх.
11 – Режим 3 выравнивания по центру (Center-aligned mode 3). Счетчик считает вверх и вниз поочередно. Флаги прерывания сравнения выхода каналов, настроенных на выход (CCxS=00 в регистре TIMx_CCMRx) устанавливаются только тогда, когда счетчик считает вверх или вниз.
Note: не допускается переключение с режима выравнивания по фронту в режим с выравниванием по центру при включенном счётчике (CEN=1)!
DIR: направление
0 – счётчик считает вверх
1 – счётчик считает вниз
 
Выбор источника тактирования
     Как уже рассматривалось в одной из предыдущих частей, тактирование счётного регистра TIMx_CNT может осуществляться следующими источниками:
- Внутренний источник тактирования (CK_INT);
- Внешний вход TIx ();
- Вход внешнего запуска ETR (режим 2 внешнего тактирования). Режим очень похож на режим 1, однако наличие входного предделителя даёт возможность деления тактового сигнала на коэффициенты 1/2/4/8);
- Вход внутреннего запуска ITRx. В этом режиме один таймер используется как предделитель для другого таймера, например, можно сконфигурировать Timer1 как предделитель для Timer2.
 
     Перед рассмотрением примеров выбора источника тактирования, глянем, какие регистры (и биты) нам для этого понадобятся.
 
     Регистр управления подчинённым режимом и источником тактирования (а также настройка параметров запуска, выбор режима энкодера) TIMx_SMCR
ETP: выбор полярности входа внешнего запуска ETR.
0 – ETR (вход внешнего запуска – см. рисунок!) неинвертирован. Активным является высокий уровень или возрастающий фронт сигнала
1 – ETR инвертирован. Активным является низкий уровень или ниспадающий фронт сигнала
ECE: разрешение внешнего тактирования. Этот бит активирует режим 2 внешнего тактирования (ETR)
0 – режим 2 отключён
1 – режим 2 включён. Счётчик тактируется любым активным фронтом на шине ETRF
ETPS: предделитель внешнего запуска
Частота сигнала внешнего запуска ETRP должна составлять не более ¼ внутренней частоты тактирования CK_INT (TIMxCLK). Поэтому, если на внешнем входе присутствует очень высокая частота, то её можно снизить с помощью предделителя.
00 – предделитель отключён
01 – частота ETRP делится на 2
10 – частота ETRP делится на 4
11 – частота ETRP делится на 8
ETF: фильтр внешнего запуска (для входа внешнего запуска ETR)
Эти биты определяют частоту, которая используется для выборки (создание сэмпла) сигнала ETRP и длины цифрового фильтра, применяемого к ETRP. Цифровой фильтр представляет собой счётчик событий, которому необходимо N событий, чтобы подтвердить передачу на выход.
0000 – Без фильтра, выборка делается на fDTS (см. бит CKD регистра TIMx_CR1)
0001 – fSAMPLING = fCK_INT, N = 2
0010 – fSAMPLING = fCK_INT, N = 4
0011 – fSAMPLING = fCK_INT, N = 8
0100 – fSAMPLING = fDTS / 2, N = 6
0101 – fSAMPLING = fDTS / 2, N = 8
0110 – fSAMPLING = fDTS / 4, N = 6
0111 – fSAMPLING = fDTS / 4, N = 8
1000 – fSAMPLING = fDTS / 8, N = 6
1001 – fSAMPLING = fDTS / 8, N = 8
1010 – fSAMPLING = fDTS / 16, N = 5
1011 – fSAMPLING = fDTS / 16, N = 6
1100 – fSAMPLING = fDTS / 16, N = 8
1101 – fSAMPLING = fDTS / 32, N = 5
1110 – fSAMPLING = fDTS / 32, N = 6
1111 – fSAMPLING = fDTS / 32, N = 8
TS: выбор запуска
Эти биты позволяют выбрать вход запуска, необходимый для синхронизации счётчика.
000 – Внутренний запуск 0 (ITR0).
001 – Внутренний запуск 1 (ITR1).
010 – Внутренний запуск 2 (ITR2).
011 – Внутренний запуск 3 (ITR3).
100 – Детектор фронта (Edge Detector) TI1 (TI1F_ED)
101 – Отфильтрованный вход 1 таймера (Filtered Timer Input) (TI1FP1)
110 – Отфильтрованный вход 2 таймера (TI2FP2)
111 – Вход внешнего запуска (External Trigger input) (ETRF)
Note: Эти биты должны изменяться только тогда, когда они не используются (SMS =000) для избежания неверного определения фронтов во время перехода!
SMS: выбор подчинённого режима (Slave mode selection)
Когда выбираются внешние сигналы, активный фронт сигнала запуска (TRGI) связывается с выбранной полярностью внешнего входа.
000 – режим подчинённого режима отключён – если CEN =1, то предделитель (PSC) тактируется напрямую от внутреннего источника (CK_INT)
001 – режим 1 энкодера – счётчик считает вверх/вниз по фронту TI2FP2 в зависимости от уровня TI1FP1
010 – режим 2 энкодера – счётчик считает вверх/вниз по фронту TI1FP1 в зависимости от уровня TI2FP2
011 – режим 3 энкодера – счётчик считает вверх/вниз по обоим фронтам TI1FP1 и TI2FP2 в зависимости от уровня другого входа
100 – режим сброса (Reset Mode) – возрастающий фронт выбранного входа запуска (TRGI) реинициализирует счётчик и генерирует обновление регистров
101 – режим стробирования (Gated Mode) – тактирование счётчика разрешено, когда на входе запуска (TRGI) присутствует высокий сигнал. Счётчик останавливается (но не сбрасывается), как только на входе запуска устанавливается низкий сигнал. И запуск и остановка счётчика являются управляемыми.
110 – режим запуска (Trigger Mode) – счётчик запускается по возрастающему фронту запуска TRGI (но не сбрасывается). Управляется только запуск счётчика.
111 – режим 1 внешнего тактирования – нарастающие фронты выбранного входа запуска (TRGI) тактируют счётчик.
Note: Режим стробирования не должен выбираться, если TI1F_ED выбран в качестве входа запуска (TS =100)!
  
     1-й регистр выбора и настройки режимов захват/сравнение (каналы CH1 и CH2) TIMx_CCMR1 (регистр TIMx_CCMR2 аналогичен этому, только предназначен для настройки каналов CH3 и CH4)
CC2S: выбор захвата/сравнения 2
Эти биты объявляют направление каналов (вход/выход) а также использование входа.
00 – канал CC2 конфигурируется в качестве выхода
01 – канал CC2 конфигурируется в качестве входа, IC2 (Input Capture – вход захвата (или канал захвата)) назначается на TI2
10 – канал CC2 конфигурируется в качестве входа, IC2 (Input Capture – вход захвата) назначается на TI1
11 – канал CC2 конфигурируется в качестве входа, IC2 (Input Capture – вход захвата) назначается на TRC ()
Запись в эти биты возможна, только когда канал отключен! (CC2E = 0 в регистре TIMx_CCER).
CC1S: выбор захвата/сравнения 1
Эти биты объявляют направление каналов (вход/выход) а также использование входа.
00 – канал CC1 конфигурируется в качестве выхода
01 – канал CC1 конфигурируется в качестве входа, IC1 (Input Capture – вход захвата) назначается на TI1
10 – канал CC1 конфигурируется в качестве входа, IC1 (Input Capture – вход захвата) назначается на TI2
11 – канал CC1 конфигурируется в качестве входа, IC1 (Input Capture – вход захвата) назначается на TRC ()
Запись в эти биты возможна, только когда канал отключен! (CC1E = 0 в регистре TIMx_CCER).
  
     А теперь рассмотрим примеры практической настройки на тот или иной режим тактирования :-)
 
1. Для работы таймера от внутреннего источника тактирования, биты SMS должны быть установлены в SMS =000. В этом режиме биты CEN, DIR и UG являются управляющими и могут изменяться только программно (исключение составляет бит UG, который очищается автоматически).
 
2. В режим 1 внешнего тактирования (внешний тактовый сигнал поступает на входы TIx) можно войти, установив SMS =111. В этом режиме счётчик может считать по нарастающему фронту или по ниспадающему срезу (фронту) поступающего сигнала.
Рассмотрим установку этого режима на примере тактирования по нарастающему фронту на входе TI2:
1) Для начала сконфигурируем нужный нам канал TI2 (2-й) на вход (установкой CC2S=01 в регистре TIMx_CCMR1)
2) Конфигурируем длительность входного фильтра с помощью битов IC2F регистра TIMx_CCMR1 (а если фильтр не нужен, то IC2F=0000)
3) Выбираем полярность нарастающего фронта (записью CC2P=0 и CC2NP=0 в регистре TIMx_CCER)
4) Настраиваем таймер на режим 1 внешнего тактирования (записью SMS=111 в регистре TIMx_SMCR)
5) Выбираем TI2 в качестве входа тактирования (записью TS =110 в регистре TIMx_SMCR)
6) Включаем тактирование счётчика (записью CEN =1 в регистре TIMx_CR1)
 
     Теперь, когда на входе появляется сигнал с нарастающим фронтом, счётчик считает и одновременно устанавливается флаг TIF (регистра статуса TIMx_SR).
 
3. Для выбора режима 2 внешнего тактирования (внешний тактовый сигнал поступает на вход ETR) нужно установить ECE =1 в регистре TIMx_SMCR. В этом режиме счётчик может считать по нарастающему или ниспадающему фронту поступающего сигнала. Как уже упоминалось выше, в этом режиме тактовая частота на входе ETR может делиться на коэффициенты 1/2/4/8.
Рассмотрим пример настройки этого режима, если нам необходимо тактирование счётчика при каждом втором нарастающем фронте на входе ETR:
1) Т.к. в этом примере фильтр нам не нужен, то записываем ETF =0000 в регистре TIMx_SMCR
2) Устанавливаем предделитель с коэффициентом деления на 2 (ETPS =01 в регистре TIMx_SMCR)
3) Выбираем определение сигнала на ETR по нарастающему фронту (ETP =0 в регистре TIMx_SMCR)
4) Разрешаем режим 2 внешнего тактирования (записью ECE =1 в регистре TIMx_SMCR)
5) Включаем тактирование счётчика (записью CEN =1 в регистре TIMx_CR1)
 
     Теперь счётчик будет считать при каждом 2-м нарастающем фронте на ETR.
 
4. Все таймеры TIMx связаны между собой для синхронизации или соединения в цепочку. Когда один из таймеров сконфигурирован в Master режим, то он может управлять сбросом, пуском, остановкой или тактированием счётчика другого таймера, сконфигурированного в режиме Slave (подчинённый режим).
Рассмотрим пример настройки таймера 1 в качестве предделителя для таймера 2:
1) Настраиваем таймер 1 в режим Master таким образом, чтобы на его выходе появлялся периодический сигнал запуска на каждое событие обновление UEV. Если записать MMS=010 в регистре TIMx_CR2, то всё время при генерации события обновления UEV на TRGO1 будет появляться нарастающий фронт выходного сигнала.
2) Для подключения выхода таймера 1 (TRGO1) к таймеру 2, таймер 2 должен быть настроен в Slave режим, используя ITR1 в качестве входа внутреннего запуска. Это можно сделать путём манипуляций с битами TS регистра TIMx_SMCR (TS =001).
3) Затем таймер 2 в подчинённом режиме (Slave) должен быть настроен на режим 1 внешнего тактирования (записью SMS=111 в регистре TIMx_SMCR). Это приводит к тактированию таймера 2 нарастающим фронтом периодического сигнала запуска таймера 1 (которое соответствует переполнению счётчика таймера 1).
4) И напоследок, тактирование обоих таймеров должно быть разрешено установкой соответствующих битов CEN =1 в соответствующих регистрах TIMx_CR1. ОБЯЗАТЕЛЬНО таймер 2 должен быть включён перед таймером 1!!!
Note: Если OCx выбран в таймере 1 в качестве выхода запуска (MMS=1хх), то его нарастающий фронт используется для тактирования счётчика таймера 2.

Опубликовано 25.11.2015
©Igoryosha, 2015
 
 
Назад к содержимому | Назад к главному меню