Периферийными устройствами управляет CPU путем записи регистров конфигурации и регистров задачи. События периферийного устройства показываются для CPU через регистры событий и прерываний, если это было сконфигурировано для определенного события.
Рис. 1. Задачи (tasks), события (events), шорткаты и прерывания (interrupts).
Примечание: расшифровку терминов и сокращений см. в словарике [2].
[Peripheral ID]
Каждому периферийному устройству назначен фиксированный блок в адресном пространстве размером в 0x1000 байт, что эквивалентно 1024 x 32-разрядных регистров. Для дополнительной информации по адресам блоков и идентификатором периферийных устройств см. таблицу 1.
Таблица 1. Размещение блоков периферийных устройств на карте памяти.
ID |
Баз. адрес |
Периф. устройство |
Экз. |
Описание |
0 |
0x40000000 |
CLOCK |
CLOCK |
Управление тактированием |
POWER |
POWER |
Управление питанием |
BPROT |
BPROT |
Защита блока |
1 |
0x40001000 |
RADIO |
RADIO |
Радиоблок 2.4 ГГц |
2 |
0x40002000 |
UARTE |
UARTE0 |
Универсальный асинхронный приемопередатчик с поддержкой EasyDMA |
UART(*) |
UART0(*) |
Универсальный асинхронный приемопередатчик |
3 |
0x40003000 |
SPIM |
SPIM0 |
SPI master 0 |
SPI |
SPI0 |
SPIS |
SPIS0 |
SPI slave 0 |
TWIM |
TWIM0 |
Двухпроводный интерфейс 0 (I2C) в режиме master |
TWI(*) |
TWI0(*) |
TWIS |
TWIS0 |
Двухпроводный интерфейс 0 (I2C) в режиме slave |
4 |
0x40004000 |
SPIM |
SPIM1 |
SPI master 1 |
SPI |
SPI0 |
SPIS |
SPIS1 |
SPI slave 1 |
TWIM |
TWIM1 |
Двухпроводный интерфейс 0 (I2C) в режиме master |
TWI(*) |
TWI1(*) |
TWIS |
TWIS0 |
Двухпроводный интерфейс 0 (I2C) в режиме slave |
5 |
0x40005000 |
NFCT |
NFCT |
Near Field Communication Tag [2]. |
6 |
0x40006000 |
GPIOTE |
GPIOTE |
GPIO Tasks and Events |
7 |
0x40007000 |
SAADC |
SAADC |
Аналого-цифровой преобразователь |
8 |
0x40008000 |
TIMER |
TIMER0 |
Таймер 0 |
9 |
0x40009000 |
TIMER1 |
Таймер 1 |
10 |
0x4000A000 |
TIMER2 |
Таймер 2 |
11 |
0x4000B000 |
RTC |
RTC0 |
Счетчик реального времени 0 |
12 |
0x4000C000 |
TEMP |
TEMP |
Датчик температуры |
13 |
0x4000D000 |
RNG |
RNG |
Генератор случайных чисел |
14 |
0x4000E000 |
ECB |
ECB |
Блок шифрования режима AES Electronic Code Book (ECB) |
15 |
0x4000F000 |
CCM |
CCM |
AES CCM Mode Encryption |
AAR |
AAR |
Acelerated Address Resolver |
16 |
0x40010000 |
WDT |
WDT |
Сторожевой таймер |
17 |
0x40011000 |
RTC |
RTC1 |
Счетчик реального времени 1 |
18 |
0x40012000 |
QDEC |
QDEC |
Квадратурный декодер |
19 |
0x40013000 |
LPCOMP |
LPCOMP |
Компаратор определения пониженного напряжения питания (Low Power COMParator) |
COMP |
COMP |
Компаратор общего назначения |
20 |
0x40014000 |
SWI |
SWI0 |
Программное прерывание 0 (SoftWare Interrupt) |
EGU |
EGU0 |
Блок генератора события 0 (Event Generator Unit) |
21 |
0x40015000 |
SWI |
SWI1 |
Программное прерывание 1 (SoftWare Interrupt) |
EGU |
EGU1 |
Блок генератора события 1 (Event Generator Unit) |
22 |
0x40016000 |
SWI |
SWI2 |
Программное прерывание 2 (SoftWare Interrupt) |
EGU |
EGU2 |
Блок генератора события 2 (Event Generator Unit) |
23 |
0x40017000 |
SWI |
SWI2 |
Программное прерывание 3 (SoftWare Interrupt) |
EGU |
EGU2 |
Блок генератора события 3 (Event Generator Unit) |
24 |
0x40018000 |
SWI |
SWI2 |
Программное прерывание 4 (SoftWare Interrupt) |
EGU |
EGU2 |
Блок генератора события 4 (Event Generator Unit) |
25 |
0x40019000 |
SWI |
SWI2 |
Программное прерывание 5 (SoftWare Interrupt) |
EGU |
EGU2 |
Блок генератора события 5 (Event Generator Unit) |
26 |
0x4001A000 |
TIMER |
TIMER3 |
Таймер 3 |
27 |
0x4001B000 |
TIMER4 |
Таймер 4 |
28 |
0x4001C000 |
PWM |
PWM0 |
Блок ШИМ 0 (Pulse Width Modulation) |
29 |
0x4001D000 |
PDM |
PDM |
Интерфейс цифрового микрофона (Pulse Density Modulation) |
30 |
0x4001E000 |
NVMC |
NVMC |
Контроллер энергонезависимой памяти (Non-Volatile Memory Controller) |
31 |
0x4001F000 |
PPI |
PPI |
Programmable Peripheral Interconnect |
32 |
0x40020000 |
MWU |
MWU |
Memory Watch Unit |
33 |
0x40021000 |
PWM |
PWM1 |
Блок ШИМ 1 (Pulse Width Modulation) |
34 |
0x40022000 |
PWM |
PWM2 |
Блок ШИМ 2 (Pulse Width Modulation) |
35 |
0x40023000 |
SPI(*) |
SPI2(*) |
SPI master 2 |
SPIM |
SPIM2 |
SPIS |
SPIS2 |
SPI slave 2 |
36 |
0x40024000 |
RTC |
RTC2 |
Счетчик реального времени 2 |
37 |
0x40025000 |
I2S |
I2S |
Цифровой интерфейс передачи звука (Inter-IC Sound Interface) |
38 |
0x40026000 |
FPU |
FPU |
Прерывание FPU |
0 |
0x50000000 |
GPIO |
GPIO(*) |
Порт ввода/вывода общего назначения (General Purpose Input/Output) |
P0 |
- |
0x10000000 |
FICR |
FICR |
Заводская конфигурационная информация (Factory Information ConfiguRation) |
- |
0x10001000 |
UICR |
UICR |
Пользовательская конфигурационная информация (User Information Configuration) |
Примечание (*): устаревшее наименование.
Существует прямая зависимость между идентификатором периферийного устройства (peripheral ID) и его базовым адресом. Например, периферийному устройству с базовым адресом 0x40000000 назначен ID=0, периферийному устройству с базовым адресом 0x40001000 назначен ID=1, и периферийному устройству с базовым адресом 0x4001F000 назначен ID=31 (0x1F == 31).
Несколько периферийных устройств могут использовать один и тот же ID, что вводит одно или большее количество следующих ограничений:
• Некоторые периферийные устройства совместно используют некоторые регистры или другие общие ресурсы. • Работа периферийных устройств взаимоисключающая, т. е. в одно и то же время может использоваться только одно из конкурирующих за общий ресурс устройств. • Переключение с одного периферийного устройства на другое должно следовать определенному шаблону: сначала надо запретить одно устройство, затем разрешить другое.
[Периферийные устройства с общим ID]
Обычно, за исключением ID 0, периферийные устройства, использующие общий ID и базовый адрес, не могут использоваться одновременно. Пользователь может разрешить в одно и то же время только одно из них с определенным ID.
При переключении между двумя периферийными устройствами с общим ID пользователь должен выполнить следующую последовательность действий, чтобы избежать непредсказуемого поведения системы:
• Запретить ранее используемое периферийное устройство. • Удалить все существующие соединения PPI, которые были ранее настроены для запрещенного на предыдущем шаге устройства. • Очистить все биты в регистре разрешения прерываний INTEN, например записью INTENCLR = 0xFFFFFFFF. • Явно сконфигурировать периферийное устройство, которое должно быть разрешено, не полагаясь на старую конфигурацию, которая была ранее назначена на только что запрещенное периферийное устройство. • Разрешить сконфигурированное периферийное устройство.
Для каждой строки в следующей таблице столбец Экземпляр содержит ID периферийных устройств, которые совместно используют этот ID.
Таблица 2. Периферийные устройства, которые используют один и тот же идентификатор (Peripheral ID).
Экземпляр |
|
|
|
|
|
|
ID 2 (0x40002000) |
UARTE |
UART |
|
|
|
|
ID 3 (0x40003000) |
SPIM0 |
SPIS0 |
SPI0 |
TWIM0 |
TWIS0 |
TWI0 |
ID 4 (0x40004000) |
SPIM1 |
SPIS1 |
SPI1 |
TWIM1 |
TWIS1 |
TWI1 |
ID 15 (0x4000F000) |
AAR |
CCM |
|
|
|
|
ID 19 (0x40013000) |
COMP |
LPCOMP |
|
|
|
|
ID 20 (0x40014000) |
SWI0 |
EGU0 |
|
|
|
|
ID 21 (0x40015000) |
SWI1 |
EGU1 |
|
|
|
|
ID 22 (0x40016000) |
SWI2 |
EGU2 |
|
|
|
|
ID 23 (0x40017000) |
SWI3 |
EGU3 |
|
|
|
|
ID 24 (0x40018000) |
SWI4 |
EGU4 |
|
|
|
|
ID 25 (0x40019000) |
SWI5 |
EGU5 |
|
|
|
|
ID 35 (0x40023000) |
SPIM2 |
SPIS2 |
SPI2 |
|
|
|
[Регистры периферийного устройства]
У большинства периферийных устройств есть регистр ENABLE, предназначенный для разрешения периферийного устройства. Если не указано нечто другое в соответствующей главе руководства, регистры периферийных устройств (в частности регистры PSEL) должны быть сконфигурированы перед разрешением периферийного устройства.
Обратите внимание, что периферийное устройство должно быть разрешено перед тем, как можно будет использовать его задачи и события.
Установка и очистка бит. Регистры, в которых есть множество одиночных однобитовых полей, могут иметь реализацию процедуры специальной очистки и установки отдельных бит. Эта процедура позволяет коду firmware устанавливать и очищать определенные биты в регистре без необходимости выполнять операцию чтение-модификация-запись в этом регистре.
Процедура атомарной модификации бит реализована с помощью трех следующих друг за другом адресов на карте регистров, где за основным регистром следуют 2 регистра с суффиксами SET и CLR, именно в таком порядке.
Как понятно из названия, регистр SET используется для установки отдельных бит в основном регистре, а регистр CLR для очистки отдельных бит в основном регистре. Записываемая '1' в регистр SET или CLR соответственно установит или очистит этот бит в основном регистре. Запись '0' в какой-либо бит SET или CLR никак не повлияет на этот бит основного регистра.
Ограничение: основной регистр может быть невидимым, и не всегда доступным напрямую.
[Задачи (tasks)]
Задачи используются для срабатывания действий в периферийном устройстве, например для запуска определенного поведения. Периферийное устройство может реализовать несколько задач, причем каждая задача имеет отдельный регистр в группе регистров задач этого периферийного устройства.
Задача срабатывает, когда firmware записывает '1' в регистр задачи, или когда периферийное устройство само или другое периферийное устройство переключит соответствующий сигнал задачи, см. рис. 1.
[События (events)]
Events используются для оповещения периферийных устройств и CPU об определенных событиях, например об и изменении состояния периферийного устройства. Периферийное устройство может генерировать несколько событий, для каждого события при этом существует отдельный регистр в группе регистров событий этого периферийного устройства.
Событие генерируется, когда периферийное устройство само переключит соответствующий сигнал события, и регистр событий обновится, чтобы отразить информацию о том, что это событие было сгенерировано, см. рис. 1. Регистр событий очищается только когда код firmware запишет в него '0'.
События могут генерироваться периферийным устройством даже когда регистр событий установлен в '1'.
[Шорткаты (shortcuts)]
Шорткатом называют прямое соединение между событием (event) и задачей в одном и том же периферийном устройстве. Если shortcut разрешен, то автоматически сработает связанная задача, когда сгенерируется связанное событие. Использование шортката является эквивалентом создание того же соединения вне периферийного устройства и через PPI. Однако задержка распространения через шорткат обычно меньше, чем задержка распространения через PPI.
Шоркаты изначально фиксированы, т. е. их соединения нельзя сконфигурировать в коде firmware. Каждый шорткат может быть индивидуально разрешен или запрещен через регистр шортката, один бит на шорткат, что дает максимум 32 шортката для каждого периферийного устройства.
[Прерывания]
Все периферийные устройства поддерживают прерывания. Прерывания генерируются событиями (events).
Периферийное устройство занимает только одно прерывание, и номер прерывания соответствует peripheral ID. Например, периферийное устройств с ID=4 подключено к прерыванию номер 4 в контроллере вложенных прерываний (Nested Vectored Interrupt Controller, NVIC).
С использованием регистров INTEN, INTENSET и INTENCLR каждое событие, генерируемое периферийным устройством, может быть настроено для срабатывания прерывания периферийного устройства. Могут быть разрешены несколько событий, чтобы одновременно генерировать прерывания. Чтобы корректно выявить источник (причину) прерывания, в обработчике прерывания (ISR) опрашивают регистры события в группе регистров событий периферийного устройства покажут источник прерывания.
Некоторые периферийные устройства реализуют в себе только регистры INTENSET и INTENCLR, и для этих периферийных устройств регистр INTEN недоступен (подробности см. в соответствующих главах руководства). Однако в любом случае чтение регистра INTENSET или INTENCLR вернет ту же самую информацию о разрешенных прерываниях, которая была бы получена чтением INTEN.
Каждое событие, реализованное в периферийном устройстве, связано с определенной позицией бита в регистрах INTEN, INTENSET и INTENCLR.
Взаимосвязь между задачами, событиями, шорткатами и прерываниями показана на рис. 1.
Очистка прерывания. Когда очищается прерывание путем записи '0' в регистр событий, или когда запрещается прерывание с помощью регистра INTENCLR, могут пройти до 4 тактов CPU, чтобы это действие вступило в силу. Это значит, что прерывания могут сразу произойти повторно, даже если новое событие не наступило, если программа выходит из ISR после того, как прерывание было очищено или запрещено, но до того, как прошли эти 4 такта.
Важное замечание: чтобы избежать повторного прерывания перед тем, как наступит новое событие, программа должна выполнить чтение из одного из регистров периферийного устройства, например регистра событий, который был очищен, или регистра INTENCLR, который использовался для запрета прерывания.
Это приведет к задержке от 1 до 3 тактов, и обеспечит очистку прерывания перед выходом из ISR. Следует проследить за тем, чтобы компилятор не удалил операцию чтения в качестве оптимизации. Если программа может гарантировать задержку в 4 такта после очистки прерывания или запрет прерывания каким-нибудь другим способом, то чтение регистра не требуется.
[Ссылки]
1. Peripheral interface nRF52832 site:nordicsemi.com. 2. Bluetooth: аббревиатуры и термины. |