【ESP32】ESP-IDF开发 | GPIO通用输入输出+LED点灯和按键输入例程

news2024/12/23 13:55:12

1. 简介

        ESP32芯片有34个物理GPIO pad,每个GPIO pad都可用作一个通用IO或连接一个内部的外设信号。IO_MUX、RTC IO_MUX和GPIO交换矩阵用于将信号从外设传输至GPIO pad。

        从上面看到,每个pad可以配置成GPIO功能(连接GPIO交换矩阵)或者直连功能(旁路GPIO交换矩阵),功能的切换通过IO_MUX来实现。

        ESP32一共有162个外设输入信号和176个外设输出信号,要使用某个外设,就要把外设信号连接到对应的GPIO pad上,这个功能就是由GPIO交换矩阵来实现的。

        直连功能和GPIO功能有什么不同呢?快速信号如以太网、SDIO、SPI、JTAG、UART 等,通过旁路 GPIO 交换矩阵可以实现更好的高频数字特性,所以高速信号会直接通过 IO_MUX 输入和输出。

        ESP32除了有物理pad还有RTC pad,这些pads通过RTC IO_MUX可以配置成RTC GPIO功能,这些管脚主要在低功耗的模式下工作,实现低功耗功能。

        但要注意的是,虽然ESP32有34个物理pad,但并不是所有的pad都能任由用户控制或全功能的,下面列出一些开发时要注意的管脚:

  1. GPIO34-39,这几个管脚只有输入功能,没有输出功能,而且没有上下拉配置;
  2. GPIO6-11,如果你的模组带NOR Flash的话,这几个管脚是负责Flash的通信的,不能使用;
  3. GPIO12-15,这几个是JTAG的调试管脚,GPIO12是默认下拉的,GPIO15是默认上拉的,使用时要注意;
  4. GPIO1和GPIO3,这两个是芯片的调试串口和下载串口,不能用作其他使用;
  5. GPIO0、GPIO2和GPIO5,这几个是芯片的strapping管脚,GPIO0默认上拉,GPIO2默认下拉,GPIO5默认上拉,使用时要注意。

2. 例程

2.1 LED点灯

        这个例程实现一个点灯的代码,LED灯每隔一秒改变一次状态。

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"

void app_main()
{
    gpio_config_t gpio_cfg = {0};

    gpio_cfg.mode = GPIO_MODE_OUTPUT;
    gpio_cfg.pull_down_en = GPIO_PULLDOWN_DISABLE;
    gpio_cfg.pull_up_en = GPIO_PULLUP_DISABLE;
    gpio_cfg.intr_type = GPIO_INTR_DISABLE;
    gpio_cfg.pin_bit_mask = (1 << GPIO_NUM_2);
    gpio_config(&gpio_cfg);

    while (1)
    {
        gpio_set_level(GPIO_NUM_2, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_NUM_2, 0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

         GPIO的初始化使用gpio_config一个函数即可,结构体里面配置模式(mode)、下拉(pull_down_en)、上拉(pull_up_en)、中断使能(intr_type)、管脚映射(pin_bit_mask)。

        管脚映射是用一个uint64_t实现的,每个bit代表一个管脚,所以要将管脚号左移对应位数来使能对应管脚。

        主循环里面使用gpio_set_level函数来控制GPIO输出,因为IDF框架是基于FreeRTOS的,所以延时可以直接调用vTaskDelay实现。

        系统启动后的打印如下,可以看到最后一行打印了我们管脚的配置信息,此时开发板上的LED灯就在闪烁了。

2.2 按键输入

        这个例程配置管脚为输入模式,接收按键的输入信号。例程使用的是开发板的IO0管脚作为按键输入。

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "esp_log.h"

#define TAG "app"

void app_main()
{
    gpio_config_t gpio_cfg = {0};

    gpio_cfg.mode = GPIO_MODE_INPUT;
    gpio_cfg.pull_down_en = GPIO_PULLDOWN_DISABLE;
    gpio_cfg.pull_up_en = GPIO_PULLUP_ENABLE;
    gpio_cfg.intr_type = GPIO_INTR_DISABLE;
    gpio_cfg.pin_bit_mask = (1 << GPIO_NUM_0);
    gpio_config(&gpio_cfg);

    while (1) {
        if (0 == gpio_get_level(GPIO_NUM_0)) {

            /* 软件去抖 */
            while (0 == gpio_get_level(GPIO_NUM_0)) {
                vTaskDelay(20 / portTICK_PERIOD_MS);
            }
            
            ESP_LOGI(TAG, "Key pressed");
        }

        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

        GPIO的配置和前面差不多,只是模式改成输入即可,上下拉可以根据自己的开发板设置,我这里设置为上拉。

        主循环使用gpio_get_level不断查看按键状态,检测到按键按下后会经过一个软件去抖处理,防止多次触发,最后就是打印一个log信息。

        需要注意主循环最后的这个延时必须要有!!!因为IDF是默认开启看门狗的,看门狗的喂狗函数在空闲任务里面,而主任务的优先级是高于空闲任务的;如果不加延时,空闲任务会一直运行不了,导致看门狗超时,系统重启。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7-17 汉诺塔的非递归实现

输入样例: 3输出样例: a -> c a -> b c -> b a -> c b -> a b -> c a -> c 分析&#xff1a; 不会汉罗塔的uu们&#xff0c;先看看图解&#xff1a; 非递归代码&#xff1a; #include<iostream> #include<stack> using namespace std; s…

tomcat的Catalinalog和localhostlog乱码

找到tomcat安装目录的loging文件 乱码这两个由UTF-8改为GBK

C++笔记---多态

1. 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。 多态分为编译时多态(静态多态)和运行时多态(动态多态)&#xff0c;这里我们重点讲运行时多态&#xff0c;编译时多态(静态多态)和运行时多态(动态多态)。 编译时多态(静态多态)主要就…

MySQL中定义空值

如果一行中的某个列缺少数据值&#xff0c;该值被置为null&#xff0c;或者说包含一个空。 空是一个难以获得的、未分配的、未知的&#xff0c;或不适用的值。空和0或者空格不相同。0是一个数字&#xff0c;而空格是一个字符。 算术表达式中的空值 示例&#xff1a;计算年薪包…

CSS 布局技巧实现元素左右排列

开发中经常会遇到一个场景&#xff0c;使用 CSS 实现一个子元素靠右&#xff0c;其余子元素靠左。 这里总结一下常见的实现方式。 1. flex 布局 flexbox 是一种常用且灵活的布局方式&#xff0c;适合完成这种需求。将父容器设置为 display: flex&#xff0c;然后使用 margin…

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…

51单片机-系列-单片机基础知识入门流水灯

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 单片机基础知识入门 常用的单片机封装 DIP直插 在DIP直插中&#xff0c;我们根据引脚数量的不同分为8P,14P,16P,18P,20P&#xff0c;这些是窄体&#xff0c;除了窄体之外&…

调用百度翻译API遇到的跨域问题解决方案

&#x1f389; 前言 这几天在学习前端的时候需要写一个实例&#xff0c;是关于翻译功能的。于是便想着在网上找一些API看能不能调用。这里遇到一个很坑的问题&#xff0c;就是我在暑假学习的时候曾经调用过心知天气的API、QQ音乐的API和今日头条的API&#xff0c;都未曾遇到过…

RT-DETR改进策略:BackBone改进|Swin Transformer,最强主干改进RT-DETR

摘要 在深度学习与计算机视觉领域,Swin Transformer作为一种强大的视觉Transformer架构,以其卓越的特征提取能力和自注意力机制,正逐步引领着图像识别与检测技术的革新。近期,我们成功地将Swin Transformer引入并深度整合至RT-DERT(一种高效的实时目标检测与识别框架)中…

BSV区块链上的覆盖网络服务现已开放公测

​​发表时间&#xff1a;2024年8月30日 BSV区块链的覆盖网络服务现已正式开放公测。对于BSV区块链生态系统内的特定交易类型和数据管理及访问&#xff0c;覆盖网络服务都可以为它们提供强大、可扩展、并且合规的解决方案。覆盖网络以及其它即将推出的BSV服务将赋予开发者、企业…

文件误删除?助你一键恢复

文件误删除之痛 在日常的数字生活中&#xff0c;文件误删除是许多用户不时会遭遇的“小确丧”。无论是手滑点击了“删除”键&#xff0c;还是系统崩溃导致的文件丢失&#xff0c;这些意外事件总能让人心急如焚。文件误删除不仅可能意味着重要资料的永久消失&#xff0c;还可能…

Linux驱动编程 - platform平台设备驱动总线

目录 简介&#xff1a; 一、初识platform平台设备驱动 1、platform_driver驱动代码框架 2、platform_device设备代码框架 3、测试结果 3.1 Makefile编译 3.2 加载驱动 二、platform框架分析 1、注册platform总线 1.1 创建platform平台总线函数调用流程 1.2 platform_b…

鸿蒙开发之ArkTS 基础三 数组

数组可以存储多个数据 语法为: let 数组名字:数组类型[] [数据一,数据二 ,数据三 ,数据四 ,数据5⃣️] 例如:学生类数组 let students:string[] [小美,小红,小张,小西] console.log("students",students) 输出 小美,小红,小张,小西 这里不需要遍历就能输出内容…

C Primer Plus 第5章习题

你该逆袭了 红色标注的是&#xff1a;错误的答案 蓝色标注的是&#xff1a;正确的答案 绿色标注的是&#xff1a;做题时有疑问的地方 橙色标注的是&#xff1a;答案中需要着重注意的地方 练习题 一、复习题1、2、3、4、错误答案&#xff1a;正确答案&#xff1a; 5、我的答案&a…

十三,Spring Boot 中注入 Servlet,Filter,Listener

十三&#xff0c;Spring Boot 中注入 Servlet&#xff0c;Filter&#xff0c;Listener 文章目录 十三&#xff0c;Spring Boot 中注入 Servlet&#xff0c;Filter&#xff0c;Listener1. 基本介绍2. 第一种方式&#xff1a;使用注解方式注入&#xff1a;Servlet&#xff0c;Fil…

Cobbler 搭建方法

统信服务器操作系统行业版V20-1000c【Cobbler 搭建】手册 统信服务器操作系统行业版 V20版本上Cobbler 搭建方法 文章目录 功能概述一、使用范围二、cobbler工作流程1. Server 端2. Client 端三、 环境准备1. 测试环境告知,以提供配置时参考:2. 关闭防火墙、selinux:3. 注意…

C#学习笔记(三)Visual Studio安装与使用

博主刚开始接触C#&#xff0c;本系列为学习记录&#xff0c;如有错误欢迎各位大佬指正&#xff01;期待互相交流&#xff01; 上一篇文章中安装了Visual Studio Code来编写调试C#程序&#xff0c;但是博主的目标是编写带窗口的应用程序&#xff0c;了解之后发现需要安装Visual …

python-素数对

题目描述 定义两个相差为 2 的素数称为素数对&#xff0c;如 5 和 7,17 和 19 等&#xff0c;要求找出所有两个数均不大于 n 的素数对。输入 一个正整数 n。1≤n≤10000。输出 所有小于等于 n 的素数对。每对素数对输出一行&#xff0c;中间用单个空格隔开。若没有找到任何素数…

VS2019配置TIFF

1.下载 Index of /libtiff/ (osgeo.org) 2.配置 3.使用 4.测试程序 #include <iostream> #include <cstdint> // 包含 stdint.h 头文件 #include "tiffio.h"int main() {std::cout << "Hello World!\n";// 打开一个 TIFF 文件const ch…

06_Python数据类型_元组

Python的基础数据类型 数值类型&#xff1a;整数、浮点数、复数、布尔字符串容器类型&#xff1a;列表、元祖、字典、集合 元组 元组&#xff08;Tuple&#xff09;是一种不可变的序列类型&#xff0c;与列表类似&#xff0c;但有一些关键的区别。本质&#xff1a;只读的列表…