Периодический интервальный таймер (Periodic Interval Timer, PIT) в микроконтроллерах ARM7 обычно используется для планировщика операционной системы, или отсчета реального времени в программе. Он разработан с целью обеспечения максимальной точности и эффективного управления.
Рис. 15-1. Блок-схема внутреннего устройства PIT.
Чаще всего PIT настраивается для генерации периодических прерываний, используемых операционными системами. PIT предоставляет программируемый переполняемый счетчик с возможность сброса при чтении. Счетчик построен на основе 2 счетчиков: 20-битный CPIV и 12-битный Periodic Interval Counter, PICNT. Оба счетчика работают на частоте Master Clock / 16.
Первый 20-битный счетчик CPIV инкрементируется от 0 до запрограммированного значения переполнения, которое устанавливается в поле PIV регистра режима (Mode Register, PIT_MR). Когда счетчик CPIV достигает этого значения, он сбрасывается в 0, и в этот момент инкрементирует счетчик PICNT. Бит состояния PITS в регистре Status Register (PIT_SR) устанавливается, и это может вызвать срабатывание прерывания, если оно разрешено (флагом PITIEN в регистре PIT_MR).
Запись нового значения PIV в регистр PIT_MR не сбрасывает и не перезапускает счетчики.
Когда CPIV и PICNT получены чтением регистра интервала (Periodic Interval Value Register, PIT_PIVR), счетчик переполнения (PICNT) сбрасывается, и флаг PITS очищается, что работает как подтверждение прерывания. Значение PICNT дает количество периодических интервалов, которое прошло с момента последнего чтения PIT_PIVR.
Когда значения CPIV и PICNT получены чтением PIT_PIIR, это не оказывает влияние ни на счетчики CPIV и PICNT, ни на бит PITS. Например, профайлер может читать PIT_PIIR без очистки ожидающего обработки прерывания, в то время как обработчик прерывания таймера очистит прерывание чтением PIT_PIVR.
PIT может быть разрешен или запрещен записью бита PITEN в регистре PIT_MR (при сбросе PIT по умолчанию запрещен). Бит PITEN становится эффективным только тогда, когда значение счетчика CPIV равно 0. На рис. 15-2 иллюстрирован процесс счета PIT. После сброса бита разрешения PIT (PITEN= 0), CPIV продолжает счет до достижения значения в поле PIV, и затем сбрасывается. PIT снова начнет счет только когда опять будет установлен бит PITEN.
PIT останавливается, когда ядро входит в режим отладки (debug state).
Рис. 15-2. Разрешение/запрет PIT с помощью бита PITEN.
[Интерфейс программирования PIT]
В таблице показан общий список всех регистров, используемых для доступа к PIT. Смещение адресов регистров отсчитывается относительно адреса 0xFFFFFD30.
Таблица 15-1. Регистры PIT.
Смещение
Регистр
Имя
Доступ
Сброс
0x0000
Mode Register (регистр режима)
PIT_MR
R/W
0x000FFFFF
0x0004
Status Register (регистр состояния)
PIT_SR
R
0x00000000
0x0008
Periodic Interval Value Register (значение счетчиков)
Регистр режима PIT (Periodic Interval Timer Mode Register). Работает и на чтение, и на запись.
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
-
-
-
-
-
-
PITIEN
PITEN
-
-
-
-
PIV
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
PIV
PIV: Periodic Interval Value (величина интервала периода счета). Определяет значение, которое сравнивается с внутренним 20-битным счетчиком интервала (CPIV). Период равен (PIV + 1).
PITEN: Period Interval Timer Enabled (разрешение PIT). 0 = работа PIT будет запрещена, как только счетчик CPIV достигнет при счете до значения, запрограммированного в поле PIV. 1 = PIT разрешен.
PITIEN: Periodic Interval Timer Interrupt Enable (разрешение прерывания PIT). 0 = установка бита PITS в регистре PIT_SR не вызовет генерацию прерывания. 1 = установка бита PITS в регистре PIT_SR запустит прерывание PIT.
Регистр состояния PIT (Periodic Interval Timer Status Register). Работает только на чтение, и содержит только один бит PITS.
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
PITS
PITS: Periodic Interval Timer Status (бит состояния PIT). 0 = счетчик PIT не достиг значения PIV после последнего чтения PIT_PIVR. 1 = счетчик PIT при счете достиг значения PIV после последнего чтения PIT_PIVR.