nRF5x GPIOTE: события и задачи GPIO Печать
Добавил(а) microsin   

Модуль задач (tasks) и событий (events) GPIO предоставляет функционал доступа к ножкам GPIO, используя эти задачи и события. Каждый канал GPIOTE может быть назначен только на одну ножку порта. У чипа nRF52832, к примеру, имеется 8 таких каналов GPIOTE.

Примечание: расшифровку терминов и сокращений см. в словарике [3].

Блок GPIOTE разрешает ножкам GPIO генерировать события по изменению состояния вывода, что может использоваться для выполнения задач через систему PPI. Можно управлять уровнями выходов GPIO по событиям в системе, также с использованием подсистемы PPI. Возможно обнаружение изменений состояния ножек GPIO при пониженном энергопотреблении, в состояниях чипа System ON или System OFF.

На каждом канале GPIOTE можно использовать до 3 задач, чтобы выполнять операции записи в одну ножку вывода корпуса. 2 из этих задач фиксированы (SET и CLR), и одна (OUT) конфигурируется для выполнения следующих операций:

Set       установка в лог. 1
Clear    установка в лог. 0
Toggle  переключение в противоположное состояние

В каждом канале GPIOE можно генерировать событие при одной из следующих входных ситуаций:

Rising edge    нарастания уровня
Falling edge   спад уровня
Any change    любой перепад уровня

[Pin events и tasks (события и задачи вывода)]

У модуля GPIOTE есть определенное количество задач (tasks) и событий (events), которые можно сконфигурировать для операций на указанных выводах портов GPIO.

Задачи (SET[n], CLR[n] и OUT[n]) могут использоваться для записи в отдельные ножки портов, и события (IN[n]) могут быть сгенерированы по изменениям на входах указанных выводов портов. Здесь n соответствует номеру канала GPIOTE (от 0 до 7).

Задача SET установит выбранный вывод порта в лог. 1, задача CLR сбросит уровень вывода порта в лог. 0 (конфигурируется в CONFIG[n].PSEL).

Эффект задачи OUT на выводе выхода порта конфигурируется в CONFIG[n].POLARITY, и может быть установлен на перевод выхода в лог. 1 (high), в лог. 0 (low), либо на переключение уровня выхода.

Задачи и события конфигурируются в регистрах CONFIG[n]. Каждый набор задач SET, CLR и OUT[n] и событий IN[n] привязан к одному из регистров CONFIG[n].

Если задача SET[n], CLR[n] и OUT[n], или событие IN[n] сконфигурированы для управления выводом n, то значение выхода будет обновляться только модулем GPIOTE. Таким образом, значение на выходе вывода, как оно указано в GPIO, будет игнорироваться, пока вывод находится под управлением GPIOTE, т. е. попытка записи в обычный вывод GPIO не даст никакого эффекта. Когда GPIOTE отсоединен от вывода, см. поле MODE в регистре CONFIG[n], тогда соответствующий вывод получит выходные и конфигурационные значения, указанные в модуле GPIO.

Когда конфликтующие задачи срабатывают в одном канале одновременно (например, в одном и том же периоде тактов) in one channel, то приоритет у задач будет таким, как это описано в таблице 2.

Таблица 2. Приоритеты задач.

Приоритет Задача
1 OUT
2 CLR
3 SET (самый высокий приоритет)

Когда устанавливаются регистры CONFIG[n], MODE=Disabled не дает тот же эффект, как MODE=Task и POLARITY=None. В последнем случае задача CLR или SET, возникающая в то же самое время, что и OUT, будет иметь место без изменений на выводе в соответствии с приоритетами, описанными выше в таблице 2.

Когда канал GPIOTE сконфигурирован для работы на выводе как задача, начальное значение вывода конфигурируется в поле OUTINIT регистра CONFIG[n].

[Port event (событие порта)]

PORT это событие, которое может быть сгенерировано от нескольких входных ножек с использованием сигнала GPIO DETECT.

Событие будет генерироваться по нарастанию уровня сигнала DETECT. Для дополнительной информации по сигналу DETECT см. описание GPIO [2].

Перевод системы в System ON IDLE, когда DETECT в лог. 1, заново не разбудит систему сигналом DETECT. Поэтому перед входом в режим сна убедитесь, что все источники сигнала DETECT очищены. Если регистр LATCH используется как источник, и любой бит в LATCH все еще находится в лог. 1, после очистки всего регистра или его части (например, из-за того, что один из сигналов PINx.DETECT все еще в лог. 1), то новый фронт будет сгенерирован на DETECT, см. раздел Pin configuration в описании [2].

Попытка поместить систему в System OFF, когда DETECT в лог. 1, вызовет пробуждение из System OFF reset.

Эта функция всегда разрешена, хотя само периферийное устройство выглядит как находящееся в IDLE, т. е. для поддержания этой функции в рабочем состоянии не требуется запрашивать тактирование или другую потребляющую энергию инфраструктуру, чтобы сохранить этот функционал разрешенным. Таким образом, эта функция может использоваться для пробуждения CPU из сна типов WFI или WFE и перевода чипа в System ON со всеми периферийными устройствами и CPU в режиме простоя (idle), т. е. с наименьшим потреблением энергии в режиме System ON.

Чтобы предотвратить появление случайных прерываний от события PORT, когда конфигурируются источники, пользователь должен сначала запретить прерывания на событии PORT (через INTENCLR.PORT), затем сконфигурировать источники (PIN_CNF[n].SENSE), очистить любое потенциально возникшее событие во время конфигурации (записью '1' в EVENTS_PORT), и в конце разрешить прерывания (через INTENSET.PORT).

[Конфигурация вывода для tasks и events]

Каждый канал GPIOTE привязывается с одной физической ножкой GPIO через поле CONFIG.PSEL.

Когда в CONFIG.MODE выбран режим Event, то ножка, указанная через CONFIG.PSEL, будет сконфигурирована как вход, отменяя установку DIR в GPIO. Подобным образом режим Task также выбирается в CONFIG.MODE, при этом ножка, выбранная через CONFIG.PSEL, будет сконфигурирована как выход, отменяя установку DIR и значение OUT в GPIO. Когда в CONFIG.MODE выбрано Disabled, то ножка, указанная CONFIG.PSEL, будет использовать свою конфигурацию из регистров PIN[n].CNF в GPIO.

Только один канал GPIOTE может быть назначен на один физический вывод. Не соблюдение этого правила может привести к непредсказуемому поведению устройства.

[Регистры]

Таблица 3. Экземпляры GPIOTE.

Базовый адрес Задача Экз. Описание
0x40006000 GPIOTE GPIOTE GPIO Tasks and Events (задачи и события портов ввода/вывода общего назначения)

Таблица 4. Обзор регистров GPIOTE.

Регистр Смещ. Описание
TASKS_OUT[0] 0x000 Задача для записи ножки, указанной в CONFIG[0].PSEL. Действие на ножке конфигурируется в CONFIG[0].POLARITY.
TASKS_OUT[1] 0x004 Задача для записи ножки, указанной в CONFIG[1].PSEL. Действие на ножке конфигурируется в CONFIG[1].POLARITY.
TASKS_OUT[2] 0x008 Задача для записи ножки, указанной в CONFIG[2].PSEL. Действие на ножке конфигурируется в CONFIG[2].POLARITY.
TASKS_OUT[3] 0x00C Задача для записи ножки, указанной в CONFIG[3].PSEL. Действие на ножке конфигурируется в CONFIG[3].POLARITY.
TASKS_OUT[4] 0x010 Задача для записи ножки, указанной в CONFIG[4].PSEL. Действие на ножке конфигурируется в CONFIG[4].POLARITY.
TASKS_OUT[5] 0x014 Задача для записи ножки, указанной в CONFIG[5].PSEL. Действие на ножке конфигурируется в CONFIG[5].POLARITY.
TASKS_OUT[6] 0x018 Задача для записи ножки, указанной в CONFIG[6].PSEL. Действие на ножке конфигурируется в CONFIG[6].POLARITY.
TASKS_OUT[7] 0x01C Задача для записи ножки, указанной в CONFIG[7].PSEL. Действие на ножке конфигурируется в CONFIG[7].POLARITY.
TASKS_SET[0] 0x030 Задача для записи в ножку, указанную в CONFIG[0].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[1] 0x034 Задача для записи в ножку, указанную в CONFIG[1].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[2] 0x038 Задача для записи в ножку, указанную в CONFIG[2].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[3] 0x03C Задача для записи в ножку, указанную в CONFIG[3].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[4] 0x040 Задача для записи в ножку, указанную в CONFIG[4].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[5] 0x044 Задача для записи в ножку, указанную в CONFIG[5].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[6] 0x048 Задача для записи в ножку, указанную в CONFIG[6].PSEL. Действие на выводе - установка в лог. 1.
TASKS_SET[7] 0x04C Задача для записи в ножку, указанную в CONFIG[7].PSEL. Действие на выводе - установка в лог. 1.
TASKS_CLR[0] 0x060 Задача для записи в ножку, указанную в CONFIG[0].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[1] 0x064 Задача для записи в ножку, указанную в CONFIG[1].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[2] 0x068 Задача для записи в ножку, указанную в CONFIG[2].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[3] 0x06C Задача для записи в ножку, указанную в CONFIG[3].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[4] 0x070 Задача для записи в ножку, указанную в CONFIG[4].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[5] 0x074 Задача для записи в ножку, указанную в CONFIG[5].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[6] 0x078 Задача для записи в ножку, указанную в CONFIG[6].PSEL. Действие на выводе - установка в лог. 0.
TASKS_CLR[7] 0x07C Задача для записи в ножку, указанную в CONFIG[7].PSEL. Действие на выводе - установка в лог. 0.
EVENTS_IN[0] 0x100 Событие, генерируемое от ножки, указанной в CONFIG[0].PSEL.
EVENTS_IN[1] 0x104 Событие, генерируемое от ножки, указанной в CONFIG[1].PSEL.
EVENTS_IN[2] 0x108 Событие, генерируемое от ножки, указанной в CONFIG[2].PSEL.
EVENTS_IN[3] 0x10C Событие, генерируемое от ножки, указанной в CONFIG[3].PSEL.
EVENTS_IN[4] 0x110 Событие, генерируемое от ножки, указанной в CONFIG[4].PSEL.
EVENTS_IN[5] 0x114 Событие, генерируемое от ножки, указанной в CONFIG[5].PSEL.
EVENTS_IN[6] 0x118 Событие, генерируемое от ножки, указанной в CONFIG[6].PSEL.
EVENTS_IN[7] 0x11C Событие, генерируемое от ножки, указанной в CONFIG[7].PSEL.
INTENSET 0x304 Разрешение прерывания.
INTENCLR 0x308 Запрет прерывания.
CONFIG[0] 0x510 Конфигурация для задач OUT[n], SET[n] и CLR[n], и события IN[n].
CONFIG[1] 0x514
CONFIG[2] 0x518
CONFIG[3] 0x51C
CONFIG[4] 0x520
CONFIG[5] 0x524
CONFIG[6] 0x528
CONFIG[7] 0x52C

Смещение адреса: 0x304. Прочитанный 0 из бита означает, что соответствующее прерывание запрещено, прочитанная 1 - разрешено.

Биты регистра INTENSET:

№ бита 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
Id I                                               H G F E D C B A
Reset 0x00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Назначение бит:

Id RW Поле Описание
A RW IN0 Запись '1' разрешает прерывание для события IN[0] (см. EVENTS_IN[0]).
      ...
H RW IN7 Запись '1' разрешает прерывание для события IN[7] (см. EVENTS_IN[7]).
I RW PORT Запись '1' разрешает прерывание для события PORT (см. EVENTS_PORT).

Смещение адреса: 0x308. Прочитанный 0 из бита означает, что соответствующее прерывание запрещено, прочитанная 1 - разрешено. Запись 1 запрещает прерывание.

Биты регистра INTENCLR:

№ бита 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
Id I                                               H G F E D C B A
Reset 0x00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Назначение бит:

Id RW Поле Описание
A RW IN0 Запись '1' запрещает прерывание для события IN[0] (см. EVENTS_IN[0]).
      ...
H RW IN7 Запись '1' запрещает прерывание для события IN[7] (см. EVENTS_IN[7]).
I RW PORT Запись '1' запрещает прерывание для события PORT (см. EVENTS_PORT).

Смещение адреса: 0x510

Конфигурирует задачи OUT[n], SET[n] и CLR[n], и событие IN[n].

Биты регистра :

№ бита 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
Id                       D     C C       B B B B B             A A
Reset 0x00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Назначение бит:

Id RW Поле Id значения Знач. Описание
A RW MODE     Режим
      Disabled 0 Запрещено. Ножка, указанная в PSEL, не будет захватываться модулем GPIOTE.
      Event 1 Режим события. Ножка, указанная в PSEL, будет сконфигурирована как вход, и будет генерироваться событие IN[n], если на этой ножке произошло событие, указанное в POLARITY.
      Task 3 Режим задачи. Ножка, указанная в PSEL, будет сконфигурирована как выход, и запуск задачи SET[n], CLR[n] или OUT[n] будет выполнять операцию, указанную для вывода в POLARITY. При разрешении в качестве задачи модуль GPIOTE захватывает ножку, и она больше не может быть записана как обычный выход из модуля GPIO.
B RW PSEL   [0..31] Номер ножки GPIO, связанной с задачей SET[n], CLR[n] и OUT[n], или событием IN[n].
C RW POLARITY     В режиме задачи: операция, которая выполняется на выходе, когда запустилась задача OUT[n]. В режиме события: операция на входе, которая должна активировать событие IN[n].
      None 0 Режим задачи: задача OUT[n] никак не влияет на ножку вывода. В режиме события: при активности на ножке никакое событие IN[n] не генерируется.
      LoToHi 1 Режим задачи: задача OUT[n] устанавливает в лог. 1 ножку вывода. В режиме события: при нарастании уровня на ножке генерируется событие IN[n].
      HiToLo 2 Режим задачи: задача OUT[n] устанавливает в лог. 0 ножку вывода. В режиме события: при спаде уровня на ножке генерируется событие IN[n].
      Toggle 3 Режим задачи: задача OUT[n] переключит ножку вывода в противоположное состояние. В режиме события: при любом изменении уровня на ножке генерируется событие IN[n].
D RW OUTINIT     Режим задачи: начальное значение на выходе, когда конфигурируется канал GPIOTE. Режим события: не оказывает никакого эффекта.
      Low 0 Режим задачи: перед срабатыванием задачи на ножке лог. 0.
      High 1 Режим задачи: перед срабатыванием задачи на ножке лог. 1.

...

Смещение адреса: 0x52C

Назначение бит регистра см. выше во врезке CONFIG[0].

[Электрические параметры GPIOTE]

Символ Описание min Typ MAX Ед.
IGPIOTE,IN Ток потребления с одним или большим количеством активных каналов GPIOTE в режиме входа.   0.1 0.5 мкА

[Пример обработки события от кнопки]

Показан пример обработки события на кнопке, подключенной к ножке P0.27 на канале GPIOTE 1 для nRF52832. Кнопка подключена с внешним верхним резистором подтяжки.

#define ножка 27
#define канал 1

Процесс по шагам:

1. Конфигурация ножки как вход, без внутреннего резистора подтяжки.

NRF_GPIO->PIN_CNF[ножка] = GPIO_PIN_CNF_INPUT_Msk;

2. Конфигурация канала на событие GPIOTE. Событие будет генерироваться при отпускании кнопки (когда на входе будет зарегистрирован перепад от лог. 0 к лог. 1).

#define GPIOTE_SETTINGS ((GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos) \
                        | GPIOTE_CONFIG_MODE_Event)
NRF_GPIOTE->CONFIG[канал] = GPIOTE_SETTINGS | (ножка << GPIOTE_CONFIG_PSEL_Pos);

3. Сброс события канала:

NRF_GPIOTE->EVENTS_IN[канал] = 0;

4. Разрешил прерывание канала:

NRF_GPIOTE->INTENSET = 1 << канал;

5. Обработчик прерывания для события канала:

void GPIOTE_IRQHandler (void)
{
   // Сброс события канала:
   NRF_GPIOTE->EVENTS_IN[канал] = 0;
   // Индикация:
   LED_TOGGLE();
}

[Ссылки]

1. GPIOTE GPIO tasks and events site:infocenter.nordicsemi.com.
2. nRF5x: порты GPIO.
3Bluetooth: аббревиатуры и термины.