一、UART协议核心要点
1. 基本特性
- 异步串行通信:无时钟信号,依赖双方预定义的波特率
- 全双工:TX(发送)和RX(接收)独立通道
- 数据帧结构:
1
| 起始位 | 数据位(5-9位) | 校验位(可选) | 停止位(1/1.5/2位) |
- 起始位:1位低电平
- 数据位:通常8位(LSB先发)
- 校验位:奇偶校验(可选)
- 停止位:高电平,标志帧结束
2. 关键参数
- 波特率:需双方一致(如115200 bps)
- 数据格式:数据位长度、停止位数量、校验类型
二、STM32F103 UART模块关键点
1. 模块类型
- USART:支持同步/异步模式(UART是子集)
- UART:仅异步模式(STM32F103的USART可配置为UART模式)
2. 核心寄存器
以下是需要配置的主要寄存器(以USART1为例):
寄存器 | 功能描述 | 关键配置位 |
---|---|---|
USART_CR1 | 控制寄存器1 | UE (使能模块)、M (数据位长度)、PCE (校验使能)、TE /RE (发送/接收使能) |
USART_CR2 | 控制寄存器2 | STOP (停止位长度) |
USART_CR3 | 控制寄存器3 | DMAT /DMAR (DMA使能) |
USART_BRR | 波特率寄存器 | 写入波特率分频值 |
USART_SR | 状态寄存器 | TXE (发送寄存器空)、RXNE (接收寄存器非空)、错误标志(如FE , ORE ) |
USART_DR | 数据寄存器 | 读写发送/接收的数据 |
三、配置步骤(以115200bps, 8N1为例)
1. 使能时钟
1 | RCC_APB2ENR |= (1 << 14); // 使能USART1时钟(APB2总线) |
2. 配置GPIO
1 | // PA9为复用推挽输出(TX) |
3. 配置波特率(BRR寄存器)
- 公式(16倍过采样来过滤毛刺):
$$
\text{BRR} = \frac{f_{\text{PCLK}}}{16 \times \text{BaudRate}}
$$
假设APB2时钟为72MHz:
$$
\text{BRR} = 72000000 / (16 * 115200) = 39.0625
$$
写入BRR
:整数部分39(0x27),小数部分0.0625×16=1 →BRR = 0x271
4. 配置数据格式(CR1/CR2)
1 | USART1_CR1 = 0; |
5. 使能发送/接收
1 | USART1_CR1 |= (1 << 3); // TE = 1(使能发送) |
四、数据收发操作
1. 发送数据
1 | while (!(USART1_SR & (1 << 7))); // 等待TXE标志置1 |
2. 接收数据
1 | if (USART1_SR & (1 << 5)) { // 检查RXNE标志 |
五、验证关注点
- 波特率误差:计算BRR时的分频值是否精确。
- 帧错误:检查
USART_SR
中的FE
位。 - 溢出错误:检查
ORE
位(接收溢出)。 - 中断/DMA:若使用中断,需配置NVIC和
USART_CR1
中的RXNEIE
/TXEIE
。
六、常见问题
- 时钟未使能:配置寄存器前需通过RCC使能USART和GPIO时钟。
- 波特率不匹配:确认APB时钟频率和BRR计算。
- GPIO模式错误:TX需配置为复用推挽输出,RX为浮空输入。
如果需要更深入的代码示例或特定场景验证方法,可以进一步讨论!
本文作者:
ICXNM-ZLin
本文链接: https://talent-tudou.github.io/2025/02/26/外设/uart模块/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
本文链接: https://talent-tudou.github.io/2025/02/26/外设/uart模块/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!