ESP32GPIO基本输入输出
前言
NodeMCU-32_V1.3 开发板 模组共接出 38 个接口,如管脚示意图,管脚功能定义表是接口
定义。
配置 头文件components/driver/include/driver/gpio.h 使用方式
通过调用 gpio_config(const gpio_config_t *pGPIOConfig)函数完成GPIO的初始化gpio_config(const gpio_config_t *pGPIOConfig) GPIO通用配置,配置 GPIO 的模式、上拉、下拉、输入类型。 返回值: ESP_OK成功 ESP_ERR_INVALID_ARG 参数错误 参数: gpio_config_t struct gpio_config_t{ uint64_t pin_bit_mask; gpio_mode_t mode; gpio_pullup_t pull_up_en; gpio_pulldown_t pull_down_en; gpio_int_type_t intr_type; } pin_bit_mask设置需要操作的GPIO引脚,例如我要设置GPIO16和GPIO21则pin_bit_mask应该设置为(1ULL << 1 | 1ULL << 33) mode用于设置gpio的模式 GPIO_MODE_INPUT 输入 GPIO_MODE_OUTPUT 输出 GPIO_MODE_OUTPUT_OD 开漏输出(如果外部或者内部不上拉电阻则无法输出高电平) GPIO_MODE_INPUT_OUTPUT_OD 开漏输入输出 GPIO_MODE_INPUT_OUTPUT 输入输出 pull_up_en用于设置是否上拉 pull_down_en用于设置是否下拉 gpio_int_type_t intr_type用于设置GPIO中断相关属性
GPIO输出
通过函数 gpio_set_level() 设置。esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level) 参数: gpio_num:输出引脚 level:输出方式 1:高电平 0:低电平 返回值: ESP_OK Success ESP_ERR_INVALID_ARG GPIO number errorGPIO输入
通过函数 gpio_get_level()获取int gpio_get_level(gpio_num_t gpio_num) 参数: gpio_num:指定引脚 返回值: 0:输入为低电平 1:输入为高电平 实例#include #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "nvs_flash.h" #include "esp_log.h" #include "driver/gpio.h" const static char *TAG = "GPIO"; static void System_Init(void); void app_main(){ ESP_LOGI(TAG,"System initializtion"); System_Init(); ESP_LOGI(TAG, "GPIO initializtion"); //配置GPIO16为输出 gpio_config_t gpio = { .intr_type = GPIO_INTR_DISABLE, //关闭中断 .mode = GPIO_MODE_OUTPUT, //输出模式 .pin_bit_mask = 1ULL << GPIO_NUM_16, //16引脚 .pull_down_en = GPIO_PULLDOWN_DISABLE, //关闭下拉 .pull_up_en = GPIO_PULLUP_ENABLE //开启上拉 }; gpio_config(&gpio); //配置GPIO为输入 gpio_config_t gpio_two = { .intr_type=GPIO_INTR_DISABLE, .mode=GPIO_MODE_INPUT, .pin_bit_mask = 1ULL << GPIO_NUM_21, .pull_down_en = GPIO_PULLDOWN_ENABLE, .pull_up_en =GPIO_PULLUP_DISABLE }; gpio_config(&gpio_two); int temp; while (1){ //设置输出 gpio_set_level(GPIO_NUM_16,1); //设置输入 temp = gpio_get_level(GPIO_NUM_21); ESP_LOGI(TAG,"gpio 16 level is %d",temp); vTaskDelay(500 / portTICK_PERIOD_MS); //延时 gpio_set_level(GPIO_NUM_16,0); temp = gpio_get_level(GPIO_NUM_21); ESP_LOGI(TAG,"gpio 16 level is %d",temp); vTaskDelay(500 / portTICK_PERIOD_MS); } } static void System_Init(void){ esp_err_t ret = nvs_flash_init(); if(ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND){ ESP_ERROR_CHECK(ret); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); }
将GPIO16和GPIO21短接之后就可以看到输出结果,获取的输入电压在1和0之间不停变换
运行结果: