Модуль задач (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].
Конфигурирует задачи 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.
Назначение бит регистра см. выше во врезке CONFIG[0].
[Электрические параметры GPIOTE]
Символ
Описание
min
Typ
MAX
Ед.
IGPIOTE,IN
Ток потребления с одним или большим количеством активных каналов GPIOTE в режиме входа.
0.1
0.5
мкА
[Пример обработки события от кнопки]
Показан пример обработки события на кнопке, подключенной к ножке P0.27 на канале GPIOTE 1 для nRF52832. Кнопка подключена с внешним верхним резистором подтяжки.
#define ножка 27
#define канал 1
Процесс по шагам:
1. Конфигурация ножки как вход, без внутреннего резистора подтяжки.
2. Конфигурация канала на событие GPIOTE. Событие будет генерироваться при отпускании кнопки (когда на входе будет зарегистрирован перепад от лог. 0 к лог. 1).