启明云端分享|ESP32学习笔记参考GPIO口操作
提示:作為Espressif(樂鑫科技)大中華區合作伙伴及sigmastar(廈門星宸)VAD合作伙伴,我們不僅用心整理了你在開發過程中可能會遇到的問題以及快速上手的簡明教程供開發小伙伴參考。同時也用心整理了樂鑫及星宸科技的新產品、新方案的主要特點及應用!希望你能第一時間了解并快速用上好的方案和產品!
ESP32 芯片有40個物理GPIO pad。每個pad都可用作一個通用 IO,或連接一個內部的外設信號。IO_MUX、RTC IO_MUX 和 GPIO 交換矩陣用于將信號從外設傳輸至 GPIO pad。這些模塊共同組成了芯片的 IO 控制。
注意:其中 GPIO 34-39 僅用作輸入管腳,其他的既可以作為輸入又可以作為輸出管腳。GPIO6-11通常用于SPI閃存。
- 官方資料
ESP-IDF 編程指南——GPIO&RTC GPIO
ESP32-DevKitC V4 的介紹
- 頭文件
- ESP32-DevKitC V4 的GPIO接口
2、GPIO設置
- 簡單方法
筆記:通過 gpio.h 文件可以調用 gpio_types.h 文件,在 gpio_types.h 文件中定義了一個結構體,定義了ESP32-DevKitC V4的40個GPIO接口,GPIO_NUM_1指IO1口。
- 結構體方法
- 示例: LED燈閃爍
3、GPIO與中斷
3.1 API介紹
gpio_config_t 結構體
-
pin_bit_mask端口號: GPIO_SEL_X。
-
intr_type中斷觸發類型: GPIO_INTR_DISABLE關閉中斷觸發;GPIO_INTR_POSEDGE上升沿;
-
GPIO_INTR_NEGEDGE下降沿; GPIO_INTR_ANYEDGE雙邊沿;GPIO_INTR_LOW_LEVEL低電平; GPIO_INTR_HIGH_LEVEL高電平。
-
mode模式:
GPIO_MODE_DISABLE關閉;GPIO_MODE_INPUT輸入;GPIO_MODE_OUTPUT輸出;GPIO_MODE_OUTPUT_OD開漏輸出; PIO_MODE_INPUT_OUTPUT_OD開漏輸入輸出; GPIO_MODE_INPUT_OUTPUT輸入輸出。
-
pull_up_en上拉電阻:GPIO_PULLUP_DISABLE斷開;GPIO_PULLUP_ENABLE使能。
-
pull_down_en下拉電阻:GPIO_PULLDOWN_DISABLE斷開;GPIO_PULLDOWN_ENABLE使能。
gpio_config
通過gpio_config_t結構體初始化gpio功能
返回值:ESP_OK初始化成功;ESP_ERR_INVALID_ARG初始化。
gpio_reset_pin
將gpio重置為默認狀態
gpio_set_level
設置輸出電平 返回值:ESP_OK成功;ESP_ERR_INVALID_ARG GPIO編號錯誤。
gpio_get_level
獲取輸入電平 返回值:如果pad沒有配置為輸入(或輸入輸出),則返回值總是0。
gpio_set_drive_capability
設置GPIO驅動能力
gpio_get_drive_capability
獲取GPIO 驅動能力
補充函數
gpio_set_direction 設置GPIO模式
gpio_set_pull_mode 配置GPIO的上拉/下拉功能
gpio_pullup_en 開啟上拉模式
gpio_pullup_dis 關閉上拉模式
gpio_pulldown_en 開啟下拉模式
gpio_pulldown_dis 關閉下拉模式
gpio_set_intr_type 設置中斷觸發模式
3.2 中斷API
gpio_install_isr_service
安裝GPIO ISR服務的驅動,開啟每個引腳GPIO中斷處理程序 。
這個函數與gpio_isr_register()不兼容。如果使用這個函數,ISR服務將提供一個全局GPIO ISR,并且通過gpio_isr_handler_add()函數注冊單個的pin處理程序。
gpio_uninstall_isr_service
卸載GPIO ISR服務的驅動,釋放相關資源。
gpio_isr_handler_add
為GPIO引腳添加中斷處理回調函數。
ISR處理程序不再需要用IRAM_ATTR來聲明,除非你在gpio_install_isr_service()中分配ISR時傳遞了ESP_INTR_FLAG_IRAM標志。
這個ISR處理程序將從ISR中調用。因此存在一個堆棧大小限制(可在menuconfig中配置為“ISR堆棧大小”)。
gpio_isr_handler_remove
刪除GPIO引腳的中斷處理回調函數。
gpio_intr_enable
使能GPIO中斷
gpio_intr_disable
關閉GPIO中斷
gpio_isr_register
統一為所有的GPIO口注冊一個全局的ISR,即任何的GPIO中斷觸發,都會調用該中斷處理函數
3.3 示例
用boot控制led燈 由電路可知boot鍵接的是IO0口
#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"#define ESP_INTR_FLAG_DEFAULT 0 gpio_num_t gpio_led_num = GPIO_NUM_32; // 連接LED的GPIO gpio_num_t gpio_contact_switch_num = GPIO_NUM_0; // 連接觸點開關GPIO static xQueueHandle gpio_evt_queue = NULL; // 事務隊列int cnt = 0; // 計數,反轉LED /*** 中斷處理*/ static void IRAM_ATTR gpio_isr_handler(void *arg) {cnt++;// 反轉gpio的電平,讓LED燈出現顯示的反轉gpio_set_level(gpio_led_num, cnt % 2);uint32_t gpio_num = (uint32_t)arg;// 向gpio事件處理的隊列中添加一條消息xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); } static void gpio_task_led(void *arg) {uint32_t io_num;for (;;){if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)){printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));}} } void app_main(void) {// 設置控制LED的GPIO為輸出模式gpio_set_direction(gpio_led_num, GPIO_MODE_OUTPUT);// 設置作為中斷的GPIO pin為輸出模式gpio_set_direction(gpio_contact_switch_num, GPIO_MODE_INPUT);// 設置作為中斷模式為沿上升沿觸發gpio_set_intr_type(gpio_contact_switch_num, GPIO_INTR_POSEDGE);// 創建隊列處理來自isr的gpio事件gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));// 啟動gpio的任務xTaskCreate(gpio_task_led, "gpio_task_led", 2048, NULL, 10, NULL);// 初始化全局GPIO的中斷服務程序,并設置中斷的電平等級gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);// 將指定的GPIO掛載到中斷服務上,并設定中斷觸發的回調函數和傳入參數gpio_isr_handler_add(gpio_contact_switch_num, gpio_isr_handler, (void *) gpio_contact_switch_num); }小伙伴們,看明白了嗎?如果還有不明白的,可以留言給小明哈!
總結
以上是生活随笔為你收集整理的启明云端分享|ESP32学习笔记参考GPIO口操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启明云端分享| ESP32-S3 + 4
- 下一篇: 启明云端分享|A133核心板SOM130