一、引言
串口通信(USART)是STM32微控制器中最常用的通信接口之一,广泛应用于设备调试、数据传输等场景。本章将讲解STM32F103的串口功能框图,帮助新手小白理解其工作原理和配置方法。通过学习,更好地掌握串口的基本构成、数据流和控制机制。
二、串口功能框图概述
STM32的串口功能框图主要包括四个核心部分:
-
引脚:物理接口,负责信号传输
-
数据寄存器:存储发送和接收的数据
-
控制器:管理串口的工作状态和流程
-
波特率发生器:控制通信速率
这些部分协同工作,实现全双工或半双工的串行通信。
三、引脚功能详解
STM32F103系列芯片提供了多个USART接口,每个接口对应特定的引脚。以下是引脚分配表:
| 引脚功能 | USART1 (APB2) | USART2 (APB1) | USART3 (APB1) | UART4 (APB1) | UART5 (APB1) |
|---|---|---|---|---|---|
| TX | PA9 | PA2 | PB10 | PC10 | PC12 |
| RX | PA10 | PA3 | PB11 | PC11 | PD2 |
| SCLK | PA8 | PA4 | PB12 | - | - |
| nCTS | PA11 | PA0 | PB13 | - | - |
| nRTS | PA12 | PA1 | PB14 | - | - |
引脚功能说明:
-
TX:数据发送引脚,输出串行数据
-
RX:数据接收引脚,输入串行数据
-
SCLK:时钟引脚,仅在同步通信模式下使用
-
nRTS:请求发送(Request To Send),流控制信号
-
nCTS:清除发送(Clear To Send),流控制信号
注意:USART1挂载在APB2总线上(最高72MHz),其他USART挂载在APB1总线上(最高36MHz),这会影响波特率设置。
四、数据寄存器(USART_DR)
数据寄存器是串口通信的核心,用于暂存传输数据:
-
结构:9位有效,实际包含两个物理寄存器:
-
TDR:发送数据寄存器
-
RDR:接收数据寄存器
-
-
地址映射:虽然逻辑上是一个地址(USART_DR),但读写操作会访问不同的物理寄存器:
-
写入操作:数据存入TDR
-
读取操作:数据来自RDR
-
工作原理:
-
发送时,CPU将数据写入USART_DR,硬件自动将数据从TDR加载到发送移位寄存器
-
接收时,数据从接收移位寄存器转移到RDR,CPU读取USART_DR获取数据
五、控制器详解
控制器通过一系列寄存器管理串口的工作状态,主要寄存器包括:
5.1 控制寄存器1(USART_CR1)
-
M位:数据位长度选择
-
0:8位数据字长
-
1:9位数据字长
-
-
PCE位:校验控制使能
-
PS位:校验选择(偶校验/奇校验)
-
TE位:发送使能
-
RE位:接收使能
-
UE位:USART使能
-
TXEIE位:发送缓冲区空中断使能
-
TCIE位:发送完成中断使能
-
RXNEIE位:接收缓冲区非空中断使能
5.2 控制寄存器2(USART_CR2)
-
STOP位:停止位长度配置(1位、1.5位、2位)
-
同步模式相关控制位
5.3 状态寄存器(USART_SR)
-
TXE位:发送数据寄存器空标志
- 1表示TDR为空,可以写入新数据
-
TC位:发送完成标志
- 1表示所有数据已发送完毕(包括停止位)
-
RXNE位:接收数据寄存器非空标志
- 1表示RDR中有新数据可读取
-
PE位:校验错误标志
六、数据流详细流程
6.1 数据发送流程
-
使能串口:设置USART_CR1的UE=1、TE=1
-
检查TXE标志:等待USART_SR的TXE=1(表示TDR就绪)
-
写入数据:将数据写入USART_DR,硬件自动清除TXE标志
-
数据移位:硬件将数据从TDR转移到发送移位寄存器
-
串行发送:数据通过TX引脚逐位发送
-
发送完成:检测TC标志(USART_SR.TC=1)确认发送完毕
6.2 数据接收流程
-
使能串口:设置USART_CR1的UE=1、RE=1
-
检测起始位:硬件自动检测RX引脚上的起始位
-
数据采样:按波特率采样RX引脚,将数据存入接收移位寄存器
-
数据转移:完整帧接收后,数据转移到RDR
-
设置RXNE标志:USART_SR.RXNE=1,表示数据就绪
-
读取数据:CPU读取USART_DR,硬件自动清除RXNE标志
七、波特率配置原理
波特率是串口通信的核心参数,表示每秒钟传输的符号数。
7.1 波特率计算公式
标准模式:
波特率 = f_CK / (16 × USARTDIV)
OVER8=1模式(8倍过采样):
波特率 = f_CK / (8 × USARTDIV)
其中:
-
fCK:串口时钟频率(注意APB1和APB2的区别)
-
USARTDIV:无符号定点数,存储在波特率寄存器USART_BRR中
7.2 波特率寄存器(USART_BRR)结构
USART_BRR是32位寄存器,分为两部分:
-
DIV_Mantissa:整数部分(位15:4)
-
DIV_Fraction:小数部分(位3:0)
计算示例(USART1,72MHz时钟,115200波特率):
115200 = 72000000 / (16 × USARTDIV) => USARTDIV = 39.0625
-
整数部分:DIV_Mantissa = 39 = 0x27
-
小数部分:DIV_Fraction = 0.0625 × 16 = 1 = 0x01
-
USART_BRR值 = 0x271
7.3 实际配置步骤
-
确定串口时钟频率(查看RCC配置)
-
计算所需的USARTDIV值
-
将整数和小数部分组合写入USART_BRR
-
使能串口验证通信
八、错误处理机制
串口通信中常见的错误类型及检测方法:
-
校验错误:通过PE标志检测
-
帧错误:停止位检测失败
-
噪声错误:采样过程中出现干扰
-
溢出错误:新数据覆盖未读取的旧数据
这些错误标志位在USART_SR寄存器中,需要软件定期检查和处理。
九、实际应用建议
-
初始化顺序:
-
使能GPIO时钟和USART时钟
-
配置GPIO为复用功能
-
配置USART_BRR设置波特率
-
配置USART_CR1、CR2、CR3
-
使能USART(UE=1)
-
-
中断使用:
-
对于高效通信,建议使用中断方式
-
使能相应中断标志(TXEIE、RXNEIE等)
-
在中断服务程序中处理数据
-
-
流控制应用:
-
在高速通信或缓冲区有限时,使用nRTS/nCTS硬件流控制
-
防止数据丢失或溢出
-
参考资料:《零死角玩转STM32》"USART串口通信"章节、STM32F10x数据手册