Здесь переведен перевод раздела даташита [1], посвященного таймеру/счетчику (Timer Counter, сокращенно TC).
TC включает три идентичных 16-битных канала таймера/счетчика. Каждый канал можно программировать независимо от других, чтобы они выполняли широкий спектр прикладных функций, таких как измерение частоты, подсчет событий, измерение интервалов времени, генерация импульсов, формирование задержек и генерация ШИМ (pulse width modulation, PWM).
У каждого канала имеется три внешних тактовых входа, пять внутренних тактовых входов и два многофункциональных входных/выходных сигнала, которые можно конфигурировать пользователем. Каждый канал управляет внутренним сигналом прерывания, который можно программировать для генерации прерываний процессора.
Блок TC имеет два глобальных регистра, который относится ко всем трем каналам TC. Block Control Register позволяет трем каналам запуститься одновременно одной инструкцией. Block Mode Register определяет внешние входы тактов для каждого канала, позволяя соединять их в цепочку.
Таблица 32-1 показывает присвоение входов тактов TC каналам 0..2.
Таблица 32-1. Назначение тактов для каналов TC.
Имя
Определение
TIMER_CLOCK1
MCK/2
TIMER_CLOCK2
MCK/8
TIMER_CLOCK3
MCK/32
TIMER_CLOCK4
MCK/128
TIMER_CLOCK5
MCK/1024
На рисунке показана блок-схема внутреннего устройства TC.
Рис. 32-1. Блок-схема Timer Counter.
Таблица 32-2. Описание имен сигналов.
Блок/канал
Имя сигнала
Описание
Сигнал канала
XC0, XC1, XC2
Входы внешнего тактирования
TIOA
Capture Mode: вход таймера/счетчика Waveform Mode: выход таймера/счетчика
TIOB
Capture Mode: вход таймера/счетчика Waveform Mode: вход или выход таймера/счетчика
INT
Выход сигнала прерывания
SYNC
Вход сигнала синхронизации
Таблица 32-3. Список выводов TC.
Имя вывода
Описание
Тип
TCLK0-TCLK2
Вход внешних тактов
Вход
TIOA0-TIOA2
I/O Line A
I/O (вход/выход)
TIOB0-TIOB2
I/O Line B
I/O (вход/выход)
[Зависимости TC]
Сигналы I/O. Эти ножки используются для подключения совместимых внешних устройств, которые могут мультиплексироваться с сигналами PIO. Программист сначала должен настроить контроллеры PIO, чтобы присвоить выводы TC их периферийным функциям [4].
//Ножка TIOA0 привязана к порту PB23 и периферийной функции A:
u32 periphAenable = AT91C_PB23_TIOA0;
u32 periphBenable =0;
//Настройка регистров PIO:
pPio->PIO_ASR = periphAenable; //Разрешение функции Peripheral A
pPio->PIO_BSR = periphBenable; //Запрет функции Peripheral B
pPio->PIO_PDR = (periphAenable | periphBenable);//Установка режима периферии
Управление питанием. TC тактируется через Power Management Controller (PMC) [2], поэтому программист должен предварительно сконфигурировать PMC, чтобы разрешить подачу тактов на Timer Counter.
Прерывание. У TC есть сигнал прерывания, подключенный к Advanced Interrupt Controller (AIC) [3]. Обработка прерывания TC требует программирования AIC перед конфигурированием TC.
[Функциональное описание TC]
Все три канала TC независимы друг от друга и работают идентично. Регистры для программирования канала описаны ниже в соответствующих врезках.
16-bit Counter. Каждый канал организован вокруг 16-разрядного счетчика. Значение этого счетчика инкрементируется на каждом положительном перепаде выбранного сигнала тактов. Когда счетчик достигает значения 0xFFFF и переваливает к значению 0x0000, происходит событие переполнения, и при этом устанавливается бит COVFS в регистре TC_SR (Status Register).
Текущее значение счетчика доступно в реальном времени путем чтения Counter Value Register, TC_CV. Счетчик может быть сброшен триггером. В этом случае значение счетчика перейдет к 0x0000 на следующем достоверном такте выбранного сигнала тактирования.
Выбор тактирования. На уровне блока входные сигналы тактов для каждого канала можно подключить ко внешним входам TCLK0, TCLK1 или TCLK2, или их можно подключить к внутренним сигналам ввода/вывода TIOA0, TIOA1 или TIOA2, чтобы каналы соединялись в цепочку. Это осуществляется программированием TC_BMR (Block Mode), см. рис. 32-2.
Рис. 32-2. Выбор соединения каналов в цепочку (Clock Chaining Selection).
Каждый канал независимо от других может быть настроен для выбора внутреннего или внешнего источника тактирования:
• Внутренние сигналы тактов: TIMER_CLOCK1, TIMER_CLOCK2, TIMER_CLOCK3, TIMER_CLOCK4, TIMER_CLOCK5. • Внешние сигналы тактов: XC0, XC1 или XC2.
Этот выбор осуществляется битами TCCLKS в регистре TC_CMR (Channel Mode Register).
Выбранный тактовый сигнал может быть проинвертирован битом CLKI в регистре TC_CMR. Это позволяет подсчитывать противоположные перепады тактового сигнала.
Burst-функция позволяет управлять тактовым сигналом с помощью внешней лог. 1. Параметр BURST в регистре TC_CMR определяет этот сигнал (none, XC0, XC1, XC2), см. рис. 32-3.
Примечание: в любых случаях, если используется внешний тактовый сигнал, длительность каждого из этих уровней должна быть больше, чем период главной тактовой частоты (master clock, MCK [2]). Внешняя тактовая частота должна быть как минимум в 2.5 раз ниже частоты master clock.
Рис. 32-3. Выбор тактовой частоты.
Управление тактированием. Тактовый сигнал для каждого счетчика может управляться двумя разными способами: его можно разрешить/запретить и запустить/остановить, см. рис. 32-4.
• Тактовая частота может быть разрешена или запрещена пользователем с помощью команд CLKEN и CLKDIS в регистре TC_CCR (TC Channel Control Register). В режиме захвата (Capture Mode) он может быть запрещен событием загрузки RB (RB load event), если установлен в 1 бит LDBDIS регистра TC_CMR. В режиме генерации сигнала (Waveform Mode) это может быть запрещено событием сравнения RC (RC Compare event), если установлен в 1 бит CPCDIS регистра TC_CMR. При запрете действия запуска или останова (start/stop actions) не дают никакого эффекта: только команда CLKEN в TC_CCR может повторно разрешить тактирование. Когда тактирование разрешено, устанавливается бит CLKSTA в регистре состояния таймера/счетчика TC_SR (TC Status Register).
• Тактирование может быть также запущено или остановлено событием, триггер (software, synchro, external или compare) всегда запускает тактирование. Тактирование может быть остановлено RB load event в Capture Mode (LDBSTOP = 1 в регистре TC_CMR) или событием RC Compare в Waveform Mode (CPCSTOP = 1 в регистре TC_CMR). Команды start и stop работают только когда тактирование разрешено.
Рис. 32-4. Управление тактированием.
Режимы работы TC. Каждый канал может независимо работать в двух разных режимах:
• Режим захвата Capture Mode, который может измерять длительности сигналов. • Режим генерации сигнала Waveform Mode.
Рабочий режим TC программируется битом WAVE в регистре TC_CMR (TC Channel Mode Register).
В Capture Mode сигналы TIOA и TIOB конфигурируются как входы. В Waveform Mode сигнал TIOA всегда конфигурируется как выход, и если TIOB не выбран как внешний триггер, он тоже конфигурируется как выход.
Триггер. Триггер сбрасывает счетчик и запускает тактирование счетчика. Три типа триггеров являются общими для обоих режимов Capture/Waveform, и для каждого из этих режимов четвертый внешний триггер.
Следующие триггеры являются общими для обоих режимов:
• Software Trigger: на каждом канале есть программный триггер, доступный установкой бита SWTRG в регистре TC_CCR. • SYNC: у каждого канала есть сигнал синхронизации SYNC. Когда этот сигнал выставлен, то он дает тот же эффект, что и программный триггер. Сигналы SYNC всех каналов устанавливаются одновременно записью TC_BCR (Block Control) с установленным битом SYNC. • Compare RC Trigger: на каждом канале реализовано сравнение RC, и это может предоставить триггер, когда значение счетчика совпадает со значением регистра RC, если в регистре TC_CMR установлен бит CPCTRG.
Канал может быть также сконфигурирован для внешнего триггера. В Capture Mode внешний триггер может быть выбран между сигналами TIOA и TIOB. В Waveform Mode внешнее событие может программироваться следующими сигналами: TIOB, XC0, XC1 или XC2. Это внешнее событие затем может быть запрограммировано для триггера путем установки ENETRG в регистре TC_CMR.
Если используется внешний триггер, то для надежного его детектирования длительность внешнего импульса должна быть больше, чем период master clock.
Независимо от того, какой триггер используется, его следует учитывать на следующем активном перепаде выбранной тактовой частоты. Это означает, что значение счетчика может быть прочитано отличным от нуля сразу после триггера, особенно когда в качестве тактов выбран сигнал с низкой частотой.
Capture Mode (режим захвата). В этот режим входят очисткой бита WAVE в регистре TC_CMR (Channel Mode Register). Capture Mode позволяет каналу TC измерять длительности и частоты импульсов сигналов TIOA и TIOB, их период, скважность и фазу. В этом режиме сигналы TIOA и TIOB обрабатываются как входы.
Рис. 32-5 показывает конфигурацию канала TC, когда он запрограммирован в Capture Mode.
Рис. 32-5. Capture Mode.
Регистры захвата A и B. Регистры RA и RB используются как регистры захвата. Это означает, что они могут быть загружены значением из счетчика, когда произошло настроенное событие на сигнале TIOA.
Параметр LDRA в регистре TC_CMR определяет перепад TIOA для загрузки регистра A, и параметр LDRB определяет перепад TIOA для загрузки регистра B.
RA будет загружен только если он не был загружен последними триггером, или если RB был загружен после последней загрузки RA.
RB будет загружен только если RA был загружен последним триггером или последней загрузкой RB.
Загрузка RA или RB перед чтением последнего загруженного значения установит флаг переполнения LOVRS (Overrun Error) в регистре TC_SR (Status Register). В этом случае старое значение будет перезаписано.
События триггера. В дополнение к сигналу SYNC, программному триггеру и триггеру сравнения RC Compare также можно определить внешний триггер.
Бит ABETRG в регистре TC_CMR выбирает в качестве внешнего триггера входные сигналы TIOA или TIOB. Параметр ETRGEDG определяет детектируемый перепад (нарастание уровня, его спад, или оба этих перепада) для генерации внешнего триггера. Если ETRGEDG = 0 (none), то внешний триггер запрещен.
Waveform Mode. В режим генерации сигнала входят установкой в 1 бита WAVE регистра TC_CMR (Channel Mode Register). Этот режим канала TC генерирует 1 или 2 сигнала PWM с одинаковой частотой и независимо программируемой скважностью, либо генерирует разные типы одиночных или повторяющихся импульсов.
В этом режиме сигнал TIOA конфигурируется как выход, и если сигнал TIOB не используется как внешнее событие (параметр EEVT в TC_CMR), то он тоже конфигурируется как выход.
На рис. 32-6 показана конфигурация канала TC, когда он запрограммирован в режиме генерации сигнала (Waveform Operating Mode).
Рис. 32-6. Waveform Mode.
Выбор формы генерируемого сигнала. В зависимости от параметра WAVSEL в регистре TC_CMR (Channel Mode Register) меняется поведение TC_CV.
С любым выбором все регистры RA, RB и RC могут использоваться как регистры сравнения.
RA Compare используется для управления выходом TIOA, RB используется для управления выходом TIOB (если он корректно сконфигурирован), и RC Compare используется для управления выходами TIOA и/или TIOB.
WAVSEL = 00
При WAVSEL = 00 значение TC_CV инкрементируется от 0x0000 к 0xFFFF. Как только достигнуто значение 0xFFFF, TC_CV сбрасывается. Инкремент TC_CV начинается заново, и цикл повторяется, см. рис. 32-7.
Рис. 32-7. WAVSEL= 00 без триггера.
Событие внешнего или программного триггера может сбросить значение TC_CV. Важно отметить, что триггер может произойти в любой момент времени, см. рис. 32-8.
Рис. 32-8. WAVSEL= 00 с триггером.
В этой конфигурации RC Compare не может быть запрограммировано для генерации триггера. В то же время RC Compare может остановить тактирование счетчика (CPCSTOP = 1 в регистре TC_CMR) и/или запретить тактирование счетчика (CPCDIS = 1 в регистре TC_CMR).
WAVSEL = 10
При WAVSEL = 10 значение TC_CV инкрементируется о 0 до значения RC, затем автоматически сбрасывается при при RC Compare. Как только TC_CV был сброшен, он начинает инкрементироваться снова, и так далее. См. рис. 32-9.
Рис. 32-9. WAVSEL= 10 без триггера.
Важно отметить, что TC_CV может быть сброшен в любой момент внешним событием или программным триггером, если они оба правильно запрограммированы. См. рис. 32-10.
Рис. 32-10. WAVSEL= 10 с триггером.
Дополнительно RC Compare может остановить тактирование счетчика (CPCSTOP = 1 в регистре TC_CMR) и/или запретить тактирование счетчика (CPCDIS = 1 в регистре TC_CMR).
WAVSEL = 01
При WAVSEL = 00 значение TC_CV инкрементируется от 0x0000 к 0xFFFF. Как только достигнуто значение 0xFFFF, TC_CV декрементируется до 0x0000, затем снова переходит к инкременту, и так далее. См. рис. 32-11.
Рис. 32-11. WAVSEL = 01 без триггера.
Такой триггер, как внешнее событие или программный триггер, может в любой момент времени модифицировать TC_CV. Если триггер сработал при инкременте TC_CV, то TC_CV начнет декрементироваться. Если триггер произошел при декременте TC_CV, то TC_CV начнет инкрементироваться. См. рис. 32-12.
Рис. 32-12. WAVSEL = 01 с триггером.
В этой конфигурации RC Compare не может быть запрограммировано.
В то же время RC Compare может остановить тактирование счетчика (CPCSTOP = 1 в регистре TC_CMR) и/или запретить тактирование счетчика (CPCDIS = 1 в регистре TC_CMR).
WAVSEL = 11
При WAVSEL = 11 значение TC_CV инкрементируется от 0 до RC. Как только достигнуто значение RC, значение TC_CV начинает декрементироваться до 0, затем снова начинает инкрементироваться до RC и так далее. См. рис. 32-13.
Рис. 32-13. WAVSEL = 11 без триггера.
Такой триггер, как внешнее событие или программный триггер, может в любой момент времени модифицировать TC_CV. Если триггер сработал при инкременте TC_CV, то TC_CV начнет декрементироваться. Если триггер произошел при декременте TC_CV, то TC_CV начнет инкрементироваться. См. рис. 32-14.
Рис. 32-14. WAVSEL = 11 с триггером.
RC Compare может остановить тактирование счетчика (CPCSTOP = 1 в регистре TC_CMR) и/или запретить тактирование счетчика (CPCDIS = 1 в регистре TC_CMR).
Внешние события, условия триггера. Внешнее событие может быть запрограммировано для детектирования одного из источников тактирования (XC0, XC1, XC2) или TIOB. Тогда выбранное внешнее событие может использоваться как триггер.
Параметр EEVT в регистре TC_CMR выбирает внешний триггер. Параметр EEVTEDG определяет перепад триггера для каждого из возможных внешних триггеров (нарастание уровня, спад уровня, или оба этих перепада). Если EEVTEDG очищен (none), то внешнее событие не определено.
Если TIOB определен как внешний сигнал события (EEVT = 0), то TIOB больше не используется как выход, и регистр сравнения B не используется для генерации сигналов и соответственно не генерирует запросов прерываний (IRQ). В этом случае этот канал TC может генерировать сигнал только на TIOA.
Когда внешнее событие определено, оно может использоваться в качестве триггера путем установки бита ENETRG в регистре TC_CMR.
В Capture Mode сигнал SYNC и программный триггер также доступны как триггеры. RC Compare также можно использовать как триггер, в зависимости от параметра WAVSEL.
Контроллер выхода. Контроллер выхода определяет изменения выходного уровня на TIOA и TIOB в соответствии с событием. Управление TIOB используется только если TIOB настроен как выход (не как источник внешнего события).
Следующие события управляют выходами TIOA и TIOB: программный триггер, внешнее событие или RC Compare. RA Compare управляет TIOA, и RB Compare управляет TIOB. Каждое из этих событий может быть запрограммировано для установки, очистки или переключения выхода, как это определено соответствующим параметром в TC_CMR.
[Интерфейс программирования TC (регистры)]
Таблица 32-4. Отображение регистров таймера/счетчика на адресное пространство(1).
Смещение
Регистр
Имя
Доступ
Сброс
0x00 + channel · 0x40 + 0x00
Регистр управления каналом
TC_CCR
WO
-
0x00 + channel · 0x40 + 0x04
Регистр режима канала
TC_CMR
RW
0
0x00 + channel · 0x40 + 0x08
Зарезервировано
0x00 + channel · 0x40 + 0x0C
0x00 + channel · 0x40 + 0x10
Значение счетчика
TC_CV
RO
0
0x00 + channel · 0x40 + 0x14
Регистр A
TC_RA
RW(2)
0
0x00 + channel · 0x40 + 0x18
Регистр B
TC_RB
RW(2)
0
0x00 + channel · 0x40 + 0x1C
Регистр C
TC_RC
RW
0
0x00 + channel · 0x40 + 0x20
Регистр состояния
TC_SR
RO
0
0x00 + channel · 0x40 + 0x24
Регистр разрешения прерываний
TC_IER
WO
-
0x00 + channel · 0x40 + 0x28
Регистр запрета прерываний
TC_IDR
WO
-
0x00 + channel · 0x40 + 0x2C
Регистр маски прерываний
TC_IMR
RO
0
0xC0
Регистр управления блоком
TC_BCR
WO
-
0xC4
Регистр режима блока
TC_BMR
RW
-
0xFC
Зарезервировано
Примечания:
1. Индекс канала (channel) может быть в диапазоне от 0 до 2. 2. Только для чтения (read-only, RO), если WAVE = 0. 3. WO (write-only) означает доступ только на запись, RW (read-write) означает полный доступ на чтение и запись, RO (read-only) означает доступ только на чтение.
0 = событие RC Compare не оказывает никакого эффекта на счетчик и его тактирование. 1 = событие RC Compare сбрасывает счетчик и запускает его тактирование.
WAVE
0 = разрешен режим сравнения (активен Capture Mode). 1 = запрещен режим сравнения (активен Waveform Mode).
LDRA: RA Loading Selection (выбор перепадов загрузки RA)
Регистр режима канала TC в режиме генерации сигнала (WAVE = 1). Тип доступа: полный (RW).
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
BSWTRG
BEEVT
BCPC
BCPB
ASWTRG
AEEVT
ACPC
ACPA
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
WAVE
WAVSEL
ENETRG
EEVT
EEVTEDG
CPCDIS
CPCSTOP
BURST
CLKI
TCCLKS
TCCLKS: Clock Selection (выбор тактирования)
TCCLKS
Выбранный источник тактов
0
0
0
TIMER_CLOCK1
0
0
1
TIMER_CLOCK2
0
1
0
TIMER_CLOCK3
0
1
1
TIMER_CLOCK4
1
0
0
TIMER_CLOCK5
1
0
1
XC0
1
1
0
XC1
1
1
1
XC2
CLKI: Clock Invert (инверсия тактов)
0 = счетчик инкрементируется фронтом нарастания лог. уровня сигнала тактов. 1 = счетчик инкрементируется срезом спада лог. уровня сигнала тактов.
BURST: Burst Signal Selection (выбор внешнего сигнала управления тактированием)
BURST
Как работает управление тактированием
0
0
Тактовая частота не подается постоянно (нет внешнего управления)
0
1
XC0 && выбранный сигнал тактов
1
0
XC1 && выбранный сигнал тактов
1
1
XC2 && выбранный сигнал тактов
CPCSTOP: Counter Clock Stopped with RC Compare (останавливать тактирование при RC Compare)
0 = тактирование счетчика не останавливается, когда счетчик достигает значения регистра RC. 1 = тактирование счетчика останавливается, когда счетчик достигает значения регистра RC.
CPCDIS: Counter Clock Disable with RC Compare (запрещать тактирование при RC Compare)
0 = тактирование счетчика не запрещается, когда счетчик достигает значения регистра RC. 1 = тактирование счетчика запрещается, когда счетчик достигает значения регистра RC.
Примечание (1): если TIOB выбирается как сигнал внешнего события, то TIOB конфигурируется как вход, и не может больше использоваться для генерации сигналов, и следовательно для генерации запросов прерывания (IRQ).
0 = внешнее событие никак не влияет на счетчик и его тактирование. В этом случае выбранное внешнее событие только лишь управляет выходом TIOA. 1 = внешнее событие сбрасывает счетчик и запускает его тактирование.
Регистр состояния таймера/счетчика. Тип доступа: только чтение (RO).
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
-
-
-
-
-
-
-
-
-
-
-
-
-
MTIOB
MTIOA
CLKSTA
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
-
-
-
-
-
-
-
-
ETRGS
LDRBS
LDRAS
CPCS
CPBS
CPAS
LOVRS
COVFS
COVFS: Counter Overflow Status (было ли переполнение счетчика)
0 = с момента последнего чтения Status Register не было переполнения счетчика. 1 = с момента последнего чтения Status Register было переполнение счетчика.
LOVRS: Load Overrun Status (был ли пропуск загрузки)
0 = не было пропуска загрузки с момента последнего чтения Status Register, или WAVE = 1. 1 = RA или RB был как минимум дважды загружен без чтения соответствующего регистра с момента последнего чтения Status, если WAVE = 0.
CPAS: RA Compare Status (состояние сравнения RA)
0 = не было RA Compare с момента последнего чтения Status Register, или WAVE = 0. 1 = произошло RA Compare с момента последнего чтения Status Register, если WAVE = 1.
CPBS: RB Compare Status (состояние сравнения RB)
0 = не было RB Compare с момента последнего чтения Status Register, или WAVE = 0. 1 = произошло RB Compare с момента последнего чтения Status Register, если WAVE = 1.
CPCS: RC Compare Status (состояние сравнения RC)
0 = не было RC Compare с момента последнего чтения Status Register, или WAVE = 0. 1 = произошло RC Compare с момента последнего чтения Status Register, если WAVE = 1.
LDRAS: RA Loading Status (состояние загрузки RA)
0 = не было загрузки RA с момента последнего чтения Status Register, или WAVE = 1. 1 = была загрузка RA с момента последнего чтения Status Register, если WAVE = 0.
LDRBS: RB Loading Status (состояние загрузки RB)
0 = не было загрузки RB с момента последнего чтения Status Register, или WAVE = 1. 1 = была загрузка RB с момента последнего чтения Status Register, если WAVE = 0.
ETRGS: External Trigger Status (состояние внешнего триггера)
0 = не было срабатывания внешнего триггера с момента последнего чтения Status Register. 1 = было срабатывание внешнего триггера с момента последнего чтения Status Register.
CLKSTA: Clock Enabling Status (состояние разрешения тактирования)
0 = такты запрещены. 1 = такты разрешены.
MTIOA: TIOA Mirror (лог. уровень на TIOA)
0 = TIOA в лог. 0. Если WAVE = 0, то это означает, что ножка TIOA (вход) в лог. 0. Если WAVE = 1, то это означает, что на TIOA (выход) выведен уровень лог. 0. 1 = TIOA в лог. 1. Если WAVE = 0, то это означает, что ножка TIOA (вход) в лог. 1. Если WAVE = 1, то это означает, что на TIOA (выход) выведен уровень лог. 1.
MTIOB: TIOB Mirror (лог. уровень на TIOB)
0 = TIOB в лог. 0. Если WAVE = 0, то это означает, что ножка TIOB (вход) в лог. 0. Если WAVE = 1, то это означает, что на TIOB (выход) выведен уровень лог. 0. 1 = TIOB в лог. 1. Если WAVE = 0, то это означает, что ножка TIOB (вход) в лог. 1. Если WAVE = 1, то это означает, что на TIOB (выход) выведен уровень лог. 1.