2. 串口硬件基础:UART协议简介、RS232电平与TTL电平区别、常见串口芯片特性

在嵌入式Linux系统启动早期,串口(UART)是内核与开发者之间最可靠的“生命线”。当网络、USB、显示驱动尚未初始化时,串口几乎是唯一能够输出调试信息的通道。理解串口的硬件基础,是配置早期串口输出和捕获调试信息的先决条件。

2.1 UART协议简介

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种采用异步串行通信的物理层协议。它不需要单独的时钟线,而是通过双方约定相同的波特率(Baud Rate)来同步数据采样点。

2.1.1 数据帧格式

一个标准的UART数据帧由以下部分组成:

  • 起始位(Start Bit):逻辑低电平(0),标志数据传输开始。
  • 数据位(Data Bits):通常为5~9位,常见配置为8位。
  • 校验位(Parity Bit):可选,用于简单的错误检测(奇校验/偶校验/无校验)。
  • 停止位(Stop Bit):逻辑高电平(1),标志数据传输结束,常见为1位或2位。
关键参数对齐: 内核早期调试通常使用 115200 8N1 配置,即波特率115200、8位数据位、无校验、1位停止位。
UART 异步数据帧结构 (8N1) 起始位 (0) D0 D1 D2 D3 D4 D5 D6 D7 停止位 (1) 数据发送方向 (LSB First)

2.2 RS232电平与TTL电平区别

UART协议定义了数据的逻辑格式,但物理层信号的电压标准则有多种。在嵌入式开发中,最常遇到的是TTL电平和RS232电平。混淆这两种电平是导致串口通信失败的常见原因。

特性 TTL电平 (3.3V/5V) RS232电平 (±12V)
逻辑“1” 2.0V ~ VCC (通常3.3V或5V) -3V ~ -15V
逻辑“0” 0V ~ 0.8V +3V ~ +15V
电压摆幅 小 (0~3.3V/5V) 大 (-15V~+15V)
通信距离 短 (通常 < 1.5米) 长 (可达15米以上)
抗干扰能力 弱 强 (差分/大摆幅)
常见应用 SoC内部、开发板、传感器 工业设备、PC串口(DB9)
⚠️ 电平不匹配风险: 将RS232电平(如±12V)直接连接到TTL电平的SoC引脚,会烧毁芯片的GPIO或UART控制器。必须使用电平转换芯片(如MAX3232)进行双向转换。
TTL 电平 vs RS232 电平对比 TTL (3.3V) 逻辑“0” (0V ~ 0.8V) 逻辑“1” (2.0V ~ 3.3V) 0V 3.3V RS232 逻辑“1” (-3V ~ -15V) 逻辑“0” (+3V ~ +15V) -15V +15V ⚠️ 关键差异:RS232逻辑电平与TTL完全相反,且电压摆幅更大。 连接时必须使用电平转换芯片(如 MAX3232、SP3232)。

2.3 常见串口芯片特性

在嵌入式Linux系统中,UART控制器通常集成在SoC内部,但外接的串口芯片(如16550兼容芯片)或SoC内部集成的UART IP(如PL011)决定了驱动程序的编写方式和功能特性。

2.3.1 16550 UART (广泛兼容)

16550是PC时代最经典的UART芯片,其寄存器接口已成为事实上的工业标准。许多SoC内部的UART都提供“16550兼容模式”。

  • FIFO深度:16字节(发送和接收各16字节),相比早期8250的1字节FIFO,能显著减少CPU中断频率。
  • 寄存器布局:标准8个寄存器(RBR/THR/IER/IIR/FCR/LCR/MCR/LSR),通过基地址+偏移量访问。
  • Linux驱动:使用 8250 或 8250_early 驱动,早期调试通常使用 earlycon=uart8250,mmio32,0x... 。
  • 局限性:自动流控(RTS/CTS)支持较弱,波特率生成器精度一般。

2.3.2 PL011 UART (ARM PrimeCell)

PL011是ARM公司设计的PrimeCell系列UART IP核,广泛用于Cortex-A系列SoC(如树莓派、Jetson系列)。

  • FIFO深度:16字节(与16550相同),但控制逻辑更现代。
  • 寄存器布局:与16550完全不同,使用ARM PrimeCell标准寄存器接口。
  • Linux驱动:使用 amba-pl011 驱动,早期调试使用 earlycon=pl011,mmio32,0x... 。
  • 优势:内置完善的自动流控、红外支持、可编程采样率,波特率精度更高。
特性 16550 UART PL011 UART
FIFO深度 16字节 (Tx/Rx) 16字节 (Tx/Rx)
寄存器接口 标准8寄存器 (PC兼容) ARM PrimeCell 标准
自动流控 部分支持 (需额外配置) 完善支持 (硬件RTS/CTS)
Linux驱动名称 8250 / 8250_early amba-pl011
earlycon参数示例 earlycon=uart8250,mmio32,0x3f8 earlycon=pl011,mmio32,0x3f201000
常见SoC x86 PC、部分MIPS、旧款ARM Cortex-A系列 (树莓派、Jetson)
16550 vs PL011 UART 架构对比 16550 UART 8 寄存器接口 16B FIFO 波特率发生器 流控 (弱) Linux驱动: 8250 / 8250_early 常见于 x86 / 旧款 ARM / MIPS PL011 UART PrimeCell 寄存器 16B FIFO 可编程采样率 自动流控 (强) Linux驱动: amba-pl011 常见于 Cortex-A (树莓派 / Jetson)

2.4 如何选择与识别串口芯片

在调试嵌入式Linux启动时,快速识别目标板使用的UART类型是配置 earlycon 的第一步。

  • 查看设备树(Device Tree):在 .dts 文件中搜索 compatible 属性,如 "ns16550" 或 "arm,pl011"。
  • 查看内核配置:检查 CONFIG_SERIAL_8250 或 CONFIG_SERIAL_AMBA_PL011 是否启用。
  • 查看SoC手册:确认UART模块的基地址、中断号以及是否支持FIFO模式。
💡 调试技巧: 如果不确定UART类型,可以尝试在bootloader(如U-Boot)中先测试串口输出。U-Boot通常能自动检测或通过环境变量配置UART参数。如果U-Boot能正常输出,则记录其使用的寄存器基地址和时钟频率,传递给内核的 earlycon 参数。