一、概述
本文主要讲解Synopsys APB UART Databook中常见寄存器的功能,讲述UART读写流程。
二、协议解析
2.1 常用字段解析
| 字段 | 说明 |
|---|---|
| Start bit | 固定 1 bit,低电平 |
| Data bits | 5 / 6 / 7 / 8 |
| Parity | None / Even / Odd |
| Stop bits | 1 / 1.5 / 2 |
| 错误 | 含义 |
|---|---|
| Parity Error | 校验位错误 |
| Framing Error | Stop bit 不正确 |
| Overrun Error | FIFO 满,数据被覆盖 |
| Break | RX 线长时间为 0 |
2.2 具体寄存器解析
| Offset | DLAB | 寄存器 | 全名 |
|---|---|---|---|
| 0x0 | 0 | RBR / THR | RX Buffer / TX Holding |
| 0x0 | 1 | DLL | Divisor Latch Low |
| 0x1 | 0 | IER | Interrupt Enable |
| 0x1 | 1 | DLM | Divisor Latch High |
| 0x2 | x | IIR ® / FCR (W) | Interrupt ID / FIFO Control |
| 0x3 | x | LCR | Line Control |
| 0x4 | x | MCR | Modem Control |
| 0x5 | x | LSR | Line Status |
| 0x6 | x | MSR | Modem Status |
| 0x7 | x | SCR | Scratch |
DLAB 是用来“切换寄存器含义”的一位开关,用于寄存器复用的场景。
位置:LCR[7]
名称:Divisor Latch Access Bit
作用:决定 offset 0x0 / 0x1 访问的是“数据寄存器”还是“波特率分频寄存器”
| 信号 | 用途 | 是否实时 |
|---|---|---|
| RTS / CTS | 数据流控 | ✅ 实时 |
| DTR / DSR | 状态指示 | ❌ 非实时 |
1. RBR / THR(0x0)
RBR – Receive Buffer Register(只读)
读一个字节
从 RX FIFO 取数据
THR – Transmit Holding Register(只写)
写一个字节
推入 TX FIFO
Note:读0x0则是从rx buffer中取数据,写则是写tx buffer。
📌 特点:
不直接访问 FIFO
FIFO 深度由硬件管理
2. DLL / DLM(0x0 / 0x1,DLAB=1)
用途:波特率设置
公式:
baud = input_clock / (16 × divisor)
divisor = (DLM << 8) | DLL
📌 示例:
input_clock = 1.8432 MHz
baud = 115200
divisor = 1
Note:
baud中16的含义是每隔 16 个 sample_clk 取 1 次
sample_clk: |.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|
start bit: 0 0 0 0 0 0 0 [0] 0 0 0 0 0 0 0 0
↑ 第 8 个 sample
data bit 0: x x x x x x x [D0] x x x x x x x x
↑ 再过 16
3. IER – Interrupt Enable Register(0x1)
| Bit | 名称 | 含义 |
|---|---|---|
| 0 | ERBFI | RX data available |
| 1 | ETBEI | TX holding empty |
| 2 | ELSI | Line status |
| 3 | EDSSI | Modem status |
4. IIR / FCR(0x2,重点混用)
IIR(读)
| Bit | 含义 |
|---|---|
| 0 | 0 = 有中断 |
| 3:1 | 中断类型 |
| 7:6 | FIFO 状态 |
FCR(写)
| Bit | 含义 |
|---|---|
| 0 | FIFO enable |
| 1 | RX FIFO reset |
| 2 | TX FIFO reset |
| 7:6 | RX trigger level |
📌 同 offset 不同方向
读 → IIR
写 → FCR
5. LCR – Line Control Register(0x3)
决定帧格式 & DLAB
| Bit | 含义 |
|---|---|
| 1:0 | Data bits |
| 2 | Stop bits |
| 3 | Parity enable |
| 4 | Even parity |
| 7 | DLAB |
📌 改波特率流程:
6. MCR – Modem Control Register(0x4)
| Bit | 含义 |
|---|---|
| 0 DTR | |
| 1 | RTS |
| 4 | Loopback |
📌 RTS 用于 硬件流控
📌 Loopback 用于自测
7. LSR – Line Status Register(0x5)⭐
调试最常用寄存器
| Bit | 含义 |
|---|---|
| 0 | Data Ready |
| 1 | Overrun Error |
| 2 | Parity Error |
| 3 | Framing Error |
| 5 | THR Empty |
| 6 | TX Empty |
📌 判断:
能不能写
有没有数据
有没有丢数据
8. MSR – Modem Status Register(0x6)
| Bit | 含义 |
|---|---|
| 0 | ΔCTS |
| 1 | ΔDSR |
| 4 | CTS |
| 5 | DSR |
| 7 | DCD |
📌 DSR / CTS 的实时状态在这里
9. SCR – Scratch Register(0x7)
无功能
驱动测试用
可当软件标记
三、读写流程
3.1 写流程

3.2 读流程

3.3 简化流程总结
1️⃣ 初始化 UART
- disable interrupt
- set DLAB
- set baud rate
- clear DLAB
- set frame format
- enable FIFO
- set RX trigger
- enable interrupt
2️⃣ 发送数据
while (!(LSR & THR_EMPTY));
write(THR, ch);
3️⃣ 接收数据
if (LSR & DATA_READY)
ch = read(RBR);




1万+

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



