gpio.h

General Purpose Input/Output (GPIO) port and Alternate Function Input/Output (AFIO) support.

Types

struct gpio_reg_map

GPIO register map type.

Public Members
__io uint32 CRL

Port configuration register low.

__io uint32 CRH

Port configuration register high.

__io uint32 IDR

Port input data register.

__io uint32 ODR

Port output data register.

__io uint32 BSRR

Port bit set/reset register.

__io uint32 BRR

Port bit reset register.

__io uint32 LCKR

Port configuration lock register.

struct gpio_dev

GPIO device type.

Public Members
gpio_reg_map * regs

Register map.

rcc_clk_id clk_id

RCC clock information.

afio_exti_port exti_port

AFIO external interrupt port value.

gpio_pin_mode enum

GPIO Pin modes.

These only allow for 50MHZ max output speeds; if you want slower, use direct register access.

Values:

  • GPIO_OUTPUT_PP = (GPIO_CR_CNF_OUTPUT_PP |                       GPIO_CR_MODE_OUTPUT_50MHZ) -

    Output push-pull.

  • GPIO_OUTPUT_OD = (GPIO_CR_CNF_OUTPUT_OD |                       GPIO_CR_MODE_OUTPUT_50MHZ) -

    Output open-drain.

  • GPIO_AF_OUTPUT_PP = (GPIO_CR_CNF_AF_OUTPUT_PP |                          GPIO_CR_MODE_OUTPUT_50MHZ) -

    Alternate function output push-pull.

  • GPIO_AF_OUTPUT_OD = (GPIO_CR_CNF_AF_OUTPUT_OD |                          GPIO_CR_MODE_OUTPUT_50MHZ) -

    Alternate function output open drain.

  • GPIO_INPUT_ANALOG = (GPIO_CR_CNF_INPUT_ANALOG |                          GPIO_CR_MODE_INPUT) -

    Analog input.

  • GPIO_INPUT_FLOATING = (GPIO_CR_CNF_INPUT_FLOATING |                            GPIO_CR_MODE_INPUT) -

    Input floating.

  • GPIO_INPUT_PD = (GPIO_CR_CNF_INPUT_PU_PD |                      GPIO_CR_MODE_INPUT) -

    Input pull-down.

  • GPIO_INPUT_PU -

    Input pull-up.

struct afio_reg_map

AFIO register map.

Public Members
__io uint32 EVCR

Event control register.

__io uint32 MAPR

AF remap and debug I/O configuration register.

__io uint32 EXTICR1

External interrupt configuration register 1.

__io uint32 EXTICR2

External interrupt configuration register 2.

__io uint32 EXTICR3

External interrupt configuration register 3.

__io uint32 EXTICR4

External interrupt configuration register 4.

__io uint32 MAPR2

AF remap and debug I/O configuration register 2.

afio_exti_port enum

External interrupt line port selector.

Used to determine which GPIO port to map an external interrupt line onto.

Values:

  • AFIO_EXTI_PA -

    Use port A (PAx) pin.

  • AFIO_EXTI_PB -

    Use port B (PBx) pin.

  • AFIO_EXTI_PC -

    Use port C (PCx) pin.

  • AFIO_EXTI_PD -

    Use port D (PDx) pin.

  • AFIO_EXTI_PE -

    Use port E (PEx) pin.

  • AFIO_EXTI_PF -

    Use port F (PFx) pin.

  • AFIO_EXTI_PG -

    Use port G (PGx) pin.

afio_exti_num enum

External interrupt line numbers.

Values:

  • AFIO_EXTI_0 -

    External interrupt line 0.

  • AFIO_EXTI_1 -

    External interrupt line 1.

  • AFIO_EXTI_2 -

    External interrupt line 2.

  • AFIO_EXTI_3 -

    External interrupt line 3.

  • AFIO_EXTI_4 -

    External interrupt line 4.

  • AFIO_EXTI_5 -

    External interrupt line 5.

  • AFIO_EXTI_6 -

    External interrupt line 6.

  • AFIO_EXTI_7 -

    External interrupt line 7.

  • AFIO_EXTI_8 -

    External interrupt line 8.

  • AFIO_EXTI_9 -

    External interrupt line 9.

  • AFIO_EXTI_10 -

    External interrupt line 10.

  • AFIO_EXTI_11 -

    External interrupt line 11.

  • AFIO_EXTI_12 -

    External interrupt line 12.

  • AFIO_EXTI_13 -

    External interrupt line 13.

  • AFIO_EXTI_14 -

    External interrupt line 14.

  • AFIO_EXTI_15 -

    External interrupt line 15.

afio_remap_peripheral enum

Available peripheral remaps.

See:afio_remap()

Values:

  • AFIO_REMAP_ADC2_ETRGREG = AFIO_MAPR_ADC2_ETRGREG_REMAP -

    ADC 2 external trigger regular conversion remapping.

  • AFIO_REMAP_ADC2_ETRGINJ = AFIO_MAPR_ADC2_ETRGINJ_REMAP -

    ADC 2 external trigger injected conversion remapping.

  • AFIO_REMAP_ADC1_ETRGREG = AFIO_MAPR_ADC1_ETRGREG_REMAP -

    ADC 1 external trigger regular conversion remapping.

  • AFIO_REMAP_ADC1_ETRGINJ = AFIO_MAPR_ADC1_ETRGINJ_REMAP -

    ADC 1 external trigger injected conversion remapping.

  • AFIO_REMAP_TIM5CH4_I = AFIO_MAPR_TIM5CH4_IREMAP -

    Timer 5 channel 4 internal remapping.

  • AFIO_REMAP_PD01 = AFIO_MAPR_PD01_REMAP -

    Port D0/Port D1 mapping on OSC_IN/OSC_OUT.

  • AFIO_REMAP_CAN_1 = AFIO_MAPR_CAN_REMAP_PB8_PB9 -

    CAN alternate function remapping 1 (RX on PB8, TX on PB9)

  • AFIO_REMAP_CAN_2 = AFIO_MAPR_CAN_REMAP_PD0_PD1 -

    CAN alternate function remapping 2 (RX on PD0, TX on PD1)

  • AFIO_REMAP_TIM4 = AFIO_MAPR_TIM4_REMAP -

    Timer 4 remapping.

  • AFIO_REMAP_TIM3_PARTIAL = AFIO_MAPR_TIM3_REMAP_PARTIAL -

    Timer 3 partial remapping.

  • AFIO_REMAP_TIM3_FULL = AFIO_MAPR_TIM3_REMAP_FULL -

    Timer 3 full remapping.

  • AFIO_REMAP_TIM2_PARTIAL_1 = AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 -

    Timer 2 partial remapping 1 (CH1 and ETR on PA15, CH2 on PB3, CH3 on PA2, CH4 on PA3)

  • AFIO_REMAP_TIM2_PARTIAL_2 = AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 -

    Timer 2 partial remapping 2 (CH1 and ETR on PA0, CH2 on PA1, CH3 on PB10, CH4 on PB11)

  • AFIO_REMAP_TIM2_FULL = AFIO_MAPR_TIM2_REMAP_FULL -

    Timer 2 full remapping.

  • AFIO_REMAP_USART2 = AFIO_MAPR_USART2_REMAP -

    USART 2 remapping.

  • AFIO_REMAP_USART1 = AFIO_MAPR_USART1_REMAP -

    USART 1 remapping.

  • AFIO_REMAP_I2C1 = AFIO_MAPR_I2C1_REMAP -

    I2C 1 remapping.

  • AFIO_REMAP_SPI1 = AFIO_MAPR_SPI1_REMAP -

    SPI 1 remapping.

  • AFIO_REMAP_FSMC_NADV = (AFIO_MAPR2_FSMC_NADV |                                 AFIO_REMAP_USE_MAPR2) -

    NADV signal not connected.

  • AFIO_REMAP_TIM14 = (AFIO_MAPR2_TIM14_REMAP |                                 AFIO_REMAP_USE_MAPR2) -

    Timer 14 remapping.

  • AFIO_REMAP_TIM13 = (AFIO_MAPR2_TIM13_REMAP |                                 AFIO_REMAP_USE_MAPR2) -

    Timer 13 remapping.

  • AFIO_REMAP_TIM11 = (AFIO_MAPR2_TIM11_REMAP |                                 AFIO_REMAP_USE_MAPR2) -

    Timer 11 remapping.

  • AFIO_REMAP_TIM10 = (AFIO_MAPR2_TIM10_REMAP |                                 AFIO_REMAP_USE_MAPR2) -

    Timer 10 remapping.

  • AFIO_REMAP_TIM9 = (AFIO_MAPR2_TIM9_REMAP |                                 AFIO_REMAP_USE_MAPR2) -

    Timer 9.

afio_debug_cfg enum

Debug port configuration.

Used to configure the behavior of JTAG and Serial Wire (SW) debug ports and their associated GPIO pins.

See:afio_cfg_debug_ports()

Values:

  • AFIO_DEBUG_FULL_SWJ = AFIO_MAPR_SWJ_CFG_FULL_SWJ -

    Full Serial Wire and JTAG debug.

  • AFIO_DEBUG_FULL_SWJ_NO_NJRST = AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST -

    Full Serial Wire and JTAG, but no NJTRST.

  • AFIO_DEBUG_SW_ONLY = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW -

    Serial Wire debug only (JTAG-DP disabled, SW-DP enabled)

  • AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW -

    No debug; all JTAG and SW pins are free for use as GPIOs.

Devices

gpio_dev *const GPIOA

GPIO port A device.

gpio_dev *const GPIOB

GPIO port B device.

gpio_dev *const GPIOC

GPIO port C device.

gpio_dev *const GPIOD

GPIO port D device.

gpio_dev *const GPIOE

GPIO port E device.

gpio_dev *const GPIOF

GPIO port F device.

gpio_dev *const GPIOG

GPIO port G device.

Functions

void gpio_init(gpio_dev * dev)

Initialize a GPIO device.

Enables the clock for and resets the given device.

Parameters:
  • dev -

    GPIO device to initialize.

void gpio_init_all(void)

Initialize and reset all available GPIO devices.

void gpio_set_mode(gpio_dev * dev, uint8 pin, gpio_pin_mode mode)

Set the mode of a GPIO pin.

Parameters:
  • dev -

    GPIO device.

  • pin -

    Pin on the device whose mode to set, 0–15.

  • mode -

    General purpose or alternate function mode to set the pin to.

See:

gpio_pin_mode

afio_exti_port gpio_exti_port(gpio_dev * dev)

Get a GPIO port’s corresponding afio_exti_port.

Parameters:
  • dev -

    GPIO device whose afio_exti_port to return.

void gpio_write_bit(gpio_dev * dev, uint8 pin, uint8 val)

Set or reset a GPIO pin.

Pin must have previously been configured to output mode.

Parameters:
  • dev -

    GPIO device whose pin to set.

  • pin -

    Pin on to set or reset

  • val -

    If true, set the pin. If false, reset the pin.

uint32 gpio_read_bit(gpio_dev * dev, uint8 pin)

Determine whether or not a GPIO pin is set.

Pin must have previously been configured to input mode.

Parameters:
  • dev -

    GPIO device whose pin to test.

  • pin -

    Pin on dev to test.

Return:

True if the pin is set, false otherwise.

void gpio_toggle_bit(gpio_dev * dev, uint8 pin)

Toggle a pin configured as output push-pull.

Parameters:
  • dev -

    GPIO device.

  • pin -

    Pin on dev to toggle.

void afio_init(void)

Initialize the AFIO clock, and reset the AFIO registers.

void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port)

Select a source input for an external interrupt.

Parameters:
  • exti -

    External interrupt.

  • gpio_port -

    Port which contains pin to use as source input.

See:

afio_exti_num

afio_exti_port

void afio_remap(afio_remap_peripheral remapping)

Perform an alternate function remap.

Parameters:
  • remapping -

    Remapping to perform.

void afio_cfg_debug_ports(afio_debug_cfg config)

Enable or disable the JTAG and SW debug ports.

Parameters:
  • config -

    Desired debug port configuration

See:

afio_debug_cfg

Register Map Base Pointers

GPIOA_BASE

GPIO port A register map base pointer.

GPIOB_BASE

GPIO port B register map base pointer.

GPIOC_BASE

GPIO port C register map base pointer.

GPIOD_BASE

GPIO port D register map base pointer.

GPIOE_BASE

GPIO port E register map base pointer.

GPIOF_BASE

GPIO port F register map base pointer.

GPIOG_BASE

GPIO port G register map base pointer.

AFIO_BASE

AFIO register map base pointer.

Register Bit Definitions

GPIO Control Registers

These values apply to both the low and high configuration registers (ST RM0008: GPIOx_CRL and GPIOx_CRH). You can shift them right by the appropriate number of bits for the GPIO port bit you’re interested in to obtain a bit mask.

For example, to mask out just the value of GPIOA_CRH_CNF12, note that GPIO port bit 12’s configuration starts at bit 18 in the corresponding CRH. Thus, an appropriate mask is GPIOA_BASE->CRH & (GPIO_CR_CNF << 18).

GPIO_CR_CNF_INPUT_ANALOG

GPIO_CR_CNF_INPUT_FLOATING

GPIO_CR_CNF_INPUT_PU_PD

GPIO_CR_CNF_OUTPUT_PP

GPIO_CR_CNF_OUTPUT_OD

GPIO_CR_CNF_AF_OUTPUT_PP

GPIO_CR_CNF_AF_OUTPUT_OD

GPIO_CR_MODE_INPUT

GPIO_CR_MODE_OUTPUT_10MHZ

GPIO_CR_MODE_OUTPUT_2MHZ

GPIO_CR_MODE_OUTPUT_50MHZ

Event Control Register

AFIO_EVCR_EVOE

AFIO_EVCR_PORT_PA

AFIO_EVCR_PORT_PB

AFIO_EVCR_PORT_PC

AFIO_EVCR_PORT_PD

AFIO_EVCR_PORT_PE

AFIO_EVCR_PIN_0

AFIO_EVCR_PIN_1

AFIO_EVCR_PIN_2

AFIO_EVCR_PIN_3

AFIO_EVCR_PIN_4

AFIO_EVCR_PIN_5

AFIO_EVCR_PIN_6

AFIO_EVCR_PIN_7

AFIO_EVCR_PIN_8

AFIO_EVCR_PIN_9

AFIO_EVCR_PIN_10

AFIO_EVCR_PIN_11

AFIO_EVCR_PIN_12

AFIO_EVCR_PIN_13

AFIO_EVCR_PIN_14

AFIO_EVCR_PIN_15

AF Remap and Debug I/O Configuration Register

AFIO_MAPR_SWJ_CFG

AFIO_MAPR_SWJ_CFG_FULL_SWJ

AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST

AFIO_MAPR_SWJ_CFG_NO_JTAG_SW

AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW

AFIO_MAPR_ADC2_ETRGREG_REMAP

AFIO_MAPR_ADC2_ETRGINJ_REMAP

AFIO_MAPR_ADC1_ETRGREG_REMAP

AFIO_MAPR_ADC1_ETRGINJ_REMAP

AFIO_MAPR_TIM5CH4_IREMAP

AFIO_MAPR_PD01_REMAP

AFIO_MAPR_CAN_REMAP

AFIO_MAPR_CAN_REMAP_NONE

AFIO_MAPR_CAN_REMAP_PB8_PB9

AFIO_MAPR_CAN_REMAP_PD0_PD1

AFIO_MAPR_TIM4_REMAP

AFIO_MAPR_TIM3_REMAP

AFIO_MAPR_TIM3_REMAP_NONE

AFIO_MAPR_TIM3_REMAP_PARTIAL

AFIO_MAPR_TIM3_REMAP_FULL

AFIO_MAPR_TIM2_REMAP

AFIO_MAPR_TIM2_REMAP_NONE

AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3

AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11

AFIO_MAPR_TIM2_REMAP_FULL

AFIO_MAPR_TIM1_REMAP

AFIO_MAPR_TIM1_REMAP_NONE

AFIO_MAPR_TIM1_REMAP_PARTIAL

AFIO_MAPR_TIM1_REMAP_FULL

AFIO_MAPR_USART3_REMAP

AFIO_MAPR_USART3_REMAP_NONE

AFIO_MAPR_USART3_REMAP_PARTIAL

AFIO_MAPR_USART3_REMAP_FULL

AFIO_MAPR_USART2_REMAP

AFIO_MAPR_USART1_REMAP

AFIO_MAPR_I2C1_REMAP

AFIO_MAPR_SPI1_REMAP

External Interrupt Configuration Register 1

AFIO_EXTICR1_EXTI3

AFIO_EXTICR1_EXTI3_PA

AFIO_EXTICR1_EXTI3_PB

AFIO_EXTICR1_EXTI3_PC

AFIO_EXTICR1_EXTI3_PD

AFIO_EXTICR1_EXTI3_PE

AFIO_EXTICR1_EXTI3_PF

AFIO_EXTICR1_EXTI3_PG

AFIO_EXTICR1_EXTI2

AFIO_EXTICR1_EXTI2_PA

AFIO_EXTICR1_EXTI2_PB

AFIO_EXTICR1_EXTI2_PC

AFIO_EXTICR1_EXTI2_PD

AFIO_EXTICR1_EXTI2_PE

AFIO_EXTICR1_EXTI2_PF

AFIO_EXTICR1_EXTI2_PG

AFIO_EXTICR1_EXTI1

AFIO_EXTICR1_EXTI1_PA

AFIO_EXTICR1_EXTI1_PB

AFIO_EXTICR1_EXTI1_PC

AFIO_EXTICR1_EXTI1_PD

AFIO_EXTICR1_EXTI1_PE

AFIO_EXTICR1_EXTI1_PF

AFIO_EXTICR1_EXTI1_PG

AFIO_EXTICR1_EXTI0

AFIO_EXTICR1_EXTI0_PA

AFIO_EXTICR1_EXTI0_PB

AFIO_EXTICR1_EXTI0_PC

AFIO_EXTICR1_EXTI0_PD

AFIO_EXTICR1_EXTI0_PE

AFIO_EXTICR1_EXTI0_PF

AFIO_EXTICR1_EXTI0_PG

External Interrupt Configuration Register 2

AFIO_EXTICR2_EXTI7

AFIO_EXTICR2_EXTI7_PA

AFIO_EXTICR2_EXTI7_PB

AFIO_EXTICR2_EXTI7_PC

AFIO_EXTICR2_EXTI7_PD

AFIO_EXTICR2_EXTI7_PE

AFIO_EXTICR2_EXTI7_PF

AFIO_EXTICR2_EXTI7_PG

AFIO_EXTICR2_EXTI6

AFIO_EXTICR2_EXTI6_PA

AFIO_EXTICR2_EXTI6_PB

AFIO_EXTICR2_EXTI6_PC

AFIO_EXTICR2_EXTI6_PD

AFIO_EXTICR2_EXTI6_PE

AFIO_EXTICR2_EXTI6_PF

AFIO_EXTICR2_EXTI6_PG

AFIO_EXTICR2_EXTI5

AFIO_EXTICR2_EXTI5_PA

AFIO_EXTICR2_EXTI5_PB

AFIO_EXTICR2_EXTI5_PC

AFIO_EXTICR2_EXTI5_PD

AFIO_EXTICR2_EXTI5_PE

AFIO_EXTICR2_EXTI5_PF

AFIO_EXTICR2_EXTI5_PG

AFIO_EXTICR2_EXTI4

AFIO_EXTICR2_EXTI4_PA

AFIO_EXTICR2_EXTI4_PB

AFIO_EXTICR2_EXTI4_PC

AFIO_EXTICR2_EXTI4_PD

AFIO_EXTICR2_EXTI4_PE

AFIO_EXTICR2_EXTI4_PF

AFIO_EXTICR2_EXTI4_PG

AF Remap and Debug I/O Configuration Register 2

AFIO_MAPR2_FSMC_NADV

AFIO_MAPR2_TIM14_REMAP

AFIO_MAPR2_TIM13_REMAP

AFIO_MAPR2_TIM11_REMAP

AFIO_MAPR2_TIM10_REMAP

AFIO_MAPR2_TIM9_REMAP