天天看點

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

基本輸入輸出

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 具有特殊的使用限制,具體可參考表中的注釋列。

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

注意

GPIO0、GPIO2、GPIO5、GPIO12、GPIO15作為strapping引腳,也就是說晶片上電時會檢查這些引腳的電壓,具體細節可以檢視晶片手冊進行了解。

SPI0/1會使用GPIO6-11、GPIO16-17,模組内部會使用這些引腳作為SPI flash/psram的引腳,故也不應該使用;

GPIO12-15通常用作JTAG調試使用;

GPIO34-39隻能用作輸入模式并且内部沒有軟體上拉或者下拉功能;

ADC2引腳當WiFi功能被使用時禁止使用,是以建議使用ADC1。

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

上圖中排針旁邊對應的數字就是GPIO x

為了幫助大家了解IO交換矩陣和IO MUX,我從技術參考手冊裡面找來這張圖幫助大家了解

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

有些信号可以直接通過IO MUX直接送入外設,有些必須經過IO矩陣

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

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這個結構體的内容

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

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學習筆記章節。

ESP32之GPIO的輸入輸出和中斷基本輸入輸出GPIO的中斷實戰

繼續閱讀