当前位置: 首页 > news >正文

GPIO交换矩阵和IO_MUX

本人是初学者,在学习过程中总是碰到一些问题,这里记录分享一些心得。

在看ESP32-S3的时候,总是有一种感觉,这么多引脚,好乱啊...

在 esp32-s3_datasheet_cn.pdf 第15页有讲到了IO管脚。其中第2.3.1 是IO MUX 和 GPIO管脚功能。这里面有个GPIO交换矩阵的概念。咱们还是用“高速公路”和“市区道路网”来进行比喻吧。

1. IO_MUX:直通高速公路 (快!但路线固定)

  • 是什么? 想象芯片内部的外设(如 UART、SPI)需要快速进出“城市”(芯片外部)。IO_MUX 就像每条外设专属的直通高速公路出口,直接连到特定的 GPIO 引脚。

  • 特点:

    • 快! 信号不绕路,延迟极低,适合高速通信(如 USB、SD 卡)。

    • 不灵活: 每条高速路只能通到固定出口(引脚)。比如 UART0 的 TX 默认只能走 GPIO1 或 GPIO43 出去。

  • 为什么需要? 发微信如果每句话都要绕路中转站,急死人了吧?高速信号必须走直达!


2. GPIO 交换矩阵:市区智能路网 (灵活!但稍慢)

  • 是什么? 像一个超级智能的交通调度中心,能把任意外设的“车”(信号),灵活调度到任意 GPIO “路口”(引脚)。

  • 特点:

    • 超灵活: 比如你可以把 I2C 的时钟信号 SCL,从默认的 GPIO22 改道到 GPIO15,布线更方便。

    • 稍慢: 信号要“绕立交桥”,比直通高速多花一点时间。

    • 核心价值: 硬件设计自由度高!不再被固定引脚束缚。

✅ 一句话总结比喻

  • IO_MUX = 直达高速 → 快递专线(SPI、JTAG 必选)

  • GPIO 矩阵 = 智能路网 → 网约车调度(I2C、普通 PWM 随意换引脚)


3. 细节

  1. 哪些引脚不能输出? 通常GPIO 34~39 是“单行道”,只能输入(如接按键)。

  2. 哪些引脚要小心?

    • GPIO12:上电时决定 Flash 电压(乱接强上拉可能变砖)。

    • GPIO1:正点原子板子的 LED 负极接这里,低电平才亮(重点!)。

  3. 高速信号别绕路! UART 高速模式、SDIO 等请走 IO_MUX 固定引脚,否则可能卡顿。

下面用一个按键中断控制 LED 的例子来进行说明:

#define LED_PIN 1      // LED 在 IO1
#define BTN_PIN 2      // 假设按键接 IO2(可换任意输入型 GPIO)volatile bool ledState = false; // 记录 LED 状态(volatile 确保中断安全)void setup() {pinMode(LED_PIN, OUTPUT);pinMode(BTN_PIN, INPUT_PULLUP); // 启用内部上拉,按键接地才有效attachInterrupt(digitalPinToInterrupt(BTN_PIN), // 将物理引脚转为中断号btnISR,                         // 中断发生时调用的函数FALLING                         // 按下时从高→低,触发中断);
}void loop() { /* 主循环可空,中断接管一切 */ }// 中断服务函数(简短快速!)
void btnISR() {ledState = !ledState;               // 翻转 LED 状态digitalWrite(LED_PIN, !ledState);   // 注意:LED 低电平亮,所以取反!
}

代码详解:

  • INPUT_PULLUP:启用芯片内部上拉电阻,按键未按下时引脚为高电平。

  • attachInterrupt:配置 IO2 的下降沿中断(按键按下瞬间触发)。

  • GPIO 矩阵作用:按键本可接任意输入引脚(如 GPIO5),中断信号通过 GPIO 矩阵路由到中断控制器。

  • 中断函数 btnISR:要求代码尽量短!这里只翻转 LED 状态。

小结:

  1. 普通输入/输出(LED、按键):放心用 GPIO 矩阵,pinMode()+digitalWrite/Read() 搞定,引脚随便选(避开 34~39 输出)。

  2. 高速外设(SPI 屏、SD 卡):查手册用默认 IO_MUX 引脚(如 SPI 的 CLK 用 GPIO36)。

  3. 需要改引脚? 如把 I2C 换到 GPIO8/9:

    • Arduino 用 Wire.setPins(8, 9); (库底层调用 GPIO 矩阵实现路由)

 

http://www.lryc.cn/news/609298.html

相关文章:

  • 自动驾驶控制算法——LQR控制算法
  • 直流无刷电机(一)
  • C++ <type_traits> 应用详解
  • 10.Redis 数据类型
  • Maximum Subarray Sum II
  • 【超分辨率专题】PiSA-SR:单步Diff超分新突破,即快又好,还能在线调参
  • 【前端:Html】--1.2.基础语法
  • LCL滤波器及其电容电流前馈有源阻尼设计软件【LCLAD_designer】
  • MCU中的复位生成器(Reset Generator)是什么?
  • 2025年EAAI SCI1区TOP,森林救援调度与路径规划:一种新型蚁群优化算法应用,深度解析+性能实测
  • 【Spring】Bean的作用域(单例、多例、请求、会话、Application)
  • ICCV 2025 | EPD-Solver:西湖大学发布并行加速扩散采样算法
  • Azure DevOps — Kubernetes 上的自托管代理 — 第3部分
  • Autoswagger:揭露隐藏 API 授权缺陷的开源工具
  • Stream 过滤后修改元素,却意外修改原列表
  • 人工智能之数学基础:几何型(连续型)随机事件概率
  • Java开发中敏感信息加密存储全解析:筑牢数据安全防线
  • SpringBoot之整合MyBatisPlus
  • linux火焰图
  • javaweb开发之Servlet笔记
  • 大模型中的Token和Tokenizer:核心概念解析
  • 业务系统跳转Nacos免登录方案实践
  • 电力电子技术知识总结-----PWM知识点
  • 【MybatisPlus】join关联查询MPJLambdaWrapper
  • Javaweb————Windows11系统和idea2023旗舰版手动配置Tomcat9全流程解析
  • 性能测试工具ApacheBench、Jmeter
  • ospf笔记和 综合实验册
  • 在Ansys Mechanical中对磨损进行建模
  • 重生之我在10天内卷赢C++ - DAY 10
  • 分布式文件系统05-生产级中间件的Java网络通信技术深度优化