GPIO

示例列表

本章介绍 GPIO 示例的详细信息。RTL87x2G 为 GPIO 外设提供以下示例。

功能概述

通用输入/输出引脚(GPIO)被分组为一个或多个端口,每个端口最多有 32 个 GPIO。 RTL87x2G 内嵌了 2 个端口,因此有 64 个 GPIO 引脚。可以配置为输入或输出模式。

当输入模式时,外部电平信号变化时,可以触发中断。

GPIO 支持去抖动功能。

特性列表

  • 最多支持 2 个 GPIO 端口,共提供 64 个映射到 IO PAD 的 GPIO 引脚。

  • 可配置输入/输出。

  • 双输出模式:开漏/推挽。

  • 在 GPIO 的输出和输入模式下,可以读取引脚电平。

  • 电平/边沿触发中断。

  • 电平触发:高/低。

  • 边沿触发:上升/下降沿。

Debounce 特性:

  • GPIO 支持去抖动功能,每 4 个 GPIO 共享一个去抖动计数器。

  • 去抖动计数器时钟源:CLK_32K_TIMER 或 GPIO_CLK。

  • 去抖动计数器时钟分频:1, 1/2, 1/4, 1/8, 1/16, 1/32, 1/40, 1/64。

  • 8 位去抖动计数器。

GPIO 输出

每个 GPIO 都可以设置为输出模式,通过设置初始化结构体参数 GPIO_InitTypeDef::GPIO_DirGPIO_DIR_OUT 将对应引脚设置为输出模式。

支持开漏和推挽两种模式,通过初始化结构体参数 GPIO_InitTypeDef::GPIO_OutPutMode 进行配置。

每个 GPIO 的输出电平可以通过调用函数 GPIO_WriteBit() 进行配置,其中 1 表示输出高电平, 0 表示输出低电平。

在输出模式下,可以读取 GPIO 的电平状态。通过调用函数 GPIO_ReadOutputDataBit() 读取对应引脚的 GPIO 电平状态。

GPIO 输入

每个 GPIO 可以设置为输入模式,通过设置初始化结构体参数 GPIO_InitTypeDef::GPIO_DirGPIO_DIR_IN 将对应引脚设置为输入模式。

在输入模式下,可以读取 GPIO 的电平状态。通过调用函数 GPIO_ReadInputDataBit() 读取对应引脚的 GPIO 电平状态。

GPIO 可以检测外部电平变化,满足设定条件,可以触发中断。通过设定 GPIO_InitTypeDef::GPIO_ITCmdENABLE 开启 GPIO 中断。

中断的触发条件支持电平触发和边沿触发,通过 GPIO_InitTypeDef::GPIO_ITTrigger 进行设定。 中断的触发极性支持上升沿(高电平)/下降沿(低电平)触发,通过 GPIO_InitTypeDef::GPIO_ITPolarity 进行设定。

Debounce 功能

GPIO 支持去抖动功能。GPIO 去抖动功能可以过滤掉输入信号的毛刺。

通过设定 GPIO_InitTypeDef::GPIO_ITDebounceENABLE 开启 GPIO 去抖功能。

Debounce 时间的计算公式如下所示:

\[\text{debounce time} = 2T_2 + (\text{count limit} + 1) \times T_2\]

其中 count limit 通过 GPIO_InitTypeDef::GPIO_DebounceCntLimit 进行设置。

\(T_2\) 指 debounce clock period(分频后),可以通过 GPIO_InitTypeDef::GPIO_DebounceClkSourceGPIO_InitTypeDef::GPIO_DebounceClkDiv 计算得到,计算公式如:\(T_2 = \frac{1}{\text{debounce clock source}} \times \text{debounce clock divide}\)

常见问题

GPIO 误触发中断

GPIO 在如下四种模式下会误触发一次中断:

  • PAD 设置为输入高,采用上升沿触发中断。

  • PAD 设置为输入高,采用双边沿触发中断。

  • PAD 设置为输入低,采用下降沿触发中断。

  • PAD 设置为输入低,采用双边沿触发中断。

为避免中断误触发,在 GPIO 中断配置时应遵循如下设置流程:

  1. 屏蔽 GPIO 中断: GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, ENABLE)

  2. 使能 GPIO 中断: GPIO_INTConfig(GPIO_PORT, GPIO_PIN, ENABLE)

  3. 清除 GPIO 中断标志位: GPIO_ClearPendingBit(GPIO_PORT, GPIO_PIN)

  4. 取消屏蔽 GPIO 中断: GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, DISABLE)

若需要更改 GPIO 中断配置时,应遵循如下设置流程:

  1. 屏蔽 GPIO 中断: GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, ENABLE)

  2. 修改 GPIO 中断配置(设置中断触发类型和极性): GPIO_SetITTrigger(GPIO_PORT, GPIO_PIN, GPIO_TriggerMode) GPIO_SetITPolarity(GPIO_PORT, GPIO_PIN, GPIO_ITPolarity)...

  3. 清除 GPIO 中断标志位: GPIO_ClearPendingBit(GPIO_PORT, GPIO_PIN)

  4. 取消屏蔽 GPIO 中断: GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, DISABLE)