嵌入式通信知识串讲:从同步 / 异步传输到 UART 协议 STM32F103 硬件解析
一:同步与异步传输 - 电子设备通信的两种基础策略
在电子设备内部或设备之间交换数据,最基础的方式之一就是通过信号线传输高低电平的变化来表示信息。要实现可靠通信,通信双方(发送方和接收方)必须遵循一定的“语言规则”,这就是通信协议的核心。今天,我们就来深入理解两种最根本的串行数据传输策略:同步传输(Synchronous Transmission) 和 异步传输(Asynchronous Transmission),并通过一个实际例子看看异步传输如何工作。
(1) 核心差异:时钟信号的“指挥官”作用
理解同步与异步的关键,在于是否有一位特殊的“指挥官”——时钟信号(Clock Signal, CLK)。
[图示清晰地展示了A与B之间除了数据线data
,还有一条专门的时钟线clk
,时钟波形上的特定点(如下降沿)标志着读取数据data
的时刻。]
同步传输:依赖专属时钟指挥官
信号线: 至少需要两条线:一条专用的时钟信号线(CLK) 和一条(或一组)数据信号线(DATA)。
工作原理:
发送方(通常是主设备或时钟源)生成一个稳定、周期性变化的时钟信号(如方波)。
时钟信号的特定时刻(如上升沿或下降沿)扮演“指挥官”的角色,明确告诉接收方:“就在这一刻,读取数据线上的电平值!”。
发送方需要在时钟的“指挥时刻”到来之前,将准备发送的数据位稳定地放置在数据线上。
接收方则严格按照时钟信号的指示,在约定的边沿(如下降沿)采样数据线上的电平(高为1,低为0)。
类比: 想象两个人并排坐着翻同一本书(CLK线)。每次指挥者说“翻”(时钟边沿),两人就同时把书翻到下一页,并立刻阅读该页上的内容(读取DATA线)。翻页节奏(时钟频率)控制着阅读速度。
[图示展示了A和B之间只有一条数据线data
连接,并抽象地标明了起始信号通知、数据位bit0、bit1的传输过程,强调双方约定的规则。]
异步传输:靠“暗号”与“固定节奏”协调
信号线: 可以非常精简,通常只需要数据信号线(如TxD/RxD)。 没有专用的时钟线!
工作原理:
通信开始前,发送方和接收方必须严格约定好数据传输的速率(波特率)。双方的内部时钟需独立地、尽可能精确地运行在这个波特率上。
起始信号: 发送方首先发出一个特定的、易于识别的信号模式(如数据线从高电平变为低电平并持续一个固定时间)。这个“暗号”只有一个作用:通知接收方“一大波数据即将来袭,请立即启动内部计时器并按约定波特率准备接收!”。
数据传输: 在起始信号之后,发送方按照约定波特率,将每一位数据(0或1)用数据线上的高低电平持续特定时间来表示。接收方检测到起始信号后,在约定的时间间隔点上采样数据线的电平,将其解释为0或1。
数据表示: 协议必须明确定义什么样的电平模式代表逻辑1(高电平),什么样的模式代表逻辑0(低电平)。一种常见方式是靠电平持续时间来区分(见红外实例)。
关键依赖: 高度依赖双方内部时钟的准确性和严格遵守共同的信号约定(波特率、起始位定义、数据位表示)。
类比: 想象两个人约定好每分钟(波特率)只说一个字。A想要说话时,先大喊一声“预备~跑!”(起始信号),然后按照每分钟一字的节奏说内容(DATA)。B听到“预备~跑!”后立即看表计时,并按照每分钟一次的节奏去听A说的字。双方必须都带走了很准的表(内部时钟)。
(2) 差异对比一览
特性 | 同步传输 | 异步传输 |
---|---|---|
信号线 | 多:需要专用时钟线(CLK) + 数据线 | 少:只需数据线,无需专用时钟线 |
速率 | 可变:提高时钟频率即可增加速率 | 固定:双方必须提前约定相同波特率 |
抗干扰能力 | 强:专用时钟线提供精确同步 | 弱:依赖起始信号检测和本地时钟精度 |
(3) 异步传输实例剖析:红外遥控器解码
[图示详细展示了红外通信的起始信号(9ms低电平+4.5ms高电平)、逻辑1(0.56ms低+1.69ms高)和逻辑0(0.56ms低+0.56ms高)的具体波形及时序,是异步约定原则的完美体现。注意:原图将0的逻辑描述误标为逻辑1,这里按实际波形和上下文修正为逻辑0。]
红外遥控器与电视、空调等设备的通信就是典型的单线异步传输。解码器(负责将红外光信号转换为电信号)通过一条数据线告诉单片机哪个按键被按下了。它们如何沟通?核心就是严格遵守一套极其精确的“时间语言”约定:
起始信号 (Start Bit - “我开讲了!”):
解码器发出:
9ms
的低电平信号,紧接着4.5ms
的高电平信号。作用: 这个独特的长低-长高组合是绝对无误的“开讲通知”,告诉单片机:“注意!我现在要发送一长串按键编码数据了,你赶紧准备按我们的共同速率接收!”
数据位 (Data Bits - “我说的是啥?”):
每一位数据 由两部分组成:
一个固定宽度的引导脉冲 (Leader Pulse):
0.56ms
的低电平。一个可变宽度的间隔空间 (Space):
逻辑
1
:0.56ms
引导脉冲 +1.69ms
的高电平 (总时长 0.56ms + 1.69ms = 2.25ms
)。逻辑
0
:0.56ms
引导脉冲 +0.56ms
的高电平 (总时长 0.56ms + 0.56ms = 1.12ms
)。
工作原理 (接收方):
单片机检测到起始信号后启动。
当检测到一个
0.56ms
的引导脉冲(低电平)后,开始对后续高电平的持续时间进行测量。如果测到高电平持续约
1.69ms
(总间隔 ~2.25ms) - 解释为逻辑1
。如果测到高电平持续约
0.56ms
(总间隔 ~1.12ms) - 解释为逻辑0
。
通过这套精密的时长编码约定(起始信号的特定时序、数据位通过高电平持续时间区分0和1),解码器和单片机仅需一条物理连线就能完成复杂的按键信息传输,完美体现了异步传输的核心——事前约定驱动,全程按时按点。
总结
同步传输: 通过专用时钟线明确指挥接收方在精确时刻读取数据线。它传输速率灵活,抗干扰能力强,但需要额外的时钟线。
异步传输: 无需专用时钟线,依靠双方严格约定的波特率、易于识别的起始信号以及明确的数据位表示规则来协调通信。它连接简单,广泛应用于需要精简布线的场合(如UART串口、红外遥控),但抗干扰能力相对较弱,对时钟精度要求高。
理解同步与异步这两种基础传输原理,是掌握更复杂通信协议(如SPI、I2C,UART——它正是异步传输的一个经典代表)的基石。在接下来的内容中,我们可以深入了解这些具体协议是如何在同步或异步基础之上构建其应用规则的。
二、零基础通关UART串口通信
(1)UART是什么?电子设备的“打电话”技术(配图1)
核心功能:让CPU通过三条电线与其他设备聊天
TxD
线:我说话你听着(发送数据)RxD
线:你说话我听着(接收数据)GND
线:统一音量基准(电压参考)
工作特点:
全双工:像真实通话,双方可同时说和听
异步传输:不需统一喊"1、2、3"(无需时钟线)
(2)数据包装术:UART的“快递信封”规则(配图3/4)
发送字符A
(ASCII码0x41
)的完整流程:
包装环节 | 作用 | 电平状态 | 时长 | 实物类比 |
---|---|---|---|---|
起始位 | 喊“开始送货啦!” | 低电平 | 1t (≈8.7μs) | 快递员按门铃 |
数据位 | 真正的货物内容 | 高低组合 | 8t | 包裹里的商品 |
停止位 | 喊“货物送完!” | 高电平 | 1t | 签收单签字 |
传输顺序:从最低位开始送(先送右边的0)
计算示例:115200波特率 →
t=1/115200秒≈8.7μs
,发1字符需10t≈87μs接收流程
(3)进阶加速术:波特率vs比特率
基础模式:1次运1个包裹
波特率 = 比特率(1次电压变化传1bit)
例:1ms变1次电压 → 传输8bit需8ms
极速模式:1次运2个包裹
电压范围
表示的数据
0~0.7V
00
0.8~1.5V
01
1.6~2.3V
10
2.4~3.3V
11
效率翻倍:传0x78只需4ms(波特率×2=比特率)
(4)防干扰黑科技:UART的“三重安检”(配图2/8)
第一关:起始位防误触(配图8)
检测到下降沿后,在7/16t, 8/16t, 9/16t时刻采样3次
至少2次为低电平才放行 → 防静电误触发
第二关:数据采样防噪(配图2)
每bit时间均匀采样16次
取第7~9次采样多数值为结果(如5个0则判为0)
效果:滤除瞬间干扰(如手机信号干扰)
技术总结:UART的三大设计哲学
极简连接:三线实现双向通话
信封封装:起始位+数据位+停止位保证数据完整
智能防噪:
三重验证起始位(防误启动)
密集采样取均值(抗瞬时干扰
三、STM 32F103_UART硬件结构
(1)开篇:为什么要学 UART 硬件结构?
对于嵌入式 0 基础小白来说,UART 是最容易上手的通信协议之一,掌握它的硬件结构,就像拿到了打开串口通信大门的钥匙。不管是调试单片机、做物联网小项目,还是理解更复杂的通信协议,UART 都是绕不开的基础。这篇文章会把 UART 硬件结构拆成 “积木块”,一步步教你拼出完整知识体系,搭配超多直观截图,保证 0 基础也能看懂!
(2)UART 硬件结构总览(先看全局再拆细节)
先UART 整体模块图),这是 UART 硬件的 “地图”,记住几个核心模块:
- Peripheral Bus Interface:负责和系统总线对接,让 CPU 能控制 UART;
- Rx Block(接收模块)、Tx Block(发送模块):收发数据的核心,里面还有 FIFO(数据缓冲区)、控制单元;
- Interrupt & DMA Requests:处理中断和 DMA 请求,实现数据收发的 “自动通知”;
- Clock Gating:时钟控制,决定 UART 啥时候工作,省电必备;
- DCE / DTE Interface:外部引脚接口,像 TX_DATA、RX_DATA 这些引脚都在这,是 UART 和外界通信的 “嘴巴” 和 “耳朵” 。
三、发送流程拆解(Tx Block 核心逻辑)
(一)发送数据的 “三步走”(对应手写笔记和寄存器图)
看这张 手写发送流程笔记再结合 发送寄存器传输图
第六张 发送流程其实很简单:
- 设置参数:先配置波特率(比如常见的 115200)、数据位(8 位常用)、校验位这些基础参数,让收发双方 “说同一种语言”;
- 数据写入 TDR:CPU 把要发的数据(比如 0x78 )写入 Transmit Data Register(TDR) ,这是数据的 “临时仓库”;
- TDR → 移位寄存器 → 发送:TDR 里的数据会自动搬到 移位寄存器(Transmit Shift Register) ,然后一位一位从 TX_DATA 引脚发出去 。
关键状态位:
- TXE(Bit 7):当 TDR 数据搬到移位寄存器后,硬件会把 TXE 置 1,意思是 “TDR 空了,可以写新数据啦”;
- TC(Bit 6):数据全部发完后,TC 置 1,代表 “发送完成” 。
四、接收流程拆解(Rx Block 核心逻辑)
(一)接收数据的 “信号捕捉”
当外部数据从 RX_DATA 引脚进来,Rx Block 会把串行数据变成并行数据,存在 Rx FIFO(或 RDR 移位寄存器 ) 里。重点看 RXNE 状态位:
- 当 RDR 里的数据成功传到 USART_DR 寄存器,RXNE 会被硬件置 1,意思是 “有新数据啦,CPU 快读!”;
- CPU 读完 USART_DR 里的数据,RXNE 会自动清零,准备接收下一个数据 。
五、波特率配置(通信的 “语言节奏”)
波特率决定了数据发送的 “速度”,看这张 波特率发生器图:
- USART_BRR 寄存器:通过配置 DIV_Mantissa(整数部分)和 DIV_Fraction(小数部分),让 UART 产生需要的波特率;
- 简单说,波特率 = 系统时钟 /(16 × 分频系数 ),分频系数就是 BRR 寄存器里存的值 。
六、控制寄存器家族(CR1、CR2、CR3 怎么用)
看这张 控制寄存器总览图,这些寄存器是 UART 的 “遥控器”,控制着各种功能:
- CR1:配置基本功能(比如是否使能 UART、校验位、中断使能 );
- CR2:设置停止位、时钟极性这些进阶参数;
- CR3:控制 DMA、半双工模式 。
简单举例:如果想让 UART 接收数据时触发中断,只要在 CR1 里把 “RXNEIE 位” 置 1 就行,这样数据一来,CPU 就能收到 “中断通知” 。
七、总结:用 “流程图 + 寄存器” 串联知识
最后,把所有流程串起来:
- 配置控制寄存器(CR1/CR2/CR3 )→ 2. 设置波特率(BRR )→ 3. 写数据到 TDR 发出去 / 读 USART_DR 收数据 → 4. 用 TXE、TC、RXNE 这些状态位判断收发状态 。
最后:UART 硬件结构看起来复杂,但拆成 “发送、接收、波特率、控制寄存器” 这几块,0 基础也能啃下来!多结合实际寄存器图和流程笔记,把 “数据怎么在寄存器里流动” 想清楚,你就掌握 UART 硬件的核心逻辑啦~后续还可以自己用单片机写个简单收发程序,把知识落到实战里,印象会更深!