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

深入理解 Rockchip 平台 DTS 中的 UART3 引脚配置

在移植和调试基于 Rockchip SoC(如 RK3568、RK3576 等)的板子时,我们经常需要修改 UART 的引脚配置。本文以 uart3 的 DTS 节点为例,逐行解析 UART 的 TX/RX/RTS/CTS 配置,并解释其作用与应用场景。
在这里插入图片描述


1️⃣ 背景知识

在 SoC 芯片上,一个物理引脚往往可以复用为多种功能,例如:

  • GPIO
  • UART(串口)
  • I²C
  • SPI
  • PWM 等

具体选择哪种功能,由 Pinmux(引脚复用控制器) 决定。
在 Linux 内核的 Device Tree (DTS) 文件中,就需要通过 pinctrl 节点来描述这些复用关系。


2️⃣ 示例代码

下面是 DTS 中典型的 UART3 配置:

uart3 {/omit-if-no-ref/uart3m0_xfer: uart3m0-xfer {rockchip,pins =<3 1 9 &pcfg_pull_up>,   // UART3_TX<3 0 9 &pcfg_pull_up>;   // UART3_RX};/omit-if-no-ref/uart3m0_ctsn: uart3m0-ctsn {rockchip,pins =<3 2 9 &pcfg_pull_none>; // UART3_CTS};/omit-if-no-ref/uart3m0_rtsn: uart3m0-rtsn {rockchip,pins =<3 3 9 &pcfg_pull_none>; // UART3_RTS};
};

3️⃣ 关键字段解释

(1) uart3m0_xfer

uart3m0_xfer: uart3m0-xfer {rockchip,pins =<3 1 9 &pcfg_pull_up>,   // UART3_TX<3 0 9 &pcfg_pull_up>;   // UART3_RX
};
  • 功能:配置 UART3 的收发数据线(TXD / RXD)。
  • 必需:UART 要工作,至少需要 TX 和 RX。
  • &pcfg_pull_up:对 RX 脚开启上拉,避免悬空时产生随机数据。

(2) uart3m0_ctsn

uart3m0_ctsn: uart3m0-ctsn {rockchip,pins =<3 2 9 &pcfg_pull_none>; // UART3_CTS
};
  • CTS (Clear To Send):硬件流控输入脚。
  • 作用:对方设备通过拉低 CTS,告诉本机“可以发数据了”。
  • 是否必需:可选,如果不用硬件流控,完全可以省略。

(3) uart3m0_rtsn

uart3m0_rtsn: uart3m0-rtsn {rockchip,pins =<3 3 9 &pcfg_pull_none>; // UART3_RTS
};
  • RTS (Request To Send):硬件流控输出脚。
  • 作用:本机通过拉低 RTS,告诉对方“可以发数据给我”。
  • 是否必需:可选,和 CTS 搭配使用,属于硬件流控。

4️⃣ DTS 配置的实际应用场景

✅ 只用 TX/RX(最常见)

如果只是普通串口通信(例如调试口、MCU 通信):

&pinctrl {uart3 {uart3m0_xfer;};
};

对应的硬件只需接两根线:TXD、RXD。


✅ 带 RTS/CTS 硬件流控

如果通信对速率要求高,或者对方设备需要硬件握手信号:

&pinctrl {uart3 {uart3m0_xfer;uart3m0_ctsn;uart3m0_rtsn;};
};

对应的硬件需要接四根线:TXD、RXD、RTS、CTS。


5️⃣ 常见问题 & 调试经验

  1. GPIO 冲突问题

    • DTS 中一个引脚只能分配给一个功能。
    • 如果同一个 pin 在别的外设节点里被占用了(比如 UART 和 GPIO 同时抢),会看到内核报错:
      pin XXX already requested by ...
      
    • 解决方法:要么换 GPIO,要么禁用对应的外设。
  2. 流控导致通信不通

    • 如果驱动打开了硬件流控,而你硬件只接了 TX/RX → 串口可能无法正常通信。
    • 解决:在 DTS 或驱动里关闭 RTS/CTS,或者在硬件上把 RTS/CTS 正确接线。
  3. 上拉/下拉配置

    • RX 脚最好加 pull_up,避免悬空乱触发。
    • RTS/CTS 一般 pull_none,因为它们由外设驱动。

6️⃣ 总结

  • uart3m0_xfer → 必需,配置 TX/RX。
  • uart3m0_ctsn / uart3m0_rtsn → 可选,用于硬件流控。
  • DTS 中拆分定义,是为了灵活选择串口模式(2 线 or 4 线)。
  • 使用时要注意引脚复用冲突,避免一个 pin 被多个功能抢占。

✍️ 博文结尾建议

初学者如果发现 UART 无法收发,首先检查 DTS 是否只启用了 xfer,并确认没有开启 RTS/CTS;如果启用了硬件流控,记得硬件连线也要完整,否则通信会“卡死”。


http://www.xdnf.cn/news/19467.html

相关文章:

  • Web开发-JavaEE应用原生和FastJson反序列化URLDNS链JDBC链Gadget手搓
  • Photoshop - Ps 编辑图像
  • 深思熟虑智能体:基于 tencent youtu-agent 的五阶段投资研究系统
  • 第一个SpringBoot程序
  • 字数统计器和文本AI处理,非常好用
  • HBase高效并发锁:IdLock极简内存设计
  • 世界模型 World Models概述
  • 计算机算术8-浮点加法
  • uart学习
  • 基于FPGA的简易医疗呼叫器实现,包含testbench
  • 基于单片机智能垃圾桶/垃圾分类/语音垃圾桶
  • 内存模型(Memory Model)是什么?
  • 数据结构(顺序表力扣刷题)
  • 科技信息差(8.30)
  • GLM-Zero:智谱AI最新推出的AI深度推理模型
  • I2C多点触控驱动开发详解
  • shell脚本第五阶段---shell函数与正则表达式
  • 大模型训练中的 logits 是什么
  • react代码分割
  • 算法题(195):点名
  • WorkManager
  • BGP路由协议(四):工作原理
  • 银河麒麟Kylin系统安装各种板卡(反射内存卡、图像注入卡、串口卡等)步骤及解决方案
  • 微服务-ruoyi-cloud部署
  • 直流无刷电机2
  • 网络编程(4)
  • windows系统中安装zip版本mysql,配置环境
  • React学习教程,从入门到精通, ReactJS - 优点与缺点(5)
  • 线段树相关算法题(5)
  • LangGraph结构化输出详解:让智能体返回格式化数据