我通常使用下面的代码配置 ESP32 的管脚,下面的代码将 GPIO 20 配置成输入
esp_rom_gpio_pad_select_gpio(20);
if (GPIO_PIN_MUX_REG[20]) {
PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[20]);
}
其实这个方法虽然在大多数情况下是 ok 的,但有时会有问题。比如,我在 ESP32S3 芯片上对 GPIO20 配置时发现,该管脚被拉高,输入低电平不生效。
因为 ESP32S3 的 GPIO20 同时被系统定义为 USB 管脚,内部缺省是上拉的。
通过添加代码后:
gpio_pullup_dis(20);
输入电平才正常。
推荐使用 ESP32 软件系统提供的数据结构和配置函数,这样配置 GPIO 的一些属性时就不会遗漏。
/**
* @brief Configuration parameters of GPIO pad for gpio_config function
*/
typedef struct {
uint64_t pin_bit_mask; /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */
gpio_mode_t mode; /*!< GPIO mode: set input/output mode */
gpio_pullup_t pull_up_en; /*!< GPIO pull-up */
gpio_pulldown_t pull_down_en; /*!< GPIO pull-down */
gpio_int_type_t intr_type; /*!< GPIO interrupt type */
} gpio_config_t;
/**
* @brief GPIO common configuration
*
* Configure GPIO's Mode,pull-up,PullDown,IntrType
*
* @param pGPIOConfig Pointer to GPIO configure struct
*
* @return
* - ESP_OK success
* - ESP_ERR_INVALID_ARG Parameter error
*
*/
esp_err_t gpio_config(const gpio_config_t *pGPIOConfig);