在 STM32 微控制器中,UART(通用异步收发传输器)通信通过多个寄存器实现配置和数据传输。下面详细解析 UART 的核心寄存器及其功能。
1. 状态寄存器(USART_SR)
状态寄存器反映 UART 当前的工作状态,用于判断数据传输是否完成、是否接收到数据等。
主要位功能
位 | 名称 | 功能 |
---|---|---|
7 | TXE | 发送缓冲区为空(1 = 空,可写入新数据)。写入 DR 寄存器后自动清零。 |
6 | TC | 发送完成(1 = 传输结束)。需软件清零(写 1 清除)。 |
5 | RXNE | 接收缓冲区非空(1 = 接收到数据)。读取 DR 寄存器后自动清零。 |
3 | IDLE | 检测到总线空闲(1 = 空闲)。需先读 SR,再读 DR 清零。 |
2 | ORE | 溢出错误(1 = 数据丢失)。需读 SR,再读 DR 清零。 |
0 | PE | 奇偶校验错误(1 = 校验失败)。需软件清零。 |
应用场景
- 发送数据 :检查
TXE
或TC
标志,确保缓冲区为空或传输完成。 - 接收数据 :检查
RXNE
标志,确认有新数据可读。 - 错误处理 :检查
ORE
、PE
等标志,处理通信异常。
2. 数据寄存器(USART_DR)
数据寄存器用于存储发送和接收的数据,实际由两个独立的寄存器组成:
- 发送缓冲区寄存器(TDR) :写入
DR
时,数据被存入 TDR,随后传输到移位寄存器。 - 接收缓冲区寄存器(RDR) :接收到的数据先存入移位寄存器,再转移到 RDR,读取
DR
时获取 RDR 内容。
注意事项
- 数据位宽由
CR1
的M
位决定(8 位或 9 位)。 - 写入
DR
会清除TXE
标志,读取DR
会清除RXNE
标志。
3. 波特率寄存器(USART_BRR)
波特率寄存器用于配置 UART 的通信速率,计算公式如下:
波特率 = fPCLK / (16 * USARTDIV)
其中:
fPCLK
:UART 时钟频率(APB 总线时钟)。USARTDIV
:分频系数,由BRR
寄存器的整数部分([15:4])和小数部分([3:0])组成。
示例
假设fPCLK = 84MHz
,波特率为 115200:
USARTDIV = 84000000 / (16 * 115200) ≈ 45.5729
整数部分 = 45 (0x2D)
小数部分 = 0.5729 * 16 ≈ 9 (0x9)
BRR = 0x2D9
4. 控制寄存器 1(USART_CR1)
控制寄存器 1 用于配置 UART 的基本功能,如使能、字长、奇偶校验等。
主要位功能
位 | 名称 | 功能 |
---|---|---|
13 | UE | UART 使能(1 = 使能)。 |
12 | M | 字长(0=8 位 + 校验,1=9 位 + 校验)。 |
10 | PCE | 奇偶校验使能(1 = 使能)。 |
9 | PS | 奇偶校验类型(0 = 偶校验,1 = 奇校验)。 |
7 | TXEIE | 发送缓冲区空中断使能(1 = 使能)。 |
6 | TCIE | 发送完成中断使能(1 = 使能)。 |
5 | RXNEIE | 接收缓冲区非空中断使能(1 = 使能)。 |
4 | IDLEIE | 空闲线路检测中断使能(1 = 使能)。 |
3 | TE | 发送使能(1 = 使能)。 |
2 | RE | 接收使能(1 = 使能)。 |
0 | OVER8 | 过采样模式(0=16 倍,1=8 倍)。 |
5. 控制寄存器 2(USART_CR2)
控制寄存器 2 主要用于配置停止位、LIN 模式等。
主要位功能
位 | 名称 | 功能 |
---|---|---|
13:12 | STOP | 停止位设置: 00=1 位,01=0.5 位,10=2 位,11=1.5 位。 |
6 | LINEN | LIN 模式使能(1 = 使能)。 |
0 | CLKEN | SCLK 引脚使能(用于同步模式)。 |
6. 控制寄存器 3(USART_CR3)
控制寄存器 3 用于配置高级功能,如硬件流控制、DMA 等。
主要位功能
位 | 名称 | 功能 |
---|---|---|
14 | ONEBIT | 采样方法(0=3 采样位,1=1 采样位)。 |
11 | CTSE | CTS 硬件流控制使能(1 = 使能)。 |
10 | RTSE | RTS 硬件流控制使能(1 = 使能)。 |
7 | DMAT | 发送 DMA 使能(1 = 使能)。 |
6 | DMAR | 接收 DMA 使能(1 = 使能)。 |
7. 中断和状态寄存器(USART_ISR)
在 STM32F4 及更高系列中,ISR
替代了SR
寄存器,功能类似但增加了更多状态位,如忙标志(BUSY
)。
寄存器操作示例
1. 初始化 UART(115200 波特率,8N1)
// 假设fPCLK=84MHz
USART1->BRR = 0x2D9; // 设置波特率为115200
USART1->CR1 = USART_CR1_TE | // 使能发送
USART_CR1_RE | // 使能接收
USART_CR1_UE; // 使能UART
USART1->CR2 = 0; // 1个停止位
USART1->CR3 = 0; // 禁用硬件流控制
2. 发送单个字符
while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空
USART1->DR = 'A'; // 发送字符'A'
3. 接收单个字符
while (!(USART1->SR & USART_SR_RXNE)); // 等待接收缓冲区非空
char c = USART1->DR; // 读取接收到的字符
4. 启用接收中断
USART1->CR1 |= USART_CR1_RXNEIE; // 使能接收缓冲区非空中断
NVIC_EnableIRQ(USART1_IRQn); // 使能USART1中断
总结
UART 寄存器的核心操作包括:
- 初始化 :配置波特率(
BRR
)、字长(CR1.M
)、停止位(CR2.STOP
)、校验位(CR1.PCE
)。 - 发送控制 :通过
SR.TXE
或SR.TC
判断发送状态,写入DR
发送数据。 - 接收控制 :通过
SR.RXNE
判断接收状态,读取DR
获取数据。 - 中断配置 :通过
CR1
使能各类中断(如RXNEIE
、TXEIE
),并配置 NVIC。