日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

启明云端分享|ESP32学习笔记参考GPIO口操作

發布時間:2024/10/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 启明云端分享|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 的介紹

  • 頭文件
#include "driver/gpio.h"
  • ESP32-DevKitC V4 的GPIO接口



2、GPIO設置

  • 簡單方法
gpio_pad_select_gpio(GPIO_NUM_1); // 選擇一個GPIO gpio_set_direction(GPIO_NUM_1, GPIO_MODE_OUTPUT);// 把這個GPIO作為輸出 gpio_set_level(GPIO_NUM_1, 0); // 把這個GPIO輸出低電平

筆記:通過 gpio.h 文件可以調用 gpio_types.h 文件,在 gpio_types.h 文件中定義了一個結構體,定義了ESP32-DevKitC V4的40個GPIO接口,GPIO_NUM_1IO1口。

  • 結構體方法
-`#define GPIO_OUTPUT_IO_0 1 #define GPIO_OUTPUT_PIN_SEL (1ULL<<GPIO_OUTPUT_IO_0) // 配置GPIO_OUT位寄存器void gpio_init(void) {gpio_config_t io_conf; // 定義一個gpio_config類型的結構體,下面的都算對其進行的配置io_conf.intr_type = GPIO_PIN_INTR_DISABLE; // 禁止中斷 io_conf.mode = GPIO_MODE_OUTPUT; // 選擇輸出模式io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器io_conf.pull_down_en = 0; // 禁止下拉io_conf.pull_up_en = 0; // 禁止上拉gpio_config(&io_conf); // 最后配置使能 } gpio_set_level(GPIO_OUTPUT_IO_0, 0); // 把這個GPIO輸出低電平 gpio_set_level(GPIO_OUTPUT_IO_0, 1); // 把這個GPIO輸出高電平`
  • 示例: LED燈閃爍
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h"//用到了FreeRTOS系統中的tesk #include "driver/gpio.h" //配置gpio的頭文件void app_main(void) {gpio_pad_select_gpio(GPIO_NUM_2);//選擇IO2作為GPIO口gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);//把這個GPIO作為輸出while(1) {printf("Turning off the LED\n");gpio_set_level(GPIO_NUM_2, 0);//IO2 輸出為低電平 燈滅vTaskDelay(1000 / portTICK_PERIOD_MS);//延時1000msprintf("Turning on the LED\n");gpio_set_level(GPIO_NUM_2, 1);//IO2 輸出為高電平 燈亮vTaskDelay(1000 / portTICK_PERIOD_MS);//延時1000ms} }

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口操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。