第一章 ESP32 GPIO入門之閃燈
概述
本文為ESP32 學習,GPI0入門之閃燈,更多學習目錄請查閱ESP32學習目錄。
1.1 基本概念
ESP32 芯片有 40 個物理 GPIO pad,有部分 GPIO pad 不可用或者沒有對應的芯片封裝上的管腳。每個 pad 都可用作一個通用 IO,或連接一個內部的外設信號的。 IO_MUX、 RTC IO_MUX 和 GPIO 交換矩陣用於將信號從外設傳輸至 GPIO pad。這些模塊共同組成了芯片的 IO 控制。
1.1.1種輸入輸出模式
GPIO_MODE_INPUT 輸入
GPIO_MODE_OUTPUT 輸出
GPIO_MODE_OUTPUT_OD 開漏輸出
GPIO_MODE_INPUT_OUTPUT_OD 開漏輸入輸出
GPIO_MODE_INPUT_OUTPUT 輸入輸出
1.1.2 中斷類型
GPIO_INTR_DISABLE 禁用GPIO中斷
GPIO_INTR_POSEDGE GPIO中斷類型:上升沿
GPIO_INTR_NEGEDGE 下降沿
GPIO_INTR_ANYEDGE 上升沿和下降沿
GPIO_INTR_LOW_LEVEL 輸入低電平觸發
GPIO_INTR_HIGH_LEVEL 輸入高電平觸發
1.1.3 上下拉使能
GPIO_PULLUP_DISABLE 禁用GPIO上拉電阻
GPIO_PULLUP_ENABLE 啟用GPIO上拉電阻
GPIO_PULLDOWN_DISABLE 禁用GPIO下拉電阻
GPIO_PULLDOWN_ENABLE 啟用GPIO下拉電阻
1.1.4 驅動能力
GPIO_DRIVE_CAP_0 弱 weak
GPIO_DRIVE_CAP_1 強
GPIO_DRIVE_CAP_2 默認值
GPIO_DRIVE_CAP_DEFAULT 默認值
GPIO_DRIVE_CAP_3 最強
1.2 實現函數分析

/* GPIO Example * * Brief: * This test code shows how to configure gpio and blink led * * USED GPIO: GPIO16(blue led) * * func: blink led * * note: * */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" #include "esp_system.h" #include "esp_err.h" #include "esp_event_loop.h" #include "esp_event.h" #include "esp_attr.h" #include "esp_log.h" #include "esp_eth.h" #define GPIO_BLUE_LED 16 static const char *TAG = "GPIO_Example"; void hw_gpio_init(void) { gpio_config_t io_conf; //disable interrupt io_conf.intr_type = GPIO_PIN_INTR_DISABLE; //set as output mode io_conf.mode = GPIO_MODE_OUTPUT; //bit mask of the pins that you want to set,e.g.GPIO16 io_conf.pin_bit_mask = (1<<GPIO_BLUE_LED); //disable pull-down mode io_conf.pull_down_en = 0; //disable pull-up mode io_conf.pull_up_en = 1; //configure GPIO with the given settings gpio_config(&io_conf); } void app_main() { hw_gpio_init(); while(1) { // ESP_EARLY_LOGE(TAG, "blink led. E"); // ESP_EARLY_LOGW(TAG, "blink led. W"); // ESP_EARLY_LOGI(TAG, "blink led. I"); // ESP_EARLY_LOGD(TAG, "blink led. D"); // ESP_EARLY_LOGV(TAG, "blink led. V"); gpio_set_level(GPIO_BLUE_LED, 0); vTaskDelay(1000 / portTICK_RATE_MS); gpio_set_level(GPIO_BLUE_LED, 1); vTaskDelay(1000 / portTICK_RATE_MS); } }