提示:作为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口操作相关推荐

  1. 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

    提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...

  2. 启明云端分享|ESP32摄像头应用方案常遇到的问题

    提示:启明云端从2013年起就作为Espressif(乐鑫科技)大中华区合作伙伴,我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考.同时也用心整理了乐鑫新产品.新 ...

  3. 启明云端分享|ESP32/ESP8266 烧录器 USB-TTL转接板开发工具ESP-T01的使用教程,视频可参考B站

    提示:根据启明云端ESP32/ESP8266 烧录器 USB-TTL转接板开发工具ESP-T01编写的使用教程. 启明云端ESP-T01 烧录器,这是一款为了解决新老用户对ESP系列模组"烧 ...

  4. 启明云端分享|ESP32在开发环境时,环境搭建及应用、软件平台时常遇到的问题答疑(FAQ)

    问题描述及解答: 1.环境搭建 安装环境出现can not create a virtual environment. 该错误是因为新版环境需要安装虚拟python环境,出现错误通常有两个原因. 1. ...

  5. 乐鑫代理启明云端分享| ESP32系列教程之五: Eclipse搭建esp-idf环境

    提示:前面小明已经为大家分享了4个章ESP32系列教程,今天继续为大家分享,希望大家多多关注我们!启明云端作为乐鑫代理,一直希望能帮到更多的开发者能快速上手乐鑫系列芯片的开发. 前言 提示:本文档为E ...

  6. 乐鑫代理-启明云端分享ESP32系列教程之二:Linux搭建esp-idf环境

    提示:此教程依据乐鑫官方的ESP32入门教程总结而来,仅供个人参考学学习,如有错误,欢迎批评指正.乐鑫官方参考: 乐鑫官方文档地址 1.搭建esp-idf环境 1.1安装虚拟机与Ubuntu 未安装请 ...

  7. 乐鑫代理-启明云端分享|ESP32与ESP32-C3功耗对比篇(一)

    ESP32: ESP32在烧录成功hello_world测试固件时的功耗:32mA ESP32-C3: ESP32-C3在烧录成功hello_world测试固件时的功耗:26.3mA 虽然当前的WIF ...

  8. 乐鑫代理启明云端分享|ESP32 系列教程之四: Windows 搭建 esp-idf 环境

    提示: 本文档为 ESP32 教程系列,旨在为客户进行 ESP32 系列芯片开 发提供环境搭建.工程示例演示等方面的参考文档及视频演示,降低 ESP32 系列芯片.模组开发的入门难度. ESP32 教 ...

  9. 乐鑫代理启明云端分享|ESP32系列教程之三: VS Code远程连接Linux

    提示:本文档为ESP32教程系列,旨在为客户进行ESP32系列芯片开发提供环境搭建.工程示例演示等方面的参考文档及视频演示,降低ESP32系列芯片.模组开发的入门难度. ESP32教程系列文档主要参考 ...

最新文章

  1. 重磅!NVIDIA开源C++标准库:Libcu++
  2. Linux 高可用(HA)集群之keepalived详解
  3. Maven——第1章 Maven 介绍
  4. ado filter 多条记录_车里能开直播 行车记录仪十大隐藏设置
  5. django orm级联_Django数据表关联关系映射(一对一、一对多、多对多)
  6. 浅谈街霸的帧数据 (一):frame data
  7. 物化视图是否可以exp导出_物化视图导出导入可能导致物化视图日志的失效
  8. hdu6103[尺取法] 2017多校6
  9. 从0到1写RT-Thread内核——线程定义及切换的实现
  10. Java中String相关类型的区别
  11. 查询、新增、修改、删除方法
  12. 著名音频库多角度对比(多平台可用)
  13. 浅谈UWB室内定位(二)_vortex_新浪博客
  14. Android中UI线程与后台线程交互设计的5种方法
  15. ffmpeg 最简单的转码封装mp4文件
  16. java翻译_java实现英文翻译程序
  17. TFS2010的生成功能
  18. win7桌面计算机图标变了,Win7桌面图标变成未知的文件了怎么办
  19. 路飞学城python电子书闲鱼_路飞学城-python开发集训-第一章之用户登陆做业
  20. 在项目中遇到导入TXT乱码现象。为什么UTF-8不行?ANSI是什么编码?

热门文章

  1. Python 十七章 Web开发
  2. 前端面试高频题:删除数组重复元素的多种方法
  3. 【转】(六)unity4.6Ugui中文教程文档-------概要-UGUI Animation Integration
  4. 中国为何难学欧盟反垄断
  5. vue指令:v-cloak渲染指令(v-cloak 指令是解决屏幕闪动的好方法)
  6. go异常处理:自定义异常代码示例
  7. linux centos7修改默认启动的内核(升级及切换内核)
  8. Hbase 预写日志WAL处理源码分析之 LogCleaner
  9. 【Java面试题视频讲解】合并相同索引的值
  10. JAVA volatile关键字正确使用姿势