基本輸入輸出
ESP32 晶片具有 34 個實體 GPIO 管腳(GPIO0 ~ GPIO19、GPIO21 ~ GPIO23、GPIO25 ~ GPIO27 和 GPIO32 ~ GPIO39)。每個管腳都可用作一個通用 IO,或連接配接一個内部的外設信号。通過 IO MUX、RTC IO MUX 和 GPIO 交換矩陣,可配置外設子產品的輸入信号來源于任何的 IO 管腳,并且外設子產品的輸出信号也可連接配接到任意 IO 管腳。這些子產品共同組成了晶片的 IO 控制。更多詳細資訊,請參閱 ESP32 技術參考手冊 > IO MUX 和 GPIO 矩陣(GPIO、IO_MUX) [PDF]。
下表提供了各管腳的詳細資訊,部分 GPIO 具有特殊的使用限制,具體可參考表中的注釋列。

注意
GPIO0、GPIO2、GPIO5、GPIO12、GPIO15作為strapping引腳,也就是說晶片上電時會檢查這些引腳的電壓,具體細節可以檢視晶片手冊進行了解。
SPI0/1會使用GPIO6-11、GPIO16-17,模組内部會使用這些引腳作為SPI flash/psram的引腳,故也不應該使用;
GPIO12-15通常用作JTAG調試使用;
GPIO34-39隻能用作輸入模式并且内部沒有軟體上拉或者下拉功能;
ADC2引腳當WiFi功能被使用時禁止使用,是以建議使用ADC1。
上圖中排針旁邊對應的數字就是GPIO x
為了幫助大家了解IO交換矩陣和IO MUX,我從技術參考手冊裡面找來這張圖幫助大家了解
有些信号可以直接通過IO MUX直接送入外設,有些必須經過IO矩陣
IO的内部上拉、下拉實作框圖
以上我們已經簡單介紹了一些ESP32的GPIO,下面我們根據ESP-IDF開發架構中的GPIO API來具體講講GPIO功能
esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
此接口用于配置GPIO,可以一次配置一個IO,也可以同時配置多個IO,前提是多個IO的屬性相同。
下面讓我們來看一下gpio_config_t這個結構體的内容
pin_bit_mask設定需要操作的GPIO引腳,例如我要設定GPIO18和GPIO19
則pin_bit_mask應該設定為(1ULL << 18 | 1ULL << 19),注意pin_bit_mask類型為uint64_t
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_INTR_DISABLE 關閉中斷
GPIO_INTR_POSEDGE 上升沿觸發
GPIO_INTR_NEGEDGE 下降沿觸發
GPIO_INTR_ANYEDGE 任意邊沿觸發
GPIO_INTR_LOW_LEVEL 低電平觸發
GPIO_INTR_HIGH_LEVEL 高電平觸發
其他操作GPIO的函數詳見GPIO API。
GPIO的中斷
ESP32 GPIO支援上升沿中斷、下降沿中斷、任意邊沿中斷、低電平中斷以及高電平中斷。
首先讓我們看一下ESP-IDF中GPIO中斷相關的API
使用GPIO的中斷功能,首先需要安裝GPIO的全局中斷服務
esp_err_t gpio_install_isr_service(int intr_alloc_flags)
接着我們需要初始化我們需要使用的GPIO,設定觸發方式
esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
關于gpio_config_t此結構體各個字段的含義請檢視上面GPIO基本輸入輸出部分
IO初始化完成後,我們需要注冊IO中斷服務函數并且添加進晶片全局IO中斷服務中,這樣當對應的IO産生相應的事件後,就會觸發我們注冊的函數。
esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void *args)
第一個參數就是引腳号(GPIO_NUM_X(X是對應的數字)),gpio_isr_t是函數指針類型,當gpio_num對應的引腳觸發了對應的中斷事件後,isr_handler這個函數就會被調用,args是回調函數的入參。
如果某個時刻我們想将某個IO中斷關閉可以使用下面的函數
esp_err_t gpio_isr_handler_remove(gpio_num_t gpio_num);
實戰
接下來我們用實際工程來測試GPIO的輸入輸出和中斷功能
建議直接測試ESP-IDF開發架構下的GPIO示例工程
注意:示例中代碼配置GPIO18,19為輸出口,GPIO4,5為輸入口,硬體上需要使用跳線(杜邦線)将他們一一對應連接配接起來,具體是:
GPIO18 -------GPIO4
GPIO19--------GPIO5
接下來我們直接看運作結果,環境搭建,工程編譯等詳見ESP32學習筆記章節。