GPIO可用资源
GPIO 6-11 连接到SPI Flash。 GPIO 34-39 只能作为输入且没有内部上拉,其他的可以作为输入或者输出。 GPIO 20, 24, 28, 29, 30, 31 不对外开放。 GPIO 32,33默认连接到RTC域。可能需要如下设置:
REG_CLR_BIT ( RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32P_MUX_SEL) ;
REG_CLR_BIT ( RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32N_MUX_SEL) ;
当GPIO
只有配置为INPUT
或者INPUT_OUTPUT
的时候,gpio_get_level(GPIO_NUM_xx)
才能获得正确的值,如果配置为OUTPUT
的时候gpio_get_level(GPIO_NUM_xx)
的返回值永远是0
。 GPIO36/39使用的时候要注意,因为有些bug,包括但可能不限于如下描述: 对于ESP32-Wrover, GPIO16/GPIO17也不可用,因为已经被PSRAM占用。
GPIO配置方法
#define GPIO_OUTPUT_IO_0 18
#define GPIO_OUTPUT_IO_1 19
#define GPIO_OUTPUT_PIN_SEL ((1<<GPIO_OUTPUT_IO_0) | (1<<GPIO_OUTPUT_IO_1)
#define GPIO_INPUT_IO_0 4
#define GPIO_INPUT_IO_1 5
#define GPIO_INPUT_PIN_SEL ((1<<GPIO_INPUT_IO_0) | (1<<GPIO_INPUT_IO_1))
gpio_config_t io_conf;
io_conf. intr_type = GPIO_PIN_INTR_DISABLE;
io_conf. mode = GPIO_MODE_OUTPUT;
io_conf. pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
io_conf. pull_down_en = 0 ;
io_conf. pull_up_en = 0 ;
gpio_config ( & io_conf) ;
io_conf. intr_type = GPIO_PIN_INTR_POSEDGE;
io_conf. pin_bit_mask = GPIO_INPUT_PIN_SEL;
io_conf. mode = GPIO_MODE_INPUT;
io_conf. pull_up_en = 1 ;
gpio_config ( & io_conf) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_OUTPUT) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLUP_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_OUTPUT" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_OUTPUT_OD) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLUP_ONLY) ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_INPUT_OUTPUT_OD) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLUP_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_OUTPUT_OD" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_INPUT_OUTPUT) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLUP_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_INPUT_OUTPUT" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_INPUT) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLUP_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_INPUT" ) ;
printf ( "pull down test!\n" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_OUTPUT) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLDOWN_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_OUTPUT" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_OUTPUT_OD) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLDOWN_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_OUTPUT_OD" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_INPUT_OUTPUT_OD) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLDOWN_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_INPUT_OUTPUT_OD" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_INPUT_OUTPUT) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLDOWN_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_INPUT_OUTPUT" ) ;
gpio_set_direction ( GPIO_OUTPUT_IO, GPIO_MODE_INPUT) ;
TEST_ESP_OK ( gpio_set_pull_mode ( GPIO_OUTPUT_IO, GPIO_PULLDOWN_ONLY) ) ;
prompt_to_continue ( "mode: GPIO_MODE_INPUT" ) ;
参考文献:
How to configure all gpio as input and output in esp32 - ESP32 Forum
Cant configure gpio33 to input or output · Issue #143 · espressif/esp-idf
esp-idf/test_gpio.c at 05094a9474f5af5b1e66f6f44a75454312ddeac6 · espressif/esp-idf
docs: add warning to gpio_get_level() · espressif/esp-idf@86a1d57
ESP32 勘误表及解决方法 (PDF)