GPIOTE — GPIO tasks and events

The GPIO tasks and events (GPIOTE) module provides functionality for accessing GPIO pins using tasks and events. Each GPIOTE channel can be assigned to one pin.

A GPIOTE block enables GPIOs to generate events on pin state change which can be used to carry out tasks through the PPI system. A GPIO can also be driven to change state on system events using the PPI system. Tasks and events are briefly introduced in Peripheral interface, and GPIO is described in more detail in GPIO — General purpose input/output.

Low power detection of pin state changes is possible when in System ON or System OFF.

Table 1. GPIOTE properties
Instance Number of GPIOTE channels
GPIOTE 8

Up to three tasks can be used in each GPIOTE channel for performing write operations to a pin. Two tasks are fixed (SET and CLR), and one (OUT) is configurable to perform following operations:

An event can be generated in each GPIOTE channel from one of the following input conditions:

Pin events and tasks

The GPIOTE module has a number of tasks and events that can be configured to operate on individual GPIO pins.

The tasks SET[n], CLR[n], and OUT[n] can write to individual pins, and events IN[n] can be generated from input changes of individual pins.

The SET task will set the pin selected in GPIOTE.CONFIG[n].PSEL to high. The CLR task will set the pin low.

The effect of the OUT task on the pin is configurable in CONFIG[n].POLARITY. It can set the pin high, set it low, or toggle it.

Tasks and events are configured using the CONFIG[n] registers. One CONFIG[n] register is associated with a set of SET[n], CLR[n], and OUT[n] tasks and IN[n] events.

As long as a SET[n], CLR[n], and OUT[n] task or an IN[n] event is configured to control pin n, the pin's output value will only be updated by the GPIOTE module. The pin's output value, as specified in the GPIO, will be ignored as long as the pin is controlled by GPIOTE. Attempting to write to the pin as a normal GPIO pin will have no effect. When the GPIOTE is disconnected from a pin, the associated pin gets the output and configuration values specified in the GPIO module, see MODE field in CONFIG[n] register.

When conflicting tasks are triggered simultaneously (i.e. during the same clock cycle) in one channel, the priority of the tasks is as described in the following table.

Table 2. Task priorities
Priority Task
1 OUT
2 CLR
3 SET

When setting the CONFIG[n] registers, MODE=Disabled does not have the same effect as MODE=Task and POLARITY=None. In the latter case, a CLR or SET task occurring at the exact same time as OUT will end up with no change on the pin, based on the priorities described in the table above.

When a GPIOTE channel is configured to operate on a pin as a task, the initial value of that pin is configured in the OUTINIT field of CONFIG[n].

Port event

PORT is an event that can be generated from multiple input pins using the GPIO DETECT signal.

The event will be generated on the rising edge of the DETECT signal. See GPIO — General purpose input/output for more information about the DETECT signal.

The GPIO DETECT signal will not wake the system up again if the system is put into System ON IDLE while the DETECT signal is high. Clear all DETECT sources before entering sleep. If the LATCH register is used as a source, a new rising edge will be generated on DETECT if any bit in LATCH is still high after clearing all or part of the register. This could occur if one of the PINx.DETECT signals is still high, for example. See Pin configuration for more information.

Setting the system to System OFF while DETECT is high will cause a wakeup from System OFF reset.

This feature is always enabled even if the peripheral itself appears to be IDLE, meaning no clocks or other power intensive infrastructure have to be requested to keep this feature enabled. This feature can therefore be used to wake up the CPU from a WFI or WFE type sleep in System ON when all peripherals and the CPU are idle, meaning the lowest power consumption in System ON mode.

In order to prevent spurious interrupts from the PORT event while configuring the sources, the following must be performed:
  1. Disable interrupts on the PORT event (through INTENCLR.PORT).
  2. Configure the sources (PIN_CNF[n].SENSE).
  3. Clear any potential event that could have occurred during configuration (write '0' to EVENTS_PORT).
  4. Enable interrupts (through INTENSET.PORT).

Tasks and events pin configuration

Each GPIOTE channel is associated with one physical GPIO pin through the CONFIG.PSEL field.

When Event mode is selected in CONFIG.MODE, the pin specified by CONFIG.PSEL will be configured as an input, overriding the DIR setting in GPIO. Similarly, when Task mode is selected in CONFIG.MODE, the pin specified by CONFIG.PSEL will be configured as an output overriding the DIR setting and OUT value in GPIO. When Disabled is selected in CONFIG.MODE, the pin specified by CONFIG.PSEL will use its configuration from the PIN[n].CNF registers in GPIO.

Note: A pin can only be assigned to one GPIOTE channel at a time. Failing to do so may result in unpredictable behavior.

Registers

Table 3. Instances
Base address Peripheral Instance Description Configuration
0x40006000 GPIOTE GPIOTE

GPIO tasks and events

   
Table 4. Register overview
Register Offset Description
TASKS_OUT[0] 0x000

Task for writing to pin specified in CONFIG[0].PSEL. Action on pin is configured in CONFIG[0].POLARITY.

 
TASKS_OUT[1] 0x004

Task for writing to pin specified in CONFIG[1].PSEL. Action on pin is configured in CONFIG[1].POLARITY.

 
TASKS_OUT[2] 0x008

Task for writing to pin specified in CONFIG[2].PSEL. Action on pin is configured in CONFIG[2].POLARITY.

 
TASKS_OUT[3] 0x00C

Task for writing to pin specified in CONFIG[3].PSEL. Action on pin is configured in CONFIG[3].POLARITY.

 
TASKS_OUT[4] 0x010

Task for writing to pin specified in CONFIG[4].PSEL. Action on pin is configured in CONFIG[4].POLARITY.

 
TASKS_OUT[5] 0x014

Task for writing to pin specified in CONFIG[5].PSEL. Action on pin is configured in CONFIG[5].POLARITY.

 
TASKS_OUT[6] 0x018

Task for writing to pin specified in CONFIG[6].PSEL. Action on pin is configured in CONFIG[6].POLARITY.

 
TASKS_OUT[7] 0x01C

Task for writing to pin specified in CONFIG[7].PSEL. Action on pin is configured in CONFIG[7].POLARITY.

 
TASKS_SET[0] 0x030

Task for writing to pin specified in CONFIG[0].PSEL. Action on pin is to set it high.

 
TASKS_SET[1] 0x034

Task for writing to pin specified in CONFIG[1].PSEL. Action on pin is to set it high.

 
TASKS_SET[2] 0x038

Task for writing to pin specified in CONFIG[2].PSEL. Action on pin is to set it high.

 
TASKS_SET[3] 0x03C

Task for writing to pin specified in CONFIG[3].PSEL. Action on pin is to set it high.

 
TASKS_SET[4] 0x040

Task for writing to pin specified in CONFIG[4].PSEL. Action on pin is to set it high.

 
TASKS_SET[5] 0x044

Task for writing to pin specified in CONFIG[5].PSEL. Action on pin is to set it high.

 
TASKS_SET[6] 0x048

Task for writing to pin specified in CONFIG[6].PSEL. Action on pin is to set it high.

 
TASKS_SET[7] 0x04C

Task for writing to pin specified in CONFIG[7].PSEL. Action on pin is to set it high.

 
TASKS_CLR[0] 0x060

Task for writing to pin specified in CONFIG[0].PSEL. Action on pin is to set it low.

 
TASKS_CLR[1] 0x064

Task for writing to pin specified in CONFIG[1].PSEL. Action on pin is to set it low.

 
TASKS_CLR[2] 0x068

Task for writing to pin specified in CONFIG[2].PSEL. Action on pin is to set it low.

 
TASKS_CLR[3] 0x06C

Task for writing to pin specified in CONFIG[3].PSEL. Action on pin is to set it low.

 
TASKS_CLR[4] 0x070

Task for writing to pin specified in CONFIG[4].PSEL. Action on pin is to set it low.

 
TASKS_CLR[5] 0x074

Task for writing to pin specified in CONFIG[5].PSEL. Action on pin is to set it low.

 
TASKS_CLR[6] 0x078

Task for writing to pin specified in CONFIG[6].PSEL. Action on pin is to set it low.

 
TASKS_CLR[7] 0x07C

Task for writing to pin specified in CONFIG[7].PSEL. Action on pin is to set it low.

 
EVENTS_IN[0] 0x100

Event generated from pin specified in CONFIG[0].PSEL

 
EVENTS_IN[1] 0x104

Event generated from pin specified in CONFIG[1].PSEL

 
EVENTS_IN[2] 0x108

Event generated from pin specified in CONFIG[2].PSEL

 
EVENTS_IN[3] 0x10C

Event generated from pin specified in CONFIG[3].PSEL

 
EVENTS_IN[4] 0x110

Event generated from pin specified in CONFIG[4].PSEL

 
EVENTS_IN[5] 0x114

Event generated from pin specified in CONFIG[5].PSEL

 
EVENTS_IN[6] 0x118

Event generated from pin specified in CONFIG[6].PSEL

 
EVENTS_IN[7] 0x11C

Event generated from pin specified in CONFIG[7].PSEL

 
EVENTS_PORT 0x17C

Event generated from multiple input GPIO pins with SENSE mechanism enabled

 
INTENSET 0x304

Enable interrupt

 
INTENCLR 0x308

Disable interrupt

 
CONFIG[0] 0x510

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[1] 0x514

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[2] 0x518

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[3] 0x51C

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[4] 0x520

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[5] 0x524

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[6] 0x528

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 
CONFIG[7] 0x52C

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

 

TASKS_OUT[n] (n=0..7)

Address offset: 0x000 + (n × 0x4)

Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is configured in CONFIG[n].POLARITY.

Bit number 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                                                               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 Access Field Value ID Value Description
A W

TASKS_OUT

   

Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is configured in CONFIG[n].POLARITY.

     

Trigger

1

Trigger task

TASKS_SET[n] (n=0..7)

Address offset: 0x030 + (n × 0x4)

Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is to set it high.

Bit number 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                                                               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 Access Field Value ID Value Description
A W

TASKS_SET

   

Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is to set it high.

     

Trigger

1

Trigger task

TASKS_CLR[n] (n=0..7)

Address offset: 0x060 + (n × 0x4)

Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is to set it low.

Bit number 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                                                               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 Access Field Value ID Value Description
A W

TASKS_CLR

   

Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is to set it low.

     

Trigger

1

Trigger task

EVENTS_IN[n] (n=0..7)

Address offset: 0x100 + (n × 0x4)

Event generated from pin specified in CONFIG[n].PSEL

Bit number 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                                                               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 Access Field Value ID Value Description
A RW

EVENTS_IN

   

Event generated from pin specified in CONFIG[n].PSEL

     

NotGenerated

0

Event not generated

     

Generated

1

Event generated

EVENTS_PORT

Address offset: 0x17C

Event generated from multiple input GPIO pins with SENSE mechanism enabled

Bit number 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                                                               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 Access Field Value ID Value Description
A RW

EVENTS_PORT

   

Event generated from multiple input GPIO pins with SENSE mechanism enabled

     

NotGenerated

0

Event not generated

     

Generated

1

Event generated

INTENSET

Address offset: 0x304

Enable interrupt

Bit number 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 Access Field Value ID Value Description
A-H RW

IN[i] (i=0..7)

   

Write '1' to enable interrupt for event IN[i]

     

Set

1

Enable

     

Disabled

0

Read: Disabled

     

Enabled

1

Read: Enabled

I RW

PORT

   

Write '1' to enable interrupt for event PORT

     

Set

1

Enable

     

Disabled

0

Read: Disabled

     

Enabled

1

Read: Enabled

INTENCLR

Address offset: 0x308

Disable interrupt

Bit number 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 Access Field Value ID Value Description
A-H RW

IN[i] (i=0..7)

   

Write '1' to disable interrupt for event IN[i]

     

Clear

1

Disable

     

Disabled

0

Read: Disabled

     

Enabled

1

Read: Enabled

I RW

PORT

   

Write '1' to disable interrupt for event PORT

     

Clear

1

Disable

     

Disabled

0

Read: Disabled

     

Enabled

1

Read: Enabled

CONFIG[n] (n=0..7)

Address offset: 0x510 + (n × 0x4)

Configuration for OUT[n], SET[n], and CLR[n] tasks and IN[n] event

Bit number 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                       E     D D    

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 Access Field Value ID Value Description
A RW

MODE

   

Mode

     

Disabled

0

Disabled. Pin specified by PSEL will not be acquired by the GPIOTE module.

     

Event

1

Event mode

The pin specified by PSEL will be configured as an input and the IN[n] event will be generated if operation specified in POLARITY occurs on the pin.

     

Task

3

Task mode

The GPIO specified by PSEL will be configured as an output and triggering the SET[n], CLR[n] or OUT[n] task will perform the operation specified by POLARITY on the pin. When enabled as a task the GPIOTE module will acquire the pin and the pin can no longer be written as a regular output pin from the GPIO module.

B RW

PSEL

 

[0..31]

GPIO number associated with SET[n], CLR[n], and OUT[n] tasks and IN[n] event

C RW

PORT

 

[0..1]

Port number

D RW

POLARITY

   

When In task mode: Operation to be performed on output when OUT[n] task is triggered. When In event mode: Operation on input that shall trigger IN[n] event.

     

None

0

Task mode: No effect on pin from OUT[n] task. Event mode: no IN[n] event generated on pin activity.

     

LoToHi

1

Task mode: Set pin from OUT[n] task. Event mode: Generate IN[n] event when rising edge on pin.

     

HiToLo

2

Task mode: Clear pin from OUT[n] task. Event mode: Generate IN[n] event when falling edge on pin.

     

Toggle

3

Task mode: Toggle pin from OUT[n]. Event mode: Generate IN[n] when any change on pin.

E RW

OUTINIT

   

When in task mode: Initial value of the output when the GPIOTE channel is configured. When in event mode: No effect.

     

Low

0

Task mode: Initial value of pin before task triggering is low

     

High

1

Task mode: Initial value of pin before task triggering is high

Electrical specification