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