UART控制器原理

发布时间:2026/5/27 15:13:42

UART控制器原理 一、串口通信协议1.1 定义串口通讯是一种串行传输方式即数据一位一位地按顺序进行发送和接收。在嵌入式系统中它通常由UART控制器硬件实现。由于接线少、协议简单它广泛用于嵌入式系统、传感器、单片机与外围设备之间的数据交换。串行 vs 并行方式特性串行通讯并行通讯传输方式一位接一位通过1 条数据线传输多位同时如 8 位通过多条数据线传输硬件成本低只需 2-3 根线TX、RX、GND高需要多根数据线 控制线传输速度单比特速率高可达几 Mbps 以上总体吞吐量可很高理论上多条线同时传吞吐量高但易受信号干扰和线间延迟影响传输距离长RS-232/RS-485 可到十几米甚至千米短通常不到 1 米易受串扰和时钟偏移限制抗干扰能力较强差分形式的 RS-422/485 更强较弱多条线同时翻转串扰明显典型应用单片机调试、GPS、蓝牙模块、工业总线老式打印机、并口存储器、芯片间短距高速总线如并口 LCD串口省线、抗干扰、适合远距离或简单连接。并口一次传多位短距离内吞吐量高但连线多、不宜长距离。1.2 波特率码元指传输线上的一个信号变化在串口里就是一个电平位宽波特率1秒内传输的码元个数单位Baud比特率1秒内传输的比特个数单位bps通用公式比特率 波特率 × 每个码元对应的二进制位数在普通串口UART中每个码元携带1个bit(高低电平的信息)因此波特率 比特率数值上相等常用波特率2400、4800、9600、115200两个设备的波特率需一致不然会造成数据丢失比特率的计算1.3 数据帧1.3.1 一帧完整的数据帧组成组成部分说明起始位以低电平开始表示一帧数据的开始数据位通常为8 位也可选 9 位实际传输的有效数据校验位可选奇校验/偶校验用于简单错误检测停止位以高电平结束常见为 1 位也可选 0.5、1.5、2 位1.3.2 数据位与校验位的关系配置为8 位数据位从低位开始传 启用校验 → 实际有效数据只有7 位1 位被校验位占用配置为9 位数据位→ 通常是为了使用校验位常用模式8N18 位数据 无校验 1 位停止位1.3.3 奇偶校验规则校验类型规则奇校验一帧数据中高电平个数为奇数偶校验一帧数据中高电平个数为偶数发送方根据要发送的数据计算出校验位奇或偶并附加在帧中发送接收方收到数据后用同样的规则重新计算校验位如果与接收到的校验位不一致则判定该帧数据传输过程中发生了错误。弊端校验位只能检测单比特错误不能纠正错误也不能检测偶数个比特错误。1.3.4 停止位配置停止位长度常见应用1 位最常用1.5 位较少见2 位低速设备或兼容性要求0.5 位特殊场景1.3.5 一帧完整时间计算示例以115200 波特率、8N1 格式为例项目位数时间起始位1 bit≈ 8.7 µs数据位8 bits≈ 69.4 µs校验位0 bit0停止位1 bit≈ 8.7 µs总计10 bits≈ 86.8 µs串口一帧数据由起始位低电平开始、数据位常用8位、可选校验位奇/偶校验占用数据位、停止位高电平结束常用1位组成。二、串口收发流程2.1 DR 寄存器在许多串口控制器如 STM32中TDR和RDR实际上是共用同一个地址的DR数据寄存器写 DR→ 数据进入TDR发送读 DR→ 数据来自RDR接收DR 是程序与串口控制器之间唯一的“数据接口”。DR 寄存器作为程序与串口硬件之间的缓冲避免了直接操作慢速移位寄存器导致的时序耦合让 CPU 能以字节/字为单位一次性读写数据而硬件独立完成逐位收发。2.2 发送流程步骤操作说明1将数据写入内存准备要发送的数据2程序将内存数据写入DR 寄存器DR 自动将数据送入 TDR3TDR 数据自动转入发送移位寄存器从低位开始硬件自动完成4移位寄存器将数据从TX 引脚逐位发出串行输出2.3 接收流程步骤操作说明1RX 引脚接收数据逐位进入接收移位寄存器2接收移位寄存器接收完整一帧硬件自动完成3数据自动转入RDR 寄存器硬件自动完成RDR 可通过 DR 读取4程序读取DR 寄存器从高位开始读实际读到的是 RDR 的数据5将数据存入内存使用程序处理收到的数据2.4 串口控制器常用状态标志标志含义典型用途TXE发送数据寄存器为空可以往DR写入下一个数据TC发送移位寄存器为空发送完成一帧数据已完全从TX引脚发出RXNE接收数据寄存器不为空已收到一个数据可以读取DRIDLE检测到空闲线路接收线上无数据超过一帧时间ORE接收溢出错误数据未及时读取新数据覆盖旧数据PE奇偶校验错误收到的校验位与本地计算不一致2.5 串口中断对应关系中断事件事件标志中断使能位发送数据寄存器为空TXETXEIE发送完成TCTCIE准备好读取接收数据RXNERXNEIE奇偶校验错误PEPEIE检测到空闲线路IDLEIDLEIE注意ORE通常和 RXNE 共用同一个中断使能位RXNEIE2.6 DMA 自搬运无需CPU干预方向触发条件搬运动作DMA发送TXE 1内存 → 发送寄存器DR/TDRDMA接收RXNE 1接收寄存器DR/RDR → 内存效果发送CPU只需配置好DMA后续数据自动搬运到串口发出接收串口收到的数据自动存入内存缓冲区优势大幅降低CPU占用率适合大批量数据传输串口控制器通过TXE、TC、RXNE等状态标志反映收发进度可配置对应中断使CPU及时处理还可开启DMA让数据在内存与寄存器之间自动搬运实现串口收发“零CPU干预”。三、硬件流控3.1 硬件流控含义一种通过物理信号线自动控制数据传输的机制用于协调两个设备之间的数据流动防止数据丢失或溢出。3.2 硬件流控 vs 软件流控对比项硬件流控 (RTS/CTS)软件流控 (XON/XOFF)实现方式物理信号线在数据流中插入特殊字节响应速度实时需要解析数据较慢占用数据带宽不占用特殊字节可能干扰二进制数据额外接线需要2根额外信号线无需额外接线3.3 RTSRequest to Send 流控制作用告诉对方能否发送数据给我RTS 状态电平含义有效低电平接收器准备好接收新数据对方可以发送无效高电平接收寄存器已满对方停止发送当前帧完成后停止3.4 CTS Clear to Send流控制作用判断对方是否允许我发送数据CTS 状态电平含义有效低电平可以发送下一帧数据无效高电平不能发送新数据关键规则发送下一帧前检查 nCTS如果发送过程中nCTS 变为无效 →当前帧继续发完但发完即停不发送下一帧3.5 整体电路分析nCTS表示低电平的时候信号有效nRTS 是本设备的“接收通知”告诉对方“我能收/不能收”nCTS 是本设备的“发送许可”告诉本设备“对方允许我发/禁止我发”信号线方向本设备连接对象本设备中的作用有效电平TX输出对方的 RX发送数据数据信号RX输入对方的 TX接收数据数据信号nRTS输出对方的 nCTS告诉对方我是否准备好接收低电平准备好nCTS输入对方的 nRTS判断对方是否允许我发送低电平允许发送四、地址映射4.1 基址 (Base Address)外设基址所属总线USART10x40011000APB2USART20x40004400APB1USART60x40011400APB24.2 寄存器映射 (Register Map)寄存器名称偏移作用USART_SR0x00状态寄存器判断是否收到数据、是否发送完成等USART_DR0x04数据寄存器实际收发数据的地方USART_BRR0x08波特率寄存器配置通信速率USART_CR10x0C控制寄存器1使能、配置数据位、中断等USART_CR20x10控制寄存器2停止位等USART_CR30x14控制寄存器3DMA等五、HAL 库接口5.1 UART 外设的标准结构体typedef struct { uint32_t BaudRate; /* 波特率 */ uint32_t WordLength; /* 数据宽度 */ uint32_t StopBits; /* 停止位宽度 */ uint32_t Parity; /* 校验位模式 */ uint32_t Mode; /* 是否启用接收或发送模式 */ uint32_t HwFlowCtl; /* 是否启用硬件流控 */ } UART_InitTypeDef;5.2 HAL_UART_Init 函数项目内容函数功能初始化 UART 控制器函数原型HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)函数参数huartUART 句柄包含要初始化的 UART 外设及其配置参数函数返回值是否初始化成功HAL_StatusTypeDef类型通常为HAL_OK或HAL_ERROR5.3 HAL_UART_Transmit 函数项目内容函数功能使用轮询方式发送数据函数原型HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)函数参数huartUART 句柄pData要发送数据的首地址Size要发送的字节数Timeout超时时间函数返回值数据发送是否成功HAL_StatusTypeDefHAL_OK/HAL_TIMEOUT/HAL_ERROR5.4 HAL_UART_Receive 函数项目内容函数功能使用轮询方式接收数据函数原型HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)函数参数huartUART 句柄pData要存放数据的首地址Size要接收的字节数Timeout超时时间函数返回值数据接收是否成功HAL_StatusTypeDefHAL_OK/HAL_TIMEOUT/HAL_ERROR5.5 HAL_UART_Transmit_IT 函数项目内容函数功能使用中断方式发送数据函数原型HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)函数参数huartUART 句柄pData要发送数据的首地址Size要发送的字节数函数返回值数据发送是否成功HAL_StatusTypeDefHAL_OK/HAL_ERROR/HAL_BUSY5.6 HAL_UART_Receive_IT 函数项目内容函数功能使用中断方式接收数据函数原型HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数参数huartUART 句柄pData要存放数据的首地址Size要接收的字节数函数返回值数据接收是否成功HAL_StatusTypeDefHAL_OK/HAL_ERROR/HAL_BUSY5.7 HAL_UART_Transmit_DMA 函数项目内容函数功能使用 DMA 方式发送数据函数原型HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)函数参数huartUART 句柄pData要发送数据的首地址Size要发送的字节数函数返回值数据发送是否成功HAL_StatusTypeDefHAL_OK/HAL_ERROR/HAL_BUSY5.8 HAL_UART_Receive_DMA 函数项目内容函数功能使用 DMA 方式接收数据函数原型HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数参数huartUART 句柄pData要存放数据的首地址Size要接收的字节数函数返回值数据接收是否成功HAL_StatusTypeDefHAL_OK/HAL_ERROR/HAL_BUSY六、电平标准6.1 不同电平标准的意义因素说明传输距离越长信号衰减和干扰越严重现场环境工厂、户外等强电磁干扰环境需要更强的信号抗干扰能力电压差越大抗干扰能力通常越强6.2 三种常见电平标准对比标准逻辑 0 电平逻辑 1 电平特点TTL0V ~ 0.8V2.4V ~ 5V短距离1m板级通信RS2323V ~ 15V-3V ~ -15V长距离约15m负逻辑RS485差分信号A-B -200mV差分信号A-B 200mV超长距离1200m差分抗干扰6.3 转换芯片与常用接口电平标准转换芯片TTL ↔ 标准常用接口TTL不需要转换排针、杜邦线RS232MAX232、SP3232、MAX3232DB99针、DB25RS485MAX485、SP3485、MAX13487接线端子A/B、RJ456.4 三种标准适用场景标准典型场景TTL单片机与单片机、单片机与蓝牙/WiFi模块、液晶屏RS232工控设备、老式 PC 串口、调试终端RS485工业现场、仪表总线、远距离多节点网络

相关新闻