# GPIO Words A GPIO API is provided for STM32 microcontrollers, with slight variations between individual microcontrollers (primarily in the number of supported GPIO's, along with internal differences in the registers used by the API). It provides a thin layer over the hardware registers that control GPIO's, so as to make them more user-friendly while not limiting the programmer's capabilities. A GPIO API is also provided for the RP2040 and RP2350; note that this API differs considerably from the GPIO API for STM32 microcontrollers and has no compatiblity with it. It exposes registers for manipulating GPIO input and output and for controlling GPIO interrupts. These words are in `gpio`. ## STM32 Words ### `gpio` ##### `GPIOA` through `GPIOK` These are the memory addresses of the spaces for each of the the GPIO's, from GPIOA to GPIOI on the STM32F407 and STM32L476, from GPIOA to GPIOK on the STM32F746, and from GPIOA to GPIOE as well as GPIOH on the STM32F411. ##### `MODER` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_MODER address. ##### `OTYPER` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_OTYPER address. ##### `OSPEEDR` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_OSPEEDR address. ##### `PUPDR` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_PUPDR address. ##### `IDR` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_IDR address. ##### `ODR` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_ODR address. ##### `BSRR` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_BSRR address. ##### `LCKR` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_LCKR address. ##### `AFRL` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_AFRL address. ##### `AFRH` ( gpio-addr -- addr ) This takes a base GPIOx address and outputs a GPIOx_AFRH address. ##### `INPUT_MODE` This is the input port mode. ##### `OUTPUT_MODE` This is the output port mode. ##### `ALTERNATE_MODE` This is the alternate function port mode. ##### `ANALOG_MODE` This is the analog port mode. ##### `PUSH_PULL` This is the push-pull output type. ##### `OPEN_DRAIN` This is the open drain output type. ##### `LOW_SPEED` This is the low speed output speed. ##### `MEDIUM_SPEED` This is the medium speed output speed. ##### `HIGH_SPEED` This is the high speed output speed. ##### `VERY_HIGH_SPEED` This is the very high speed output speed. ##### `NO_PULL_UP_PULL_DOWN` This is the no pull up/pull down setting. ##### `PULL_UP` This is the pull up setting. ##### `PULL_DOWN` This is the pull down setting. ##### `gpio-clock-enable` ( gpio-addr -- ) Enable the clock for the specified GPIO. ##### `gpio-lp-clock-enable` ( gpio-addr -- ) Enable the low-power clock for the specified GPIO. ##### `gpio-clock-disable` ( gpio-addr -- ) Disable the clock for the specified GPIO. ##### `gpio-lp-clock-disable` ( gpio-addr -- ) Disable the low-power clock for the specified GPIO. ##### `gpio-clock-enable?` ( gpio-addr -- enable ) Get whether the clock for the specified GPIO is enabled. ##### `gpio-lp-clock-enable?` ( gpio-addr -- enable ) Get whether the low-power clock for the specified GPIO is enabled. ##### `MODER!` ( mode pin gpio-addr -- ) Set the specified mode for the specified pin (from 0 to 15) on the specified GPIO. ##### `OTYPER!` ( otype pin gpio-addr -- ) Set the specified output type for the specified pin (from 0 to 15) on the specified GPIO. ##### `OSPEEDR!` ( ospeed pin gpio-addr -- ) Set the specified output speed for the specified pin (from 0 to 15) on the specified GPIO. ##### `PUPDR!` ( pupd pin gpio-addr -- ) Set the specified pull up/pull down setting for the specified pin (from 0 to 15) on the specified GPIO. ##### `AFRL!` ( af pin gpio-addr -- ) Set the specified alternate function for the specified pin (from 0 to 7) on the specified GPIO. ##### `AFRH!` ( af pin gpio-addr -- ) Set the specified alternate function for the specified pin (from 8 to 15) on the specified GPIO. ##### `AFR!` ( af pin gpio-addr -- ) Set the specified alternate function for the specified pin (from 0 to 15) on the specified GPIO. ##### `BS!` ( pin gpio-addr -- ) Set the output for the specified pin (from 0 to 15) on the specified GPIO to on. ##### `BR!` ( pin gpio-addr -- ) Set the output for the specified pin (from 0 to 15) on the specified GPIO to off. ##### `BSRR!` ( output pin gpio-addr -- ) Set the output for the specified pin (from 0 to 15) on the specified GPIO to on or off. ##### `MODER@` ( pin gpio-addr -- mode ) Get the mode of the specified pin (from 0 to 15) on the specified GPIO. ##### `OTYPER@` ( pin gpio-addr -- otype ) Get the output type of the specified pin (from 0 to 15) on the specified GPIO. ##### `OSPEEDR@` ( pin gpio-addr -- ospeed ) Get the output speed of the specified pin (from 0 to 15) on the specified GPIO. ##### `PUPDR@` ( pin gpio-addr -- pupd ) Get the pull up/pull down setting of the specified pin (from 0 to 15) on the specified GPIO. ##### `AFRL@` ( pin gpio-addr -- af ) Get the alternate function for the specified pin (from 0 to 7) on the specified GPIO. ##### `AFRH@` ( pin gpio-addr -- af ) Get the alternate function for the specified pin (from 8 to 15) on the specified GPIO. ##### `AFR@` ( pin gpio-addr -- af ) Get the alternate function for the specified pin (from 0 to 15) on the specified GPIO. ##### `IDR@` ( pin gpio-addr -- input ) Get the input for the specified pin (from 0 to 15) on the specified GPIO. ## RP2040 and RP2350 Words ### `gpio` ##### `CTRL_NORMAL` Normal control state for GPIO control ##### `CTRL_INVERT` Inverse control state for GPIO control ##### `CTRL_FORCE_LOW` Force low / disable control state for GPIO control ##### `CTRL_FORCE_HIGH` Force high / enable control state for GPIO control ##### `VOLTAGE_3.3V` Voltage set to 3.3V ##### `VOLTAGE_1.8V` Voltage set to 1.8V ##### `DRIVE_2MA` Drive strength set to 2mA ##### `DRIVE_4MA` Drive strength set to 4mA ##### `DRIVE_8MA` Drive strength set to 8mA ##### `DRIVE_12MA` Drive strength set to 12mA ##### `PAD_SWCLK` Pad index for SWCLK ##### `PAD_SWD` Pad index for SWD ##### `GPIO_IN` GPIO input register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_IN` High GPIO input register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OUT` GPIO output register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OUT` High GPIO output register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OUT_SET` GPIO output atomic bit-set register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OUT_SET` High GPIO output atomic bit-set register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OUT_CLR` GPIO output atomic bit-clear register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OUT_CLR` High GPIO output atomic bit-clear register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OUT_XOR` GPIO output atomic bit-xor register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OUT_XOR` High GPIO output atomic bit-xor register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OE` GPIO output enable register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OE` High GPIO output enable register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OE_SET` GPIO output enable atomic bit-set register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OE_SET` High GPIO output enable atomic bit-set register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OE_CLR` GPIO output enable atomic bit-clear register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OE_CLR` High GPIO output enable atomic bit-clear register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_OE_XOR` GPIO output enable atomic bit-xor register; each bit corresponds to the GPIO with an index equal to its position ##### `GPIO_HI_OE_XOR` High GPIO output enable atomic bit-xor register; each bit corresponds to the GPIO with an index equal to its position plus 32 (RP2350 only) ##### `GPIO_STATUS_IRQTOPROC@` ( index -- flag ) Get interrupt to processors, after override is applied ##### `GPIO_STATUS_IRQFROMPAD@` ( index -- flag ) Get interrupt from pad, before override is applied ##### `GPIO_STATUS_INTOPERI@` ( index -- flag ) Get input signal to peripheral, after override is applied ##### `GPIO_STATUS_INFROMPAD@` ( index -- flag ) Get input signal from pad, before override is applied ##### `GPIO_STATUS_OETOPAD@` ( index -- flag ) Get output enable to pad, after register override is applied \ applied ##### `GPIO_STATUS_OEFROMPERI@` ( index -- flag ) Get output enable from selected peripheral, before register override is ##### `GPIO_STATUS_OUTTOPAD@` ( index -- flag ) Get output signal to pad, after register override is applied \ applied ##### `GPIO_STATUS_OUTFROMPERI@` ( index -- flag ) Get output signal from selected peripheral, before register override is ##### `GPIO_CTRL_IRQOVER!` ( control index -- ) Set interrupt state for GPIO ##### `GPIO_CTRL_INOVER!` ( control index -- ) Set peripheral input state for GPIO ##### `GPIO_CTRL_OEOVER!` ( control index -- ) Set output enable state for GPIO ##### `GPIO_CTRL_OUTOVER!` ( control index -- ) Set output state for GPIO ##### `GPIO_CTRL_FUNCSEL!` ( function index -- ) Set the function select for GPIO ##### `GPIO_CTRL_IRQOVER@` ( index -- control ) Get interrupt state for GPIO ##### `GPIO_CTRL_INOVER@` ( index -- control ) Get peripheral input state for GPIO ##### `GPIO_CTRL_OEOVER@` ( index -- control ) Get output enable state for GPIO ##### `GPIO_CTRL_OUTOVER@` ( index -- control ) Get output state for GPIO ##### `GPIO_CTRL_FUNCSEL@` ( index -- function ) Get the function select for GPIO ##### `INTR_GPIO_EDGE_LOW!` ( index -- ) Clear a raw edge low interrupt ##### `INTR_GPIO_EDGE_HIGH!` ( index -- ) Clear a raw edge high interrupt ##### `INTR_GPIO_LEVEL_LOW@` ( index -- state ) Get a level low raw interrupt state ##### `INTR_GPIO_LEVEL_HIGH@` ( index -- state ) Get a level high raw interrupt state ##### `INTR_GPIO_EDGE_LOW@` ( index -- state ) Get an edge low raw interrupt state ##### `INTR_GPIO_EDGE_HIGH@` ( index -- state ) Get an edge high raw interrupt state ##### `PROC0_INTE_GPIO_LEVEL_LOW!` ( enable index -- ) Set a level low interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_LEVEL_HIGH!` ( enable index -- ) Set a level high interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_EDGE_LOW!` ( enable index -- ) Set an edge low interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_EDGE_HIGH!` ( enable index -- ) Set an edge high interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_LEVEL_LOW@` ( index -- enable ) Get a level low interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_LEVEL_HIGH@` ( index -- enable ) Get a level high interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_EDGE_LOW@` ( index -- enable ) Get an edge low interrupt enable for processor 0 ##### `PROC0_INTE_GPIO_EDGE_HIGH@` ( index -- enable ) Get an edge high interrupt enable for processor 0 ##### `PROC0_INTF_GPIO_LEVEL_LOW!` ( force index -- ) Set a level low interrupt force for processor 0 ##### `PROC0_INTF_GPIO_LEVEL_HIGH!` ( force index -- ) Set a level high interrupt force for processor 0 ##### `PROC0_INTF_GPIO_EDGE_LOW!` ( force index -- ) Set an edge low interrupt force for processor 0 ##### `PROC0_INTF_GPIO_EDGE_HIGH!` ( force index -- ) Set an edge high interrupt force for processor 0 ##### `PROC0_INTF_GPIO_LEVEL_LOW@` ( index -- force ) Get a level low interrupt force for processor 0 ##### `PROC0_INTF_GPIO_LEVEL_HIGH@` ( index -- force ) Get a level high interrupt force for processor 0 ##### `PROC0_INTF_GPIO_EDGE_LOW@` ( index -- force ) Get an edge low interrupt force for processor 0 ##### `PROC0_INTF_GPIO_EDGE_HIGH@` ( index -- force ) Get an edge high interrupt force for processor 0 ##### `PROC0_INTS_GPIO_LEVEL_LOW@` ( index -- enable ) Get a level low interrupt status for processor 0 ##### `PROC0_INTS_GPIO_LEVEL_HIGH@` ( index -- enable ) Get a level high interrupt status for processor 0 ##### `PROC0_INTS_GPIO_EDGE_LOW@` ( index -- enable ) Get an edge low interrupt status for processor 0 ##### `PROC0_INTS_GPIO_EDGE_HIGH@` ( index -- enable ) Get an edge high interrupt status for processor 0 ##### `PROC1_INTE_GPIO_LEVEL_LOW!` ( enable index -- ) Set a level low interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_LEVEL_HIGH!` ( enable index -- ) Set a level high interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_EDGE_LOW!` ( enable index -- ) Set an edge low interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_EDGE_HIGH!` ( enable index -- ) Set an edge high interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_LEVEL_LOW@` ( index -- enable ) Get a level low interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_LEVEL_HIGH@` ( index -- enable ) Get a level high interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_EDGE_LOW@` ( index -- enable ) Get an edge low interrupt enable for processor 1 ##### `PROC1_INTE_GPIO_EDGE_HIGH@` ( index -- enable ) Get an edge high interrupt enable for processor 1 ##### `PROC1_INTF_GPIO_LEVEL_LOW!` ( force index -- ) Set a level low interrupt force for processor 1 ##### `PROC1_INTF_GPIO_LEVEL_HIGH!` ( force index -- ) Set a level high interrupt force for processor 1 ##### `PROC1_INTF_GPIO_EDGE_LOW!` ( force index -- ) Set an edge low interrupt force for processor 1 ##### `PROC1_INTF_GPIO_EDGE_HIGH!` ( force index -- ) Set an edge high interrupt force for processor 1 ##### `PROC1_INTF_GPIO_LEVEL_LOW@` ( index -- force ) Get a level low interrupt force for processor 1 ##### `PROC1_INTF_GPIO_LEVEL_HIGH@` ( index -- force ) Get a level high interrupt force for processor 1 ##### `PROC1_INTF_GPIO_EDGE_LOW@` ( index -- force ) Get an edge low interrupt force for processor 1 ##### `PROC1_INTF_GPIO_EDGE_HIGH@` ( index -- force ) Get an edge high interrupt force for processor 1 ##### `PROC1_INTS_GPIO_LEVEL_LOW@` ( index -- enable ) Get a level low interrupt status for processor 1 ##### `PROC1_INTS_GPIO_LEVEL_HIGH@` ( index -- enable ) Get a level high interrupt status for processor 1 ##### `PROC1_INTS_GPIO_EDGE_LOW@` ( index -- enable ) Get an edge low interrupt status for processor 1 ##### `PROC1_INTS_GPIO_EDGE_HIGH@` ( index -- enable ) Get an edge high interrupt status for processor 1 ##### `PADS_BANK0_VOLTAGE_SELECT!` ( voltage -- ) Select voltage for pads ##### `PADS_BANK0_VOLTAGE_SELECT@` ( -- voltage ) Get voltage for pads ##### `PADS_BANK0_ISO!` ( enable index -- ) Set pad isolation control (`rp2350` only) ##### `PADS_BANK0_OD!` ( disable index -- ) Set output disable ##### `PADS_BANK0_IE!` ( enable index -- ) Set input enable ##### `PADS_BANK0_DRIVE!` ( strength index -- ) Set drive strength ##### `PADS_BANK0_PUE!` ( enable index -- ) Set pull up enable ##### `PADS_BANK0_PDE!` ( enable index -- ) Set pull down enable ##### `PADS_BANK0_SCHMITT!` ( enable index -- ) Set schmitt trigger ##### `PADS_BANK0_SLEWFAST!` ( fast index -- ) Set slew rate control