1. 项目概述与核心价值
串口通信,也就是我们常说的UART,可以说是嵌入式开发者的“老朋友”了。从早期的51单片机到如今复杂的多核处理器,几乎每一款微控制器都离不开它。它就像设备之间最基础的“对话”方式,简单、直接,虽然速度不快,但胜在稳定可靠。无论是连接GPS模块获取定位数据,还是通过蓝牙模块与手机交互,亦或是作为最经典的调试打印输出口,UART的身影无处不在。然而,很多开发者对UART的认知可能还停留在“配置波特率、发送接收字节”的层面,对其内部如何高效、可靠地工作知之甚少。
这次,我们就以飞思卡尔(现为NXP)经典的MCF5373 ColdFire微控制器中的UART模块为蓝本,进行一次深度“解剖”。这个模块的设计非常具有代表性,其核心思想——通过双缓冲区和状态机来协调CPU与串行外设的速度差异——是许多现代UART IP核的共通设计。理解它,你就能触类旁通。我们将重点关注三个核心机制: 发送/接收缓冲区 如何作为数据中转站, 中断系统 如何让CPU从轮询的苦海中解脱出来,以及 DMA 如何实现数据搬运的“自动驾驶”,从而将CPU资源彻底释放给更重要的任务。对于需要处理大量串口数据或追求极低功耗的应用来说,吃透这些机制,是写出高效、稳定驱动代码的关键。
2. UART模块整体架构与数据流解析
在深入寄存器细节之前,我们有必要先建立起UART模块的宏观视图。你可以把它想象成一个精心设计的“邮局”系统。
2.1 核心功能单元拆解
一个完整的UART模块通常包含以下几个关键部分:
- 波特率发生器 :这是整个模块的“心跳”,负责产生发送和接收数据位所需的精确时钟。它通常由一个可编程的分频器构成,将系统主时钟分频到我们所需的波特率(如9600,115200等)。在MCF5373中,这由
UBG1n和UBG2n两个寄存器组成的16位分频器实现。 - 发送器 :负责将CPU写入的并行数据(通常是一个字节)转换成按位输出的串行数据流。它包括一个 发送保持寄存器 和一个 发送移位寄存器 ,构成了我们常说的“发送缓冲区”。
- 接收器 :功能与发送器相反,负责将输入的串行数据流转换回并行数据供CPU读取。它包括一个 接收移位寄存器 和一个由多个 接收保持寄存器 构成的 FIFO(先入先出)缓冲区 。
- 控制与状态逻辑 :这是一系列寄存器的大脑,包括模式寄存器(
UMR1n,UMR2n)、命令寄存器(UCRn)、状态寄存器(USRn)等。它们配置工作模式(数据位、停止位、奇偶校验)、控制模块启停,并实时反映模块状态(如是否准备好发送/接收)。 - 中断与DMA控制器 :这是提升效率的关键。当特定事件(如发送缓冲区空、接收缓冲区有数据、线路状态变化)发生时,可以触发中断通知CPU,或者直接触发DMA请求,让DMA控制器自动搬运数据,无需CPU干预。
2.2 数据流动全景图
让我们跟踪一个字节从CPU到串口线,以及从串口线回到CPU的完整旅程:
-
发送旅程 :
- CPU检查状态寄存器
USRn的TXRDY位。如果为1,表示发送保持寄存器为空,可以写入新数据。 - CPU向发送缓冲区寄存器
UTBn写入一个字节。这个写入操作会 自动清除TXRDY位,防止CPU过快写入造成数据覆盖。 - 写入
UTBn的数据实际上进入了 发送保持寄存器 。此时,如果 发送移位寄存器 为空(即正在发送前一个字节或空闲),保持寄存器中的数据会立即被加载到移位寄存器中。一旦加载完成,TXRDY位会 再次被置1 ,通知CPU可以发送下一个字节。 - 发送移位寄存器在波特率时钟的驱动下,将数据一位一位地通过
UnTXD引脚发送出去(先发送起始位,然后是数据位LSB first,最后是停止位)。
- CPU检查状态寄存器
-
接收旅程 :
- 接收器持续监测
UnRXD引脚,寻找由高到低(起始位)的跳变。 - 检测到起始位后,接收器在数据位的理论中心点进行采样,将串行数据移入 接收移位寄存器 。
- 一个完整的字符(包括停止位)接收完毕后,如果 接收FIFO (由三个接收保持寄存器构成)有空位,移位寄存器中的数据(及相关的错误状态,如奇偶错误、帧错误)会被压入FIFO。
- 一旦FIFO中至少有一个字符,状态寄存器
USRn的RXRDY位会被置1。如果FIFO被填满(三个位置都占满),FFULL位也会被置1。 - CPU读取接收缓冲区寄存器
URBn。这个操作会从FIFO的顶部“弹出”最早接收到的字符和其状态信息。读取后,如果FIFO中还有数据,RXRDY保持为1;如果FIFO被清空,则RXRDY被清除。
- 接收器持续监测
这个“保持寄存器+移位寄存器”的双缓冲结构,是解决CPU(快)与串行通信(慢)之间速度矛盾的核心设计。它给了CPU一个短暂的窗口去准备下一个数据,而不会丢失当前正在传输的数据。
3. 发送与接收缓冲区深度剖析
缓冲区是UART数据管理的核心。理解它们的运作机制,是避免数据丢失或错误的关键。
3.1 发送缓冲区:UTBn与TXRDY的“双人舞”
发送缓冲区的核心是 发送保持寄存器 和 发送移位寄存器 。 U


1624

被折叠的 条评论
为什么被折叠?



