新星杯-ESP32智能硬件开发--ESP32的I/O组成

ops/2025/1/19 19:06:40/

本博文内容导读📕🎉🔥

ESP32系统的基础外设开发:IO_MUX和GPIO矩阵

 IO_MUX和GPIO矩阵

ESP32的I/O组成了与外部世界交互的基础,ESP32芯片有34个物理GPIO引脚。每个引脚都可用作一个通用I/O,或者连接一个内部的外设信号。

数字引脚(控制信号:FUN_SEL、IE、OE、WPU、WDU等)、162个外设输入和176个外设输出信号(控制信号:SIG_IN_SEL、SIG_OUT_SEL、IE、OE等)、快速外设输入/输出信号(控制信号:IE、OE等)以及RTC IO_MUX之间的信号选择和连接关系,构成了ESP32的I/O复用和GPIO交换矩阵。

IO_MUX、RTC、IO_MUX和GPIO交换矩阵用于将信号从外设传输至GPIO引脚,这些模块共同组成了芯片的I/O控制。ESP32芯片的34个物理GPIO引脚编号为:0~19、21~23、25~27、32~39。其中,GPIO 34~39仅用作输入引脚,其他的既可以作为输入又可作为输出引脚。

1. IO_MUX中每个GPIO引脚有一组寄存器

可以配置成GPIO功能,连接GPIO交换矩阵。

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

2. GPIO交换矩阵是外设输入/输出信号和引脚之间的全交换矩阵

芯片输入方向:162个外设输入信号都可以选择任意一个GPIO引脚的输入信号。

芯片输出方向:每个GPIO引脚输出信号可为176个外设输出信号中的任意一个。

3. RTC IO_MUX用于控制GPIO引脚的低功耗和模拟功能

只有部分GPIO引脚具有这些功能,包括引脚0、2、4、12~15、25~27、32~39。        

因此,输入和输出的方式有如下几种:通过GPIO交换矩阵的外设输入/输出、IO_MUX的直接I/O功能、RTC IO_MUX的I/O功能。

通过GPIO矩阵的外设输入

为实现通过GPIO交换矩阵接收外设输入信号,需要配置GPIO交换矩阵从34个GPIO(0~19、21~23、25~27、32~39)中获取外设输入信号的索引号(0~18、23~36、39~58、61~90、95~124、140~155、164~181、190~195、198~206)。输入信号通过IO_MUX从GPIO引脚中读取。IO_MUX必须设置相应引脚为GPIO功能,这样GPIO引脚的输入信号就可进入GPIO交换矩阵,然后通过GPIO交换矩阵进入选择的外设输入。

把某个外设信号Y绑定到某个GPIO引脚X的配置过程为:

(1)在GPIO交换矩阵中配置外设信号Y的GPIO_FUNCy_IN_SEL_CFG寄存器,设置GPIO_FUNCy_IN_SEL字段为要读取的GPIO引脚X的值,清空GPIO引脚的其他字段。

(2)在GPIO交换矩阵中配置GPIO引脚X的GPIO_FUNCx_OUT_SEL_CFG寄存器、清空GPIO_ENABLE_DATA[x]字段。要强制引脚的输出状态始终由GPIO_ENABLE_DATA[x]字段决定,则将GPIO_FUNCx_OUT_SEL_CFG寄存器的GPIO_FUNCx_OEN_SEL字段位置为1。GPIO_ENABLE_DATA[x]字段在GPIO_ENABLE_REG(GPIOs 0~31)或GPIO_ENABLE1_REG(GPIOs 32-39)中,清空此位可以关闭GPIO引脚的输出。

(3)配置IO_MUX寄存器来选择GPIO交换矩阵。配置GPIO引脚X的IO_MUX_x_REG。设置功能字段(MCU_SEL)为GPIO X的IO_MUX功能(引脚功能3,数值为2)。置位FUN_IE使能输入。置位或清空FUN_WPU和FUN_WPD位,使能或关闭内部上拉/下拉电阻器。

(4)GPIO输入情况,GPIO_IN_REG/GPIO_IN1_REG寄存器存储着每一个GPIO引脚的输入值。任意GPIO引脚的输入值都可以随时读取,而无须为某一个外设信号配置GPIO交换矩阵。但是,需要为引脚X的IO_MUX_x_REG寄存器配置FUN_IE位以使能输入。

通过GPIO矩阵的外设输出

为实现通过GPIO交换矩阵输出外设信号,需要配置GPIO交换矩阵将输出索引号为(0~18、23~37、61~121、140~215、224~228的外设信号输出到28个GPIO (0~19、21~23、25~27、32~33)。输出信号从外设输出到GPIO交换矩阵,然后到达IO_MUX。IO_MUX必须设置相应引脚为GPIO功能,这样输出GPIO信号就能连接到相应引脚,如图所示。

其中,输出索引号为224~228的外设信号,可配置从一个GPIO引脚输入后,直接由另一个GPIO引脚输出。176个输出信号中的某一个信号通过GPIO交换矩阵到达IO_MUX,然后连接到某个引脚。

输出外设信号Y到某一GPIO引脚X的步骤如下:

(1)在GPIO交换矩阵里配置GPIO引脚X的GPIO_FUNCx_OUT_SEL_CFG寄存器和GPIO_ENABLE_DATA[x]字段。设置GPIO_FUNCx_OUT_SEL_CFG寄存器的GPIO_FUNCx_OUT_SEL字段为外设输出信号Y的索引号(Y)。要将信号强制使能为输出模式,把GPIO引脚X的GPIO_FUNCx_OUT_SEL_CFG寄存器的GPIO_FUNCx_OEN_SEL置位,并且在GPIO_ENABLE_REG寄存器的GPIO_ENABLE_DATA[x]字段置位。或者对GPIO_FUNCx_OEN_SEL清零,此时输出使能信号由内部逻辑功能决定。GPIO_ENABLE_DATA[x]字段在GPIO_ENABLE_REG(GPIOs0~31)或GPIO_ENABLE1_REG (GPIOs 32~39)中,清空此位可以关闭GPIO引脚的输出。

(2)选择以开漏方式输出,可以设置GPIO引脚X的GPIO_PINx寄存器中的GPIO_PINx_PAD_DRIVER位。

(3)配置IO_MUX寄存器选择GPIO的交换矩阵。配置GPIO引脚X的IO_MUX_x_REG。设置功能字段(MCU_SEL)为GPIO X的IO_MUX功能(引脚功能3,数值为2)。设置FUN_DRV字段为特定的输出强度值(0~3),值越大,输出驱动能力越强。在开漏模式下,通过置位/清零FUN_WPU和FUN_WPD使能或关闭上拉/下拉电阻器。

GPIO交换矩阵也可以用于简单GPIO输出,设置GPIO_OUT_DATA寄存器中某一位的值可以写入对应的GPIO引脚。为实现某一引脚的GPIO输出,设置GPIO交换矩阵GPIO_FUNCx_OUT_SEL寄存器为特定的外设索引值256(0x100)。

IO_MUX的直接I/O功能

对于ESP32系统与外设交互的快速信号,例如,以太网、SDIO、SPI、JTAG、UART等,会旁路GPIO交换矩阵以实现更好的高频数字特性,也就是说,高速信号会直接通过IO_MUX输入/输出。

这种模式比使用GPIO交换矩阵的灵活度要低,即:每个GPIO引脚的IO_MUX寄存器只有较少的功能选择,但可以实现更好的高频数字特性。为实现外设I/O旁路GPIO交换矩阵必须配置两个寄存器:

(1)GPIO引脚的IO_MUX必须设置为相应的引脚功能请扫描二维码获取,不同引脚能够实现的功能不同,可以实现多达6个功能。

(2)对于输入信号,必须清零SIG_IN_SEL寄存器,直接将输入信号输出到外设。 复位配置如下:复位一栏是每个引脚复位后的默认配置。

•0-IE=0(输入关闭)。•1-IE=1(输入使能)。•2-IE=1,WPD=1(输入使能,下拉电阻)。•3-IE=1,WPU=1(输入使能,上拉电阻)。•R-引脚通过RTC_MUX具有RTC/模拟功能。•I-引脚只能配置为输入GPIO。

RTC IO_MUX的I/O功能

18个GPIO引脚具有低功耗(低功耗RTC)性能和模拟功能,由ESP32的RTC子系统控制。这些功能不使用IO_MUX和GPIO交换矩阵,而是使用RTC_MUX将I/O指向RTC子系统。当这些引脚被配置为RTC GPIO引脚,作为输出引脚时仍然能够在芯片处于深度睡眠模式下保持输出电平值或者作为输入引脚使用时可以将芯片从深度睡眠中唤醒。

每个引脚的模拟和RTC功能是由RTC_GPIO_PINx寄存器中的RTC_IO_TOUCH_PADx_TO_GPIO 位控制的。此位默认置为1,通过IO_MUX子系统输入输出信号。

如果清零RTC_IO_TOUCH_PADx_TO_GPIO位,则输入/输出信号会经过RTC子系统。这种模式下,RTC_GPIO_PINx寄存器用于数字I/O,引脚模拟功能也可以实现。

GPIO引脚与相应的RTC引脚及模拟功能的映射关系。

请注意,RTC_IO_PINx寄存器使用的是RTC GPIO引脚的序号,不是GPIO引脚的序号。

GPIO类型定义

  ESP32开发环境,定义了自身的常量、变量和函数,这些构成了ESP32编程开发的基础,下面简单介绍一下ESP32的GPIO编程基础知识。在esp_err.h、gpio_types.h和gpio.h头文件中,定义了基于C语言的一些预定义。

1.esp_err_t类型定义

定义了esp_err_t类型,也就是int32类型在ESP32开发环境中的名称,很多函数和方法的返回值都是这个类型,定义如下:

typedef int32_t esp_err_t;
主要定义的错误常量类型如下:
#define ESP_OK                        0       /*成功*/
#define ESP_FAIL                      -1       /*失败*/
#define ESP_ERR_NO_MEM            0x101     /*内存溢出*/
#define ESP_ERR_INVALID_ARG       0x102     /*无效参数*/
#define ESP_ERR_INVALID_STATE     0x103     /*无效状态*/
#define ESP_ERR_INVALID_SIZE       0x104     /*无效大小*/
#define ESP_ERR_NOT_FOUND         0x105     /*未发现请求资源*/
#define ESP_ERR_NOT_SUPPORTED    0x106     /*不支持操作或功能*/
#define ESP_ERR_TIMEOUT            0x107     /*操作超时*/
#define ESP_ERR_INVALID_RESPONSE  0x108     /*收到的回应无效 */
#define ESP_ERR_INVALID_CRC        0x109     /*!< CRC或校验和无效*/
#define ESP_ERR_INVALID_VERSION   0x10A     /*无效的版本*/
#define ESP_ERR_INVALID_MAC       0x10B     /*无效的MAC地址*/
#define ESP_ERR_WIFI_BASE          0x3000     /*WiFi错误代码的起始编号*/
#define ESP_ERR_MESH_BASE         0x4000     /*MESH错误代码的起始编号*/
#define ESP_ERR_FLASH_BASE        0x6000     /*闪存错误代码的起始编号*/

2.gpio_num_t类型

gpio_num_t是ESP32引脚的定义,是枚举类型。

3.gpio_int_type_t中断类型

gpio_int_type_t是ESP32中断类型的定义,是枚举类型。

4.gpio_mode_t类型

gpio_mode_t类型定义了ESP32的GPIO模式,是枚举类型。

5.gpio_pullup_t类型

gpio_pullup_t类型定义了ESP32的GPIO的上拉类型,是枚举类型。

6.gpio_pulldown_t类型

gpio_pulldown_t类型定义了ESP32的GPIO的下拉类型,是枚举类型。

7.gpio_config_t结构体定义

gpio_config_t函数简要配置GPIO引脚的参数定义

8.gpio_pull_mode_t类型

gpio_pull_mode_t定义输入/输出接口Pad的拉取模式类型,是枚举类型

9.gpio_drive_cap_t

gpio_drive_cap_t为GPIO的接口驱动能力的定义,是枚举类型

 GPIO示例程序

本部分包括基于ESP IDF的VS Code、Arduino和MicroPython环境的三种代码实现。采用经典的LED每隔1s闪烁实验,实验硬件连接方式,在ESP32开发板的GPIO18上连接LED正极,再连接1KΩ电阻,开发板的GND引脚连接LED负极,如图4-4所示。

电阻的选择以不超过LED的驱动电压为准,一般情况下:白色LED:3.0~3.3V,红色LED:1.8~2.2V,蓝色LED:3.0~3.2V,绿色LED:2.9~3.1V,黄色LED:1.8~2.0V。


http://www.ppmy.cn/ops/151455.html

相关文章

嵌入式我没有解决问题的能力不知道该怎么做,没有这种能力也就没有活着的必要了

如何像程序员一样思考 — 解决问题的经验教训 --- How to think like a programmer — lessons in problem solving 像程序员一样思考——提高解决问题的能力 - 【雨歌】 - 博客园

latin1_swedish_ci(latin1 不支持存储中文、日文、韩文等多字节字符)

文章目录 1、SHOW TABLE STATUS WHERE Name batch_version;2、latin1_swedish_ci使用场景注意事项修改字符集和排序规则修改表的字符集和排序规则修改列的字符集和排序规则修改数据库的默认字符集和排序规则 3、ALTER TABLE batch_version CONVERT TO CHARACTER SET utf8mb4 C…

Python----Python爬虫(Scrapy的应用:CrawlSpider 使用,爬取小说,CrawlSpider版)

一、CrawlSpider 使用 1.1、CrawlSpider CrawSpiders 是 Scrapy 框架中的一个特殊爬虫类&#xff0c;它用于处理需要跟随链接并抓取多个页面的情况。相比于基本的 Spider 类&#xff0c;CrawSpiders 提供了一个更灵活、更强大的方式来定义爬取规则。 在Scrapy中Spider是所有爬…

springboot 项目配置https

当你的前端网页添加了 https 后&#xff0c;那么 由于… 前端调用后端的接口&#xff0c;同样的也需要配置 https。下面以宝塔为例&#xff0c;如何实现&#xff0c;请看下面讲解&#xff1a; 1.准备好 SSL 证书 application.yml源文件&#xff1a; spring:redis:host: 60.20…

自动驾驶汽车目前面临的最大技术挑战是什么?

1. 感知技术的局限性 恶劣天气和复杂环境&#xff1a;当前的传感器在恶劣天气&#xff08;如雨、雾、雪&#xff09;和复杂道路条件下的感知能力仍有待提高。例如&#xff0c;激光雷达在穿透雨雾时的能力有限&#xff0c;易受强光干扰&#xff1b;摄像头在夜间和恶劣天气中的视…

PT2025 单触控双输出 LED 调光IC

1 产品概述 ● PT2025 是一款单键电容式触摸控制 ASIC&#xff0c;支持单通道触摸输入和单路/双路 PWM 输出&#xff0c;可引脚配置4种模式。主要应用于触摸卫浴镜开关盒&#xff0c;具有介质自适应、高抗干扰、宽工作电压范围、灯光无频闪、外围器件少的突出优势。 2 主要特性…

2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习

目录 一、打开Chrome DevTools的三种方式二、Elements元素面板三、Console控制台面板四、Sources面板五、Network面板六、Application面板七、逆向调试技巧 7.1 善用搜索7.2 查看请求调用堆栈7.3 XHR 请求断点7.4 Console 插桩7.5 堆内存函数调用7.6 复制Console面板输出 工…

@Scope(“prototype“)

Scope("prototype") 是 Spring 框架中用于定义 Bean 作用域的注解之一&#xff0c;它的主要作用是将一个 Bean 定义成 原型作用域&#xff08;Prototype Scope&#xff09;。在原型作用域下&#xff0c;每次从 Spring 容器中请求这个 Bean 时&#xff0c;都会创建一个…