ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32 USART 详解(一):从通信基础概念到底层微观机制

STM32 USART 详解(一):从通信基础概念到底层微观机制 目录前言一、通信专题预备知识从基础概念到UART宏观理解1.1 串行通信与并行通信1.1.1 并行通信的局限1.1.2 串行通信的优势1.2 同步通信与异步通信1.2.1 同步通信1.2.2 异步通信1.3 通信拓扑与双工模式1.3.1 单工模式1.3.2 半双工模式1.3.3 全双工模式1.3.4 UART 的双工特性1.4 UART 核心定义与特性总结1.4.1 官方定义1.4.2 核心特点二、串口通信的宏观认知与硬件架构2.1 USART 在 MCU 内部的定位2.2 通信协议的本质约定与规则三、UART 与 USART 的辨析及物理连接3.1 概念辨析同步与异步3.2 物理连接方式四、串口通信的核心机制与微观原理4.1 GPIO 引脚复用机制4.2 数据传输方向与低位先发原则五、波特率匹配通信节奏的生死线结语 云泽Q个人主页 专栏传送入口: 《C语言》《数据结构》《C》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》《Python》⛺️遇见安然遇见你不负代码不负卿~前言大家好啊我是云泽Q欢迎阅读我的文章一名热爱计算机技术的在校大学生喜欢在课余时间做一些计算机技术的总结性文章希望我的文章能为你解答困惑~一、通信专题预备知识从基础概念到UART宏观理解从这篇文章开始就是 USART 通信。在深入具体的寄存器配置和代码实现之前我们需要先铺垫一些后续通信话题中必不可少的常规概念。这些概念不仅适用于 USART在 I2C、SPI 等其他通信协议中也会反复遇到。同时我们还需要从宏观上理解 MCU、GPU、板子以及 Trunk即 USART四方之间的关系并掌握比特率与波特率的区别。只有具备了这些背景知识我们才能递进式地理解串口通信的数据帧格式、收发原理以及阻塞发送接收的理论基础。1.1 串行通信与并行通信在数字电路的早期并行通信曾经占据主导地位但随着技术的发展串行通信凭借其独特的优势成为了主流。我们需要从物理传输形式的角度来理解这两者的区别。1.1.1 并行通信的局限并行通信是指数据在多位数据线如 8 根、16 根或 32 根上同时传输。虽然看起来一次能传很多位但在实际工程应用中它存在明显的短板成本高昂需要大量的物理连线布线复杂占用 PCB 面积大。信号干扰多根导线并行排列时电流产生的磁场会相互影响导致信号串扰尤其是在高频下更为严重。同步困难由于每根线的物理长度和电气特性难以做到绝对一致信号到达接收端的时间会有微小差异 skew 导致接收端必须等待最慢的那一位信号稳定后才能采样这限制了整体速率的提升。扩展性差如果需要增加数据位宽就必须重新布线。功耗大驱动多根线路翻转需要消耗更多的能量。1.1.2 串行通信的优势串行通信则是将数据在一根线上按位依次传输。虽然单次只传一位但它解决了并行通信的诸多痛点成本低连线极少例如 UART 仅需 TX 和 RX 两根线。抗干扰强线少信号间的磁场干扰大幅降低。速率极高得益于抗干扰能力的提升和差分信号等技术的应用串行通信的频率可以做得非常高。电信号在导线中的传播速度接近光速通过提高频率单位时间内传输的数据总量远超并行通信。扩展性好想要传输更多数据只需延长传输时间即可无需增加物理线路。目前主流的通信接口如 I2C、SPI、USB、PCIe 等本质上都是串行通信。这里需要特别区分一个概念“串行”是一种物理传输形式而“串口”如 UART是一套具体的通信协议标准二者不能混为一谈。1.2 同步通信与异步通信理解了串行与并行的区别后我们需要进一步探讨数据是如何被“对齐”和“识别”的。这就引出了同步与异步的概念。在 STM32 等 MCU 开发中区分这两者最简单直观的方法就是看硬件上有没有时钟线。1.2.1 同步通信同步通信依赖于额外的时钟信号线CLK。工作原理发送方在输出数据的同时输出一路时钟信号。接收方不关心时间过了多久而是严格根据时钟线的边沿上升沿或下降沿或电平状态来采样数据线上的值。特点就像两个人一起走路必须步调一致。时钟线就是那个喊口号的人数据线跟着节奏走。只要有 CLK 线参与同步就是同步通信。1.2.2 异步通信异步通信没有时钟线它完全依赖收发双方预先约定的“节奏”来工作。工作原理既然没有时钟线告诉接收方“现在该读数据了”那么双方必须提前商量好每一位数据持续多长时间。这个时间标准就是波特率后面会细说这里暂时提出来。例如双方约定波特率对应每位数据持续 1 毫秒那么当接收方检测到起始信号后就会每隔 1 毫秒去读取一次数据线上的电平。核心判断依据硬件上不存在时钟线仅靠数据线TX/RX进行通信。UART 就是典型的异步通信因为它只有 TX 和 RX没有 CLK。1.3 通信拓扑与双工模式在通信系统中数据的流向决定了通信的模式。我们可以通过生活中的例子来形象地理解单工、半双工和全双工这三个核心概念。从逻辑关系上讲全双工可以看作是半双工的一种特殊情况而半双工又是单工的特殊情况但在工程定义中我们通常将它们并列区分。1.3.1 单工模式单工是指数据只能沿着一个固定的方向传输永远不能反向。生活案例课堂授课。老师在讲台上讲学生在下面听。这种情况下只允许老师说话发送学生只能听接收学生不能通过同一个信道反向给老师讲课。这就是典型的单工模式。硬件特征只有一条单向的数据通路。1.3.2 半双工模式半双工是指数据可以双向传输但在同一时刻只能进行一个方向的操作。要么 A 发 B 收要么 B 发 A 收不能同时进行。生活案例日常朋友间的对话。当你说话时朋友在听朋友说话时你在听。虽然你们都能说也能听但正常沟通时不会两个人同时开口抢话否则谁也听不清。这种“你说我听我说你听”的交替模式就是半双工。硬件特征通常只有一根数据线或者两根线但在逻辑上互斥使用。1.3.3 全双工模式全双工是指数据可以在两个方向上同时传输。A 发送给 B 的同时B 也可以发送给 A互不干扰。生活案例马路边的争吵。当两个人发生激烈冲突时往往是你骂我一句我同时也骂你一句甚至两个人都在不停地输出同时也在接收对方的辱骂。这种“边说边听”、收发同时进行的状态就是典型的全双工。硬件特征拥有独立的发送路径和接收路径。1.3.4 UART 的双工特性回到我们的主角 UART它是一种全双工的通信方式。因为 UART 在物理上拥有独立的 TX发送线和 RX接收线。这两根线是解耦的TX 线专门负责发RX 线专门负责收互不冲突。因此在使用 UART 通信时我们可以实现真正的同时收发。1.4 UART 核心定义与特性总结综合上述概念我们可以对 UART 做一个精准的定义和特性梳理。1.4.1 官方定义UART 的全称是 Universal Asynchronous Receiver/Transmitter即通用异步收发器。它是 MCU 内部的一个片上外设主要负责将并行数据转换为串行数据发送出去或者将接收到的串行数据转换为并行数据供 CPU 处理。在实际芯片手册中你可能会看到 USARTUniversal Synchronous/Asynchronous Receiver/Transmitter它比 UART 多了一个同步模式的功能但在大多数通用场景下我们主要使用其异步功能所以常统称为串口或 UART。1.4.2 核心特点异步通信如前所述没有时钟线依赖约定的波特率进行位同步。串行通信数据在单根线上按位顺序传输。一对一通信这是 UART 的一个重要限制。每一个串口单元在同一时刻只能与另一个串口单元进行点对点通信。它不像 I2C 或 SPI 那样具备硬件地址寻址能力来支持一主多从。如果要连接多个设备通常需要软件模拟或多路复用。全双工拥有独立的 TX 和 RX 线路支持同时收发。唤醒机制UART 模块通常具备唤醒功能可以在低功耗模式下通过特定的唤醒序列被激活这对于电池供电设备非常重要。二、串口通信的宏观认知与硬件架构接下来需要先建立起对串口通信的宏观认知。这不仅仅是关于代码怎么写更重要的是理解数据在芯片内部是如何流转的以及它与整个 MCU 系统的关系。2.1 USART 在 MCU 内部的定位首先我们要明确一个概念USARTUniversal Synchronous/Asynchronous Receiver Transmitter是 MCU 内部的一个片上外设。当我们打开 STM32 的参考手册查看“存储器与总线结构”图时可以清晰地看到整个系统的拓扑。在这个架构中Cortex-M3 内核通过 ICode、DCode 和 System 总线连接到总线矩阵。而我们的 USART 外设正是挂载在这个庞大的总线网络之下的。具体来说STM32F103ZET6 这款芯片内部默认包含了多个 USART 模块如 USART1 到 USART5。它们并不是独立于 MCU 之外的孤岛而是作为片上资源通过 AHB 系统总线、桥接器Bridge 1/2最终挂载在 APB1 或 APB2 总线上。APB2 总线通常挂载速度较快或较重要的外设例如 USART1、GPIOA~G 等。APB1 总线通常挂载 USART2、USART3、UART4、UART5 等。这意味着CPU 可以通过读写特定的内存地址即寄存器来直接控制这些 USART 模块。每一个 USART 都可以独立工作互不干扰。至于具体的引脚分布和硬件清单我们需要查阅《数据手册》中的“器件一览”表。以 STM32F103Zx 系列为例它明确标注了拥有 5 个 USART/UART 接口。这就像是一个大家庭里有 5 个专门负责对外联络的“通讯员”每个通讯员都有自己的职责范围。2.2 通信协议的本质约定与规则有了硬件基础我们还需要理解通信的灵魂——协议。为什么两个设备连在一起就能说话举个通俗的例子如果我是中国人我说中文对面站着一个葡萄牙朋友他说葡萄牙语。虽然我们在物理上都是人类都有嘴巴和耳朵硬件连通硬件连接没有问题但因为语言不通协议不同我们依然无法交流完全是“牛头不对马嘴”。设备间的通信也是同理。仅仅把线连上是不够的通信双方必须遵守一套预先约定好的规则。这套规则决定了通信双方发送和接收数据快慢的问题波特率接收端怎么知道发送端什么时间开始或结束数据发送的一次计划携带多少数据帧格式只有当双方都严格遵守这些约定时发送端发出的高低电平序列才能在接收端被正确解读为有意义的信息。这一点不仅适用于串口对于后面的 SPI、I2C 等所有通信接口都是通用的真理。GPIO 只是单纯地输出高低电平点个灯而涉及通信的外设核心都在于“协议约定”。三、UART 与 USART 的辨析及物理连接这里再细致说一下它们的区别3.1 概念辨析同步与异步从定义上讲UART通用异步收发器。它只支持异步通信不需要时钟线完全依靠双方约定的波特率来同步数据。USART通用同步/异步收发器。它功能更强大既支持异步模式当作 UART 用也支持同步模式带 CLK 时钟线。但在 STM32 的实际应用场景中绝大多数时候我们使用的都是它的异步模式。因为同步模式需要额外的时钟线应用场景相对较少。所以虽然芯片手册里写的是 USART但在实际工程和交流中我们常把它等同于 UART 来使用。大家在配置时只要不涉及同步时钟线就可以把它们看作是一回事。3.2 物理连接方式理解了概念我们来看物理连接。无论是 UART 还是 USART最基本的连接都需要三根线TX (Transmit)发送端。RX (Receive)接收端。GND (Ground)地线。这里有一个极易犯错的细节交叉连接。MCU 的 TX发送必须连接到外部设备的 RX接收MCU 的 RX接收必须连接到外部设备的 TX发送。这就好比两个人打电话我的嘴巴TX要对着你的耳朵RX你的嘴巴TX要对着我的耳朵RX。如果 TX 接 TXRX 接 RX那是绝对通不了信的。如果是USART 的同步模式除了上述三根线还需要多一根CLK时钟线用于同步数据传输的节奏。但在异步模式下这根线是不需要的。四、串口通信的核心机制与微观原理这一部分是我们理解串口工作的重中之重主要包含引脚复用机制和数据传输的时序逻辑。4.1 GPIO 引脚复用机制很多兄弟会问USART 的信号是怎么从芯片里跑出来的它并没有自己独立的引脚啊。答案是复用Alternate Function。在 STM32 的内部结构中GPIO 引脚不仅仅能作为普通的输入输出口它们还具备“第二职业”。当我们配置 USART 时实际上是在使用 GPIO 引脚的复用功能。发送端 (TX)对应的 GPIO 引脚会被配置为“复用推挽输出”模式。此时引脚的输出控制权从普通的 GPIO 数据寄存器移交给了 USART 外设。USART 内部产生的电平信号直接驱动引脚上的 PMOS/NMOS 管向外发送波形。接收端 (RX)对应的 GPIO 引脚会被配置为“浮空输入”或“上拉输入”模式。外部信号直接进入引脚通过施密特触发器整形后送入 USART 的接收移位寄存器。所以在配置代码时你一定会发现配置 USART 之前必须先开启对应 GPIO 端口的时钟并配置好引脚模式。这就是因为 USART 是“寄生”在 GPIO 引脚上的没有 GPIO 的物理通路USART 的信号就出不去也进不来。4.2 数据传输方向与低位先发原则在串口通信的微观世界里数据的传输是有严格方向的。这里必须建立一个极其重要的认知低位先发LSB First。假设 MCU 要发送一个字节的数据0x55其二进制序列是0101 0101。在示波器上观察 TX 引脚的波形或者在逻辑分析仪上看数据流你会发现最先发出去的是最低位Bit 0。最后发出去的是最高位Bit 7。这意味着先发出去的数据位在时间轴的最右边也就是波形的起始位置但在数值逻辑上它是最左边的那一位。整体来看数据像是在向右移动一样被推送到线路上。这个“低位先发”的规则是串口协议的铁律不能搞反。如果接收端按照高位先发来解析那收到的数据就会完全错乱比如0x55可能会变成别的数或者校验错误。所以在分析波形时一定要时刻记得时间轴越早出现的脉冲代表的是二进制数的越低权重的位。五、波特率匹配通信节奏的生死线为什么有时候通信会乱码这就引出了串口通信中最关键的参数波特率Baud Rate。波特率本质上就是通信的“节奏”或“语速”。它定义了每秒钟传输多少个符号在标准 UART 中1 个符号 1 个比特。让我们回到那个“中国人和葡萄牙人”的例子这次换成节奏的问题发送方“我语速很快1 秒钟发 8 个高低电平变化。”接收方“但我耳朵反应慢我以为你是 2 秒钟才发 1 个变化。”结果会怎样发送方已经噼里啪啦发完了一串数据比如发了 8 个 bit接收方可能才刚刚检测到第一个变化的边沿或者把发送方的 8 个 bit 误读成了 4 个 bit。这就好比两个人跳舞一个人跳得快一个人跳得慢步子完全踩不到一起最后肯定乱套。这就是波特率不匹配的后果。如果发送快、接收慢接收端会漏掉数据或者把多个 bit 当成一个 bit 读。如果发送慢、接收快接收端会在同一个 bit 的电平期间采样多次导致读出一堆重复的错误数据。因此所谓的“约定”在物理层面上最直接的体现就是通信双方的波特率必须严格一致。无论是 9600、115200 还是其他数值只要有一方设错了通信就会失败。总结一下串口通信的宏观过程就是CPU 将数据写入 USART 寄存器 - USART 按照“低位先发”的规则 - 控制复用的 GPIO 引脚 - 以双方约定好的“波特率”节奏 - 将高低电平序列发送到线路上。结语
返回列表