在嵌入式系统开发中,UART(通用异步收发传输器)作为最基础的串行通信接口,其寄存器配置直接影响通信质量和系统性能。以TI OMAP35xx系列处理器为例,其UART模块集成了IrDA红外通信和CIR消费电子红外协议支持,形成了一套完整的串行通信解决方案。
OMAP35xx的UART模块包含三个独立实例,每个实例具有1KB的地址空间:
| 模块名称 | 基地址 | 功能支持 |
|---|---|---|
| UART1 | 0x4806A000 | 标准UART功能 |
| UART2 | 0x4806C000 | 标准UART功能 |
| UART3 | 0x49020000 | UART/IrDA/CIR全功能 |
寄存器访问采用内存映射方式,各功能寄存器通过基地址+偏移量的形式定位。例如UART1的DLL_REG(分频器低字节寄存器)物理地址为:
code复制0x4806A000 (基地址) + 0x000 (偏移量) = 0x4806A000
UART模块通过LCR_REG[7]和LCR_REG[7:0]的值组合实现三种工作模式的切换:
配置模式A:LCR_REG[7]=1且LCR_REG[7:0]!=0xBF
配置模式B:LCR_REG[7:0]=0xBF
操作模式:LCR_REG[7]=0
关键提示:模式切换时需要确保当前没有正在进行的数据传输,否则可能导致通信异常。建议在切换前检查LSR_REG[5](THR空标志)和LSR_REG[0](数据就绪标志)。
波特率生成依赖DLL_REG(分频器低字节)和DLH_REG(分频器高字节)组成的14位分频器:
c复制// 波特率计算公式
实际波特率 = 模块时钟频率 / (16 × 分频值)
分频值 = (DLH_REG[5:0] << 8) | DLL_REG[7:0]
典型配置流程:
避坑指南:OMAP35xx要求必须在睡眠模式禁用(IER_REG[4]=0)时才能修改分频寄存器,否则写入无效。
FCR_REG控制着64字节收发FIFO的启用和触发阈值:
| 位域 | 名称 | 功能说明 |
|---|---|---|
| 0 | FIFO_EN | 1=启用64字节FIFO,0=使用单字节缓冲 |
| 1 | RX_FIFO_CLEAR | 写1清除接收FIFO |
| 2 | TX_FIFO_CLEAR | 写1清除发送FIFO |
| 3 | DMA_MODE | 1=启用DMA模式 |
| 7:6 | RX_FIFO_TRIG | 接收FIFO触发阈值(8/16/56/60字节) |
增强模式下(EFR_REG[4]=1)还可通过FCR_REG[5:4]配置发送FIFO触发阈值。
IER_REG实现中断源的多级控制,不同工作模式下位定义不同:
UART模式关键中断:
IrDA模式特有中断:
调试技巧:建议初始配置时先关闭所有中断(IER_REG=0),待基础通信测试通过后再逐步启用必要中断。
通过EFR_REG和MCR_REG配合实现自动RTS/CTS流控:
c复制// 硬件流控初始化示例
LCR_REG = 0xBF; // 进入配置模式B
EFR_REG |= 0xC0; // 启用自动RTS/CTS
TCR_REG = 0x32; // 设置RTS激活阈值50字节,恢复阈值30字节
LCR_REG = 0x3; // 返回操作模式,8N1配置
UART3支持IrDA SIR协议(最高115200bps):
c复制// IrDA模式初始化
MDR1_REG = 0x02; // 选择IrDA模式
CFPS_REG = 0x1E; // 设置3/16脉冲宽度(标准SIR)
IER_REG |= 0x80; // 启用EOF中断
现象:通信双方能建立连接但数据错乱
c复制预期分频值 = 模块时钟 / (16 × 目标波特率)
现象:高波特率时部分数据丢失
排查步骤:
DMA模式配置:
c复制FCR_REG |= 0x08; // 启用DMA模式
SCR_REG &= ~0x01; // 选择DMA模式1
低功耗优化:
c复制IER_REG |= 0x10; // 启用睡眠模式
SYSC_REG |= 0x01; // 启用智能空闲模式
中断合并:
c复制// 设置接收超时为4字符时间
TLR_REG = (TLR_REG & 0xF0) | 0x04;
对于需要稳定长距离通信的工业场景,建议:
在智能家居CIR应用中,需特别注意: