This is the documentation for the latest (main) development branch. If you are looking for the documentation of previous releases, use the drop-down menu on the left and select the desired version.

GPIO

Introduction

GPIO (General-purpose input/output) refers to general-purpose input/output ports. These ports can be controlled via software to handle both input and output operations. For inputs, the default voltage can be configured using pull modes. For outputs, the pin can be set to either high or low voltage by writing to registers.

Function List

  1. Initialization — Initialize the driver.

  2. Configure Direction — Set the direction of the GPIO pin (input or output).

  3. Set Pull Mode — Configure the GPIO pin’s pull-up, pull-down, or floating mode.

  4. Data Read — Read data from the GPIO pin.

  5. Data Write — Write data to the GPIO pin, where 1 sets it high and 0 sets it low.

  6. Pin Multiplexing — Select the IOMUX pin multiplexing function.

  7. Enable Interrupt — Enable GPIO interrupts.

  8. Set Interrupt Mode — Configure the GPIO interrupt mode.

Function Overview

The W800 has 48 GPIO pins that can be configured for multiplexing through IO MUX. The specific relationships are shown in the figure below. FUNC1-FUNC4 represent digital multiplexing, FUNC5 represents GPIO, and FUNC6-FUNC7 represent analog multiplexing. Note: When in analog multiplexing mode, the pin should be configured as input float.

The table below provides the multiplexing information for each pin.

GPIO

FUNC1

FUNC2

FUNC3

FUNC4

FUNC5

FUNC6

FUNC7

GPIO0

WM_IO_MUX_GPIO0_FUNC_I2S_MCLK

WM_IO_MUX_GPIO0_FUNC_LSPI_CS

WM_IO_MUX_GPIO0_FUNC_PWM2

WM_IO_MUX_GPIO0_FUNC_I2S_DO

WM_IO_MUX_GPIO0_FUNC_GPIO

GPIO1

WM_IO_MUX_GPIO1_FUNC_JATG_CK

WM_IO_MUX_GPIO1_FUNC_I2C_SCL

WM_IO_MUX_GPIO1_FUNC_PWM3

WM_IO_MUX_GPIO1_FUNC_I2S_LRCK

WM_IO_MUX_GPIO1_FUNC_GPIO

WM_IO_MUX_GPIO1_FUNC_ADC_0

GPIO2

WM_IO_MUX_GPIO2_FUNC_UART1_RTS

WM_IO_MUX_GPIO2_FUNC_UART2_TX

WM_IO_MUX_GPIO2_FUNC_PWM0

WM_IO_MUX_GPIO2_FUNC_UART3_RTS

WM_IO_MUX_GPIO2_FUNC_GPIO

WM_IO_MUX_GPIO2_FUNC_ADC_3

GPIO3

WM_IO_MUX_GPIO3_FUNC_UART1_CTS

WM_IO_MUX_GPIO3_FUNC_UART2_RX

WM_IO_MUX_GPIO3_FUNC_PWM1

WM_IO_MUX_GPIO3_FUNC_UART3_CTS

WM_IO_MUX_GPIO3_FUNC_GPIO

WM_IO_MUX_GPIO3_FUNC_ADC_2

GPIO4

WM_IO_MUX_GPIO4_FUNC_JATG_SWO

WM_IO_MUX_GPIO4_FUNC_I2C_SDA

WM_IO_MUX_GPIO4_FUNC_PWM4

WM_IO_MUX_GPIO4_FUNC_I2S_BCK

WM_IO_MUX_GPIO4_FUNC_GPIO

WM_IO_MUX_GPIO4_FUNC_ADC_1

GPIO5

WM_IO_MUX_GPIO5_FUNC_UART3_TX

WM_IO_MUX_GPIO5_FUNC_UART2_RTS

WM_IO_MUX_GPIO5_FUNC_PWM_BREAK

WM_IO_MUX_GPIO5_FUNC_UART4_RTS

WM_IO_MUX_GPIO5_FUNC_GPIO

GPIO6

WM_IO_MUX_GPIO6_FUNC_UART3_RX

WM_IO_MUX_GPIO6_FUNC_UART2_CTS

WM_IO_MUX_GPIO6_FUNC_UART4_CTS

WM_IO_MUX_GPIO6_FUNC_GPIO

WM_IO_MUX_GPIO6_FUNC_LCD_SEG31

WM_IO_MUX_GPIO6_FUNC_VRP_EXT

GPIO7

WM_IO_MUX_GPIO7_FUNC_PWM4

WM_IO_MUX_GPIO7_FUNC_LSPI_MOSI

WM_IO_MUX_GPIO7_FUNC_I2S_MCK

WM_IO_MUX_GPIO7_FUNC_I2S_DI

WM_IO_MUX_GPIO7_FUNC_GPIO

WM_IO_MUX_GPIO7_FUNC_LCD_SEG3

GPIO8

WM_IO_MUX_GPIO8_FUNC_PWM_BREAK

WM_IO_MUX_GPIO8_FUNC_UART4_TX

WM_IO_MUX_GPIO8_FUNC_UART5_TX

WM_IO_MUX_GPIO8_FUNC_I2S_BCLK

WM_IO_MUX_GPIO8_FUNC_GPIO

WM_IO_MUX_GPIO8_FUNC_LCD_SEG4

GPIO9

WM_IO_MUX_GPIO9_FUNC_MMC_CLK

WM_IO_MUX_GPIO9_FUNC_UART4_RX

WM_IO_MUX_GPIO9_FUNC_UART5_RX

WM_IO_MUX_GPIO9_FUNC_I2S_LRCLK

WM_IO_MUX_GPIO9_FUNC_GPIO

WM_IO_MUX_GPIO9_FUNC_LCD_SEG5

WM_IO_MUX_GPIO9_FUNC_TOUCH1

GPIO10

WM_IO_MUX_GPIO10_FUNC_MMC_CMD

WM_IO_MUX_GPIO10_FUNC_UART4_RTS

WM_IO_MUX_GPIO10_FUNC_PWM0

WM_IO_MUX_GPIO10_FUNC_I2S_DO

WM_IO_MUX_GPIO10_FUNC_GPIO

WM_IO_MUX_GPIO10_FUNC_LCD_SEG6

WM_IO_MUX_GPIO10_FUNC_TOUCH2

GPIO11

WM_IO_MUX_GPIO11_FUNC_MMC_DAT0

WM_IO_MUX_GPIO11_FUNC_UART4_CTS

WM_IO_MUX_GPIO11_FUNC_PWM1

WM_IO_MUX_GPIO11_FUNC_I2S_DI

WM_IO_MUX_GPIO11_FUNC_GPIO

WM_IO_MUX_GPIO11_FUNC_LCD_SEG7

GPIO12

WM_IO_MUX_GPIO12_FUNC_MMC_DAT1

WM_IO_MUX_GPIO12_FUNC_UART5_TX

WM_IO_MUX_GPIO12_FUNC_PWM2

WM_IO_MUX_GPIO12_FUNC_GPIO

WM_IO_MUX_GPIO12_FUNC_LCD_SEG8

WM_IO_MUX_GPIO12_FUNC_TOUCH_CAP_CMOD

GPIO13

WM_IO_MUX_GPIO13_FUNC_MMC_DAT2

WM_IO_MUX_GPIO13_FUNC_UART5_RX

WM_IO_MUX_GPIO13_FUNC_PWM3

WM_IO_MUX_GPIO13_FUNC_GPIO

WM_IO_MUX_GPIO13_FUNC_LCD_SEG9

GPIO14

WM_IO_MUX_GPIO14_FUNC_MMC_DAT3

WM_IO_MUX_GPIO14_FUNC_UART5_CTS

WM_IO_MUX_GPIO14_FUNC_PWM4

WM_IO_MUX_GPIO14_FUNC_GPIO

WM_IO_MUX_GPIO14_FUNC_LCD_SEG10

WM_IO_MUX_GPIO14_FUNC_TOUCH_CAP_CDC

GPIO15

WM_IO_MUX_GPIO15_FUNC_PSRAM_CK

WM_IO_MUX_GPIO15_FUNC_UART5_RTS

WM_IO_MUX_GPIO15_FUNC_PWM_BREAK

WM_IO_MUX_GPIO15_FUNC_GPIO

WM_IO_MUX_GPIO15_FUNC_LCD_SEG11

GPIO16

WM_IO_MUX_GPIO16_FUNC_PWM0

WM_IO_MUX_GPIO16_FUNC_LSPI_MISO

WM_IO_MUX_GPIO16_FUNC_UART3_TX

WM_IO_MUX_GPIO16_FUNC_PSRAM_CK

WM_IO_MUX_GPIO16_FUNC_GPIO

WM_IO_MUX_GPIO16_FUNC_LCD_SEG12

WM_IO_MUX_GPIO16_FUNC_TOUCH3

GPIO17

WM_IO_MUX_GPIO17_FUNC_PWM1

WM_IO_MUX_GPIO17_FUNC_LSPI_CK

WM_IO_MUX_GPIO17_FUNC_UART3_RX

WM_IO_MUX_GPIO17_FUNC_PSRAM_CS

WM_IO_MUX_GPIO17_FUNC_GPIO

WM_IO_MUX_GPIO17_FUNC_LCD_SEG13

WM_IO_MUX_GPIO17_FUNC_TOUCH4

GPIO18

WM_IO_MUX_GPIO18_FUNC_PWM2

WM_IO_MUX_GPIO18_FUNC_LSPI_CK

WM_IO_MUX_GPIO18_FUNC_UART2_TX

WM_IO_MUX_GPIO18_FUNC_PSRAM_D0

WM_IO_MUX_GPIO18_FUNC_GPIO

WM_IO_MUX_GPIO18_FUNC_LCD_SEG14

WM_IO_MUX_GPIO18_FUNC_TOUCH5

GPIO19

WM_IO_MUX_GPIO19_FUNC_PWM3

WM_IO_MUX_GPIO19_FUNC_LSPI_MISO

WM_IO_MUX_GPIO19_FUNC_UART2_RX

WM_IO_MUX_GPIO19_FUNC_PSRAM_D1

WM_IO_MUX_GPIO19_FUNC_GPIO

WM_IO_MUX_GPIO19_FUNC_LCD_SEG15

WM_IO_MUX_GPIO19_FUNC_TOUCH6

GPIO20

WM_IO_MUX_GPIO20_FUNC_LSPI_CS

WM_IO_MUX_GPIO20_FUNC_UART2_RTS

WM_IO_MUX_GPIO20_FUNC_UART4_TX

WM_IO_MUX_GPIO20_FUNC_PSRAM_D2

WM_IO_MUX_GPIO20_FUNC_GPIO

WM_IO_MUX_GPIO20_FUNC_LCD_SEG16

WM_IO_MUX_GPIO20_FUNC_TOUCH7

GPIO21

WM_IO_MUX_GPIO21_FUNC_LSPI_MOSI

WM_IO_MUX_GPIO21_FUNC_UART2_CTS

WM_IO_MUX_GPIO21_FUNC_UART4_RX

WM_IO_MUX_GPIO21_FUNC_PSRAM_D3

WM_IO_MUX_GPIO21_FUNC_GPIO

WM_IO_MUX_GPIO21_FUNC_LCD_SEG17

WM_IO_MUX_GPIO21_FUNC_TOUCH8

GPIO22

WM_IO_MUX_GPIO22_FUNC_UART1_TX

WM_IO_MUX_GPIO22_FUNC_MMC_CLK

WM_IO_MUX_GPIO22_FUNC_HSPI_CK

WM_IO_MUX_GPIO22_FUNC_SDIO_CK

WM_IO_MUX_GPIO22_FUNC_GPIO

WM_IO_MUX_GPIO22_FUNC_LCD_SEG18

WM_IO_MUX_GPIO22_FUNC_TOUCH9

GPIO23

WM_IO_MUX_GPIO23_FUNC_UART1_RX

WM_IO_MUX_GPIO23_FUNC_MMC_CMD

WM_IO_MUX_GPIO23_FUNC_HSPI_INT

WM_IO_MUX_GPIO23_FUNC_SDIO_CMD

WM_IO_MUX_GPIO23_FUNC_GPIO

WM_IO_MUX_GPIO23_FUNC_LCD_SEG19

WM_IO_MUX_GPIO23_FUNC_TOUCH10

GPIO24

WM_IO_MUX_GPIO24_FUNC_I2S_BCK

WM_IO_MUX_GPIO24_FUNC_MMC_D0

WM_IO_MUX_GPIO24_FUNC_PWM_BREAK

WM_IO_MUX_GPIO24_FUNC_SDIO_D0

WM_IO_MUX_GPIO24_FUNC_GPIO

WM_IO_MUX_GPIO24_FUNC_LCD_SEG20

WM_IO_MUX_GPIO24_FUNC_TOUCH11

GPIO25

WM_IO_MUX_GPIO25_FUNC_I2S_LRCK

WM_IO_MUX_GPIO25_FUNC_MMC_D1

WM_IO_MUX_GPIO25_FUNC_HSPI_CS

WM_IO_MUX_GPIO25_FUNC_SDIO_D1

WM_IO_MUX_GPIO25_FUNC_GPIO

WM_IO_MUX_GPIO25_FUNC_LCD_SEG21

WM_IO_MUX_GPIO25_FUNC_TOUCH12

GPIO26

WM_IO_MUX_GPIO26_FUNC_I2S_DI

WM_IO_MUX_GPIO26_FUNC_MMC_D2

WM_IO_MUX_GPIO26_FUNC_HSPI_DI

WM_IO_MUX_GPIO26_FUNC_SDIO_D2

WM_IO_MUX_GPIO26_FUNC_GPIO

WM_IO_MUX_GPIO26_FUNC_LCD_SEG22

GPIO27

WM_IO_MUX_GPIO27_FUNC_I2S_DO

WM_IO_MUX_GPIO27_FUNC_MMC_D3

WM_IO_MUX_GPIO27_FUNC_HSPI_DO

WM_IO_MUX_GPIO27_FUNC_SDIO_D3

WM_IO_MUX_GPIO27_FUNC_GPIO

WM_IO_MUX_GPIO27_FUNC_LCD_SEG23

GPIO28

WM_IO_MUX_GPIO28_FUNC_HSPI_CK

WM_IO_MUX_GPIO28_FUNC_PWM0

WM_IO_MUX_GPIO28_FUNC_UART5_CTS

WM_IO_MUX_GPIO28_FUNC_I2S_BCLK

WM_IO_MUX_GPIO28_FUNC_GPIO

WM_IO_MUX_GPIO28_FUNC_LCD_SEG24

GPIO29

WM_IO_MUX_GPIO29_FUNC_HSPI_INT

WM_IO_MUX_GPIO29_FUNC_PWM1

WM_IO_MUX_GPIO29_FUNC_UART5_RTS

WM_IO_MUX_GPIO29_FUNC_I2S_LRCLK

WM_IO_MUX_GPIO29_FUNC_GPIO

WM_IO_MUX_GPIO29_FUNC_LCD_SEG25

GPIO30

WM_IO_MUX_GPIO30_FUNC_HSPI_CS

WM_IO_MUX_GPIO30_FUNC_PWM2

WM_IO_MUX_GPIO30_FUNC_LSPI_CS

WM_IO_MUX_GPIO30_FUNC_I2S_DO

WM_IO_MUX_GPIO30_FUNC_GPIO

WM_IO_MUX_GPIO30_FUNC_LCD_SEG26

GPIO31

WM_IO_MUX_GPIO31_FUNC_HSPI_DI

WM_IO_MUX_GPIO31_FUNC_PWM3

WM_IO_MUX_GPIO31_FUNC_LSPI_CK

WM_IO_MUX_GPIO31_FUNC_I2S_DI

WM_IO_MUX_GPIO31_FUNC_GPIO

WM_IO_MUX_GPIO31_FUNC_LCD_SEG27

GPIO32

WM_IO_MUX_GPIO32_FUNC_HSPI_DO

WM_IO_MUX_GPIO32_FUNC_PWM4

WM_IO_MUX_GPIO32_FUNC_LSPI_MISO

WM_IO_MUX_GPIO32_FUNC_UART1_RX

WM_IO_MUX_GPIO32_FUNC_LCD_SEG28

GPIO33

WM_IO_MUX_GPIO33_FUNC_UART5_RX

WM_IO_MUX_GPIO33_FUNC_PWM_BREAK

WM_IO_MUX_GPIO33_FUNC_LSPI_MOSI

WM_IO_MUX_GPIO33_FUNC_I2S_MCLK

WM_IO_MUX_GPIO33_FUNC_GPIO

WM_IO_MUX_GPIO33_FUNC_LCD_SEG29

GPIO34

WM_IO_MUX_GPIO34_FUNC_UART5_TX

WM_IO_MUX_GPIO34_FUNC_GPIO

WM_IO_MUX_GPIO34_FUNC_LCD_SEG29

GPIO35

WM_IO_MUX_GPIO35_FUNC_UART0_TX

WM_IO_MUX_GPIO35_FUNC_PWM0

WM_IO_MUX_GPIO35_FUNC_UART1_RTS

WM_IO_MUX_GPIO35_FUNC_I2C_SDA

WM_IO_MUX_GPIO35_FUNC_GPIO

GPIO36

WM_IO_MUX_GPIO36_FUNC_UART0_RX

WM_IO_MUX_GPIO36_FUNC_PWM1

WM_IO_MUX_GPIO36_FUNC_UART1_CTS

WM_IO_MUX_GPIO36_FUNC_I2C_SCL

WM_IO_MUX_GPIO36_FUNC_GPIO

GPIO37

WM_IO_MUX_GPIO37_FUNC_UART0_RTS

WM_IO_MUX_GPIO37_FUNC_PCM_SYNC

WM_IO_MUX_GPIO37_FUNC_GPIO

WM_IO_MUX_GPIO33_FUNC_LCD_COM1

GPIO38

WM_IO_MUX_GPIO38_FUNC_UART0_CTS

WM_IO_MUX_GPIO38_FUNC_PCM_CK

WM_IO_MUX_GPIO38_FUNC_GPIO

WM_IO_MUX_GPIO38_FUNC_LCD_COM2

GPIO39

GPIO40

WM_IO_MUX_GPIO40_FUNC_LSPI_CK

WM_IO_MUX_GPIO40_FUNC_PWM2

WM_IO_MUX_GPIO40_FUNC_GPIO

WM_IO_MUX_GPIO40_FUNC_LCD_SEG2

GPIO41

WM_IO_MUX_GPIO41_FUNC_LSPI_MISO

WM_IO_MUX_GPIO41_FUNC_PWM3

WM_IO_MUX_GPIO41_FUNC_GPIO

WM_IO_MUX_GPIO41_FUNC_LCD_COM0

GPIO42

WM_IO_MUX_GPIO42_FUNC_LSPI_MOSI

WM_IO_MUX_GPIO42_FUNC_PWM4

WM_IO_MUX_GPIO42_FUNC_GPIO

WM_IO_MUX_GPIO42_FUNC_LCD_SEG1

GPIO43

WM_IO_MUX_GPIO43_FUNC_PSRAM_CS

WM_IO_MUX_GPIO43_FUNC_UART0_TX

WM_IO_MUX_GPIO43_FUNC_GPIO

WM_IO_MUX_GPIO43_FUNC_LCD_COM3

GPIO44

GPIO45

GPIO46

GPIO47

Main Functions

Initialize GPIO

Before using GPIO, the wm_drv_gpio_init function must be called to initialize the GPIO device. Using wm_device_t, the example code is as follows:

wm_device_t *gpio_device;
gpio_device = wm_drv_gpio_init("gpio");

The parameter specifies the device name, which must match the name defined in the device table.

Warning

After initializing GPIO, if wm_drv_gpio_deinit is not called, calling wm_drv_gpio_init again will return NULL.

Configure Direction

GPIO direction configuration is used to set the pin to either input or output mode. Use the wm_drv_gpio_set_dir function to set the pin direction. Example code is as follows:

wm_drv_gpio_set_dir(WM_GPIO_NUM_0, WM_GPIO_DIR_INPUT);
wm_drv_gpio_set_dir(WM_GPIO_NUM_0, WM_GPIO_DIR_OUTPUT);

The first parameter is the pin number, and the second parameter is the direction, which can be either WM_GPIO_DIR_INPUT or WM_GPIO_DIR_OUTPUT.

Configure Pull Mode

GPIO pull mode configuration is used to set the pin to pull-up, pull-down, or floating mode. Use the wm_drv_gpio_set_pullmode function to configure the pin pull mode. Example code is as follows:

wm_drv_gpio_set_pullmode(WM_GPIO_NUM_0, WM_GPIO_PULL_UP);
wm_drv_gpio_set_pullmode(WM_GPIO_NUM_0, WM_GPIO_PULL_DOWN);

The first parameter is the pin number, and the second parameter is the pull mode, which can be WM_GPIO_PULL_UP, WM_GPIO_PULL_DOWN, or WM_GPIO_FLOAT.

Read Data

Use the wm_drv_gpio_data_get function to read data from a GPIO pin. This function returns the current level of the pin. Example code is as follows:

int value = wm_drv_gpio_data_get(WM_GPIO_NUM_0);

The parameter is the pin number.

Write Data

Use the wm_drv_gpio_data_set function to write data to a GPIO pin. This function sets the pin to high level. Example code is as follows:

wm_drv_gpio_data_set(WM_GPIO_NUM_0);

Use the wm_drv_gpio_data_reset function to set the pin to low level. Example code is as follows:

wm_drv_gpio_data_reset(WM_GPIO_NUM_0);

The parameter is the pin number.

Select Pin Multiplexing

Use the wm_drv_gpio_iomux_func_sel function to select the multiplexing function of a GPIO pin. Example code is as follows:

wm_gpio_num_t pin = WM_GPIO_NUM_21;
wm_gpio_pin_mux_t func = WM_GPIO_IOMUX_FUN5;

wm_drv_gpio_iomux_func_sel(pin, func);

The first parameter is the pin number, and the second parameter is the function mode, which can be referenced in the table in the function overview or checked in wm_io_mux.h.

Enable Interrupt

Use the wm_drv_gpio_enable_isr function to enable interrupts for a GPIO pin. Example code is as follows:

wm_drv_gpio_enable_isr(WM_GPIO_NUM_21);

The parameter is the pin number.

Disable Interrupt

Use the wm_drv_gpio_disable_isr function to disable interrupts for a GPIO pin. Example code is as follows:

wm_drv_gpio_disable_isr(WM_GPIO_NUM_21);

The parameter is the pin number.

Set Interrupt Mode

Use the wm_drv_gpio_set_intr_mode function to configure the interrupt trigger mode of a GPIO pin, including falling edge trigger, rising edge trigger, double edge trigger, low level trigger, and high level trigger. Example code is as follows:

wm_drv_gpio_set_intr_mode(WM_GPIO_NUM_21, WM_GPIO_IRQ_TRIG_HIGH_LEVEL);

The first parameter is the pin number, and the second parameter is the interrupt mode, which can be WM_GPIO_IRQ_TRIG_FALLING_EDGE, WM_GPIO_IRQ_TRIG_RISING_EDGE, WM_GPIO_IRQ_TRIG_DOUBLE_EDGE, WM_GPIO_IRQ_TRIG_LOW_LEVEL, or WM_GPIO_IRQ_TRIG_HIGH_LEVEL.

Application Example

For a basic example of using GPIO, please refer to: examples/peripheral/gpio

API Reference

To find GPIO-related APIs, please refer to:

GPIO API Reference