DW_apb_uart 16650 寄存器详解

一、概述

DW_apb_uart是Synopsys公司设计的一款可编程通用异步收发器(UART),作为符合AMBA 2.0标准的高级外围总线(APB)从设备。该组件按照工业标准16550进行建模,寄存器地址空间被重新定位到32位数据边界以适应APB总线。

该UART IP具备以下主要特性:

  • 支持异步时钟(可选独立的串行数据时钟)

  • 可选的发送/接收FIFO缓冲

  • 自动流量控制(兼容16750标准)

  • DMA控制器接口

  • 可编程THRE(发送保持寄存器空)中断模式

  • 串口红外(IrDA)支持

  • 多种优先中断类型,可单独使能/禁用

二、寄存器地址映射

DW_apb_uart的寄存器地址空间基于传统16550标准,但由于APB总线采用32位数据边界,每个寄存器偏移量为4字节。下表列出了所有寄存器的地址偏移及访问属性。

重要说明:DLAB(Divisor Latch Access Bit)是线控寄存器(LCR)的最高位(bit 7)。当DLAB = 1时,偏移0x00、0x01处的寄存器被映射为波特率除数锁存器(DLL/DLM);当DLAB = 0时,则映射为发送/接收缓冲区和中断使能寄存器。

偏移地址 DLAB=0 DLAB=1 读/写 寄存器名称 功能描述
0x00 RBR DLL R/W 接收缓冲寄存器/除数锁存低字节 RBR:接收数据缓冲区;DLL:波特率除数低8位
0x00 THR DLL R/W 发送保持寄存器/除数锁存低字节 THR:待发送数据写入;DLL:同上
0x04 IER DLM R/W 中断使能寄存器/除数锁存高字节 IER:中断类型使能;DLM:波特率除数高8位
0x08 IIR - R 中断标识寄存器 标识当前待处理的中断类型及优先级
0x08 FCR - W FIFO控制寄存器 FIFO使能、清空及触发阈值配置
0x0C LCR LCR R/W 线控寄存器 数据格式配置(数据位、停止位、校验位等)
0x10 MCR MCR R/W 调制解调器控制寄存器 流控信号控制(RTS、DTR等)
0x14 LSR LSR R 线状态寄存器 线路状态标志(数据就绪、溢出、错误等)
0x18 MSR MSR R 调制解调器状态寄存器 调制解调器输入信号状态(CTS、DSR等)
0x1C SCR SCR R/W 暂存寄存器 用户自定义临时存储

三、寄存器详细说明

3.1 接收缓冲寄存器(RBR)------ 偏移 0x00,DLAB=0,只读

RBR保存从串行端口接收到的数据字节。当接收到完整的数据字节并经过校验后,数据被存入RBR,同时线状态寄存器(LSR)的DR位(bit 0)被置1。CPU读取RBR后,DR位自动清零。

  • 位 [7:0]:接收数据字节

  • 有效数据位宽度受LCR[1:0]设置的影响

3.2 发送保持寄存器(THR)------ 偏移 0x00,DLAB=0,只写

THR用于存放待发送的数据字节。CPU将数据写入THR后,数据被移入发送移位寄存器并逐位发送出去。线状态寄存器(LSR)的THRE位(bit 5)指示THR是否为空。

  • 位 [7:0]:待发送数据字节

  • 数据位宽度受LCR[1:0]设置的影响

3.3 中断使能寄存器(IER)------ 偏移 0x04,DLAB=0,读/写

IER控制各类中断的使能/禁用。IER各位定义如下:

名称 功能描述
0 ERBFI 接收数据有效中断使能:1 = 使能RBR有数据时的中断
1 ETBEI 发送保持寄存器空中断使能:1 = 使能THRE中断
2 ELSI 接收线状态中断使能:1 = 使能线路状态错误(奇偶校验、帧错误等)中断
3 EDSSI 调制解调器状态中断使能:1 = 使能调制解调器输入信号变化中断
7:4 - 保留,写入0

注意:在UART初始化阶段,通常先向IER写入0以禁用所有中断,避免初始化过程中产生意外中断干扰。

3.4 中断标识寄存器(IIR)------ 偏移 0x08,只读

IIR用于标识当前待处理的中断类型及其优先级。IIR也指示FIFO是否使能。中断按优先级由高到低排列:

优先级 IIR[3:1] 中断类型 中断源 清除方式
最高 011 接收线状态 奇偶校验错误、帧错误、溢出错误等 读LSR
010 接收数据可用 RBR有数据(非FIFO模式)或达到接收FIFO触发阈值 读RBR直至低于阈值
110 字符超时 接收FIFO非空且一段时间无新数据(仅FIFO模式) 读RBR
001 THRE 发送保持寄存器空 写THR或读IIR
最低 000 调制解调器状态 CTS、DSR等输入信号变化 读MSR

IIR位定义

  • 位0:中断挂起标志。0 = 有中断待处理;1 = 无中断待处理

  • 位[3:1]:中断类型编码(如上表)

  • 位[7:4]:FIFO使能标志(仅16550/16650模式),位7:6 = 11表示FIFO已使能

3.5 FIFO控制寄存器(FCR)------ 偏移 0x08,只写

FCR用于配置UART的FIFO操作模式。FCR只在16550/16650兼容模式下可用。

名称 功能描述
0 FIFO_EN FIFO使能。1 = 使能发送和接收FIFO
1 RCVR_FIFO_CLR 清空接收FIFO。写1清空接收FIFO计数器,该位自动清零
2 XMIT_FIFO_CLR 清空发送FIFO。写1清空发送FIFO计数器,该位自动清零
3 DMA_MODE DMA模式选择。0 = 单次DMA模式;1 = 多路DMA模式
5:4 - 保留
7:6 RX_TRIGGER 接收FIFO触发阈值。00 = 1字节;01 = 4字节;10 = 8字节;11 = 14字节

FCR常用配置值说明:

  • 0x01:仅使能FIFO,不清空

  • 0x07:使能FIFO并清空接收和发送FIFO

  • 0xC7:使能FIFO、清空FIFO并设置接收触发阈值为14字节

3.6 线控寄存器(LCR)------ 偏移 0x0C,读/写

LCR配置串行数据格式,包括数据位宽、停止位数、奇偶校验等。LCR最高位(bit 7)是除数锁存访问位(DLAB)。

名称 功能描述
1:0 WLS 字长选择。00 = 5位;01 = 6位;10 = 7位;11 = 8位
2 STB 停止位数。0 = 1个停止位;1 = 1.5个停止位(5位数据)或2个停止位(6/7/8位数据)
3 PEN 奇偶校验使能。1 = 使能校验位发送和检测
4 EPS 偶校验选择。0 = 奇校验;1 = 偶校验(仅当PEN=1时有效)
5 SP 粘附奇偶校验。强制校验位恒为0或1(仅当PEN=1时有效)
6 BC 中断控制。1 = 强制串行输出持续为逻辑0(发送break条件)
7 DLAB 除数锁存访问位。0 = 访问RBR/THR/IER;1 = 访问DLL/DLM

3.7 调制解调器控制寄存器(MCR)------ 偏移 0x10,读/写

MCR控制调制解调器接口的输出信号及UART辅助功能。

名称 功能描述
0 DTR 数据终端就绪。控制DTR_n输出引脚
1 RTS 请求发送。控制RTS_n输出引脚
2 OUT1 用户自定义输出1
3 OUT2 用户自定义输出2。通常用于中断输出使能
4 LOOP 回环模式。1 = 使能内部回环诊断模式
7:5 - 保留

3.8 线状态寄存器(LSR)------ 偏移 0x14,只读

LSR提供发送和接收数据路径的状态信息。

名称 功能描述
0 DR 接收数据就绪。1 = RBR中有可读数据
1 OE 溢出错误。1 = 发生接收数据溢出(数据丢失)
2 PE 奇偶校验错误。1 = 接收数据有奇偶校验错误
3 FE 帧错误。1 = 接收数据有帧错误(停止位不正确)
4 BI 中断间隔。1 = 接收到break信号
5 THRE 发送保持寄存器空。1 = THR为空,可写入新数据
6 TEMT 发送移位寄存器空。1 = THR和发送移位寄存器均为空
7 FIFO_ERROR 接收FIFO中有错误数据(FIFO模式下有效)

注意:当OE、PE、FE或BI中任一位置1时,LSR位0(DR)也会被置1,且会触发线状态中断(若使能)。读取LSR后,OE、PE、FE、BI位自动清零。

3.9 调制解调器状态寄存器(MSR)------ 偏移 0x18,只读

MSR提供调制解调器接口的输入信号状态及变化标志。

名称 功能描述
0 ΔCTS CTS输入变化标志。读MSR后自动清零
1 ΔDSR DSR输入变化标志。读MSR后自动清零
2 ΔRI RI输入变化标志(下降沿)。读MSR后自动清零
3 ΔDCD DCD输入变化标志。读MSR后自动清零
4 CTS 清除发送输入状态
5 DSR 数据设备就绪输入状态
6 RI 振铃指示输入状态
7 DCD 载波检测输入状态

3.10 暂存寄存器(SCR)------ 偏移 0x1C,读/写

SCR是一个8位寄存器,无特殊功能,可供软件作为临时存储使用。

3.11 除数锁存寄存器(DLL/DLM)------ 偏移 0x00/0x04,DLAB=1,读/写

DLL和DLM构成16位波特率除数。波特率计算公式为:

text

复制代码
波特率 = UART输入时钟频率 / (16 × Divisor)
Divisor = 时钟频率 / (波特率 × 16)
  • DLL(偏移0x00):除数低8位

  • DLM(偏移0x04):除数高8位

典型配置:时钟1843200 Hz、目标波特率115200时,除数 = 1843200 / (115200 × 16) = 1。

四、DW_apb_uart扩展寄存器(非标准16550)

DW_apb_uart在标准16550寄存器集基础上增加了一些扩展寄存器,用于增强功能和状态报告。

4.1 UART状态寄存器(USR)

USR是DW_apb_uart特有的状态寄存器,用于查询UART的忙闲状态。该寄存器在标准16550中不存在,是DW_apb_uart的扩展功能。

名称 功能描述
0 BUSY UART忙状态。1 = UART正忙于数据传输;0 = UART空闲
1 TFNF 发送FIFO非满。1 = 发送FIFO未满,可继续写入
2 TFE 发送FIFO空。1 = 发送FIFO为空
3 RFNE 接收FIFO非空。1 = 接收FIFO中有数据
4 RFF 接收FIFO满。1 = 接收FIFO已满
7:5 - 保留

使用注意事项:USR寄存器在配置LCR(线控寄存器)时非常重要。若在UART忙状态时修改LCR的DLAB位,可能导致LCR写操作被忽略,引发不稳定状态。

4.2 其他扩展寄存器(可选)

DW_apb_uart还支持以下可选扩展寄存器(取决于IP配置时是否使能):

  • EFR(扩展功能寄存器) :支持自动流控制等扩展功能配置

  • TCR/TLR(发送控制/触发级别寄存器) :更精细的FIFO触发阈值控制

  • SRBR/STR(影射接收/发送寄存器) :支持16C660扩展模式

五、典型编程流程

5.1 初始化流程

以下为UART初始化的典型步骤:

复制代码
void uart_init(void) {
    unsigned int divisor = uart_clock / (baud_rate * 16);
    
    // 1. 禁用所有中断
    writeb(0, UART_IER);
    
    // 2. 设置DLAB=1,配置波特率除数
    writeb(0x80, UART_LCR);           // 设置DLAB=1
    writeb(divisor & 0xFF, UART_DLL); // 除数低字节
    writeb((divisor >> 8) & 0xFF, UART_DLM); // 除数高字节
    
    // 3. 配置串行数据格式(8位数据、1停止位、无校验)
    writeb(0x03, UART_LCR);           // DLAB=0, WLS=8位
    
    // 4. 配置FIFO(使能FIFO,清空FIFO,设置触发阈值)
    writeb(0xC7, UART_FCR);           // FIFO使能+清空+14字节阈值
    
    // 5. 按需使能中断
    // writeb(IER_ERBFI | IER_ELSI, UART_IER);
}

5.2 数据发送

复制代码
void uart_putc(char ch) {
    // 等待THRE为1(发送保持寄存器为空)
    while (!(readb(UART_LSR) & LSR_THRE));
    writeb(ch, UART_THR);
}

5.3 数据接收

复制代码
char uart_getc(void) {
    // 等待DR为1(接收数据就绪)
    while (!(readb(UART_LSR) & LSR_DR));
    return readb(UART_RBR);
}

六、关键注意事项

  1. 寄存器偏移对齐:DW_apb_uart基于APB总线,寄存器地址偏移为4字节,而非传统PC串口的1字节偏移。驱动开发时需注意这个差异。

  2. FIFO操作时序:修改LCR的DLAB位时,建议先通过USR寄存器确认UART不忙,避免写操作被忽略。

  3. THRE中断模式增强:在FIFO使能且启用THRE模式时,THRE中断可在编程的TX FIFO阈值水平及以下处于激活状态,提高系统性能。

  4. 自动流控制:DW_apb_uart支持与16750兼容的自动流控制模式。使能该功能时,RTS_n和CTS_n信号由硬件自动管理,可显著降低软件负载。

  5. DMA支持:UART可通过dma_tx_req_n和dma_rx_req_n信号与DMA控制器接口,支持单次和突发DMA传输两种模式。

相关推荐
Wave8452 小时前
STM32低功耗模式
stm32·单片机·嵌入式硬件
Linux猿2 小时前
基于单片机的智能路灯控制系统设计 | 附源码
单片机·嵌入式硬件·课程设计·项目·系统设计·基于单片机的智能路灯控制系统
kaikaile19952 小时前
STM32 USB批量传输CDC类实现指南
stm32·单片机·嵌入式硬件
mftang3 小时前
nRF52805 时钟配置功能详细介绍
单片机·嵌入式硬件
Heartache boy3 小时前
野火STM32_HAL库版课程笔记-TB6612FNG驱动有刷电机
笔记·stm32·单片机
恒森宇电子有限公司3 小时前
矽塔SA8550 双通道全桥 H 桥电机驱动芯片 中小功率有刷直流电机
单片机·嵌入式硬件
漠落3 小时前
GD32替换STM32导致ADC卡顿问题解析
stm32·单片机·gd32
yuan199973 小时前
基于STM32标准库3.5的小车超声波避障程序
stm32·单片机·嵌入式硬件
深圳市雅欣控制技术有限公司3 小时前
室内 KTV 灯控方案:STM32 主控与电源芯片(FP6195 + FP7208)应用方案
stm32·单片机·嵌入式硬件·智能照明·灯光控制·单节锂电池·ktv氛围灯