nRF52: интерфейс периферийного устройства Печать
Добавил(а) microsin   

Периферийными устройствами управляет CPU путем записи регистров конфигурации и регистров задачи. События периферийного устройства показываются для CPU через регистры событий и прерываний, если это было сконфигурировано для определенного события.

nRF52 tasks events shortcuts interrupts fig01

Рис. 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.
2Bluetooth: аббревиатуры и термины.