STM32F103 学习笔记-21-串口通信(第2节)-STM32串口功能框图讲解

一、引言

串口通信(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 数据发送流程

  1. 使能串口:设置USART_CR1的UE=1、TE=1

  2. 检查TXE标志:等待USART_SR的TXE=1(表示TDR就绪)

  3. 写入数据:将数据写入USART_DR,硬件自动清除TXE标志

  4. 数据移位:硬件将数据从TDR转移到发送移位寄存器

  5. 串行发送:数据通过TX引脚逐位发送

  6. 发送完成:检测TC标志(USART_SR.TC=1)确认发送完毕

6.2 数据接收流程

  1. 使能串口:设置USART_CR1的UE=1、RE=1

  2. 检测起始位:硬件自动检测RX引脚上的起始位

  3. 数据采样:按波特率采样RX引脚,将数据存入接收移位寄存器

  4. 数据转移:完整帧接收后,数据转移到RDR

  5. 设置RXNE标志:USART_SR.RXNE=1,表示数据就绪

  6. 读取数据: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 实际配置步骤

  1. 确定串口时钟频率(查看RCC配置)

  2. 计算所需的USARTDIV值

  3. 将整数和小数部分组合写入USART_BRR

  4. 使能串口验证通信

八、错误处理机制

串口通信中常见的错误类型及检测方法:

  • 校验错误:通过PE标志检测

  • 帧错误:停止位检测失败

  • 噪声错误:采样过程中出现干扰

  • 溢出错误:新数据覆盖未读取的旧数据

这些错误标志位在USART_SR寄存器中,需要软件定期检查和处理。

九、实际应用建议

  1. 初始化顺序

    • 使能GPIO时钟和USART时钟

    • 配置GPIO为复用功能

    • 配置USART_BRR设置波特率

    • 配置USART_CR1、CR2、CR3

    • 使能USART(UE=1)

  2. 中断使用

    • 对于高效通信,建议使用中断方式

    • 使能相应中断标志(TXEIE、RXNEIE等)

    • 在中断服务程序中处理数据

  3. 流控制应用

    • 在高速通信或缓冲区有限时,使用nRTS/nCTS硬件流控制

    • 防止数据丢失或溢出


参考资料:《零死角玩转STM32》"USART串口通信"章节、STM32F10x数据手册

相关推荐
小李子呢02118 小时前
Javascript学习(六)--Web APIs(日期对象,节点操作,M端事件,JS插件,综合案例)
开发语言·前端·javascript·学习
polarislove02148 小时前
10.1 [ADC] 逐次逼近型ADC-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
qq_672592758 小时前
STM32超声测距离的测量精度评估
stm32·硬件架构·硬件工程
谈思汽车8 小时前
TEE or HSM/SE?车载安全技术选型指南
嵌入式硬件·安全·智能汽车·可信执行环境·汽车信息安全
weixin_433179338 小时前
《旋元佑进阶文法》 之 语气
笔记·英语语法
单片机系统设计8 小时前
基于STM32的智能垃圾桶/语音分类/自动开盖/矩阵按键
stm32·矩阵·毕业设计·语音识别·智能垃圾桶
Chloeis Syntax8 小时前
MySQL初阶学习日记(8)--- JDBC
java·数据库·笔记·学习·mysql·jdbc
炽烈小老头9 小时前
【每天学习一点算法 2026/01/05】打乱数组
学习·算法·leetcode
中屹指纹浏览器9 小时前
2026多账号运营技术方案:指纹浏览器与IP协同适配实操指南
经验分享·笔记
羊小猪~~9 小时前
数据库学习笔记(十九)--C/C++调用MYSQL接口
数据库·笔记·后端·sql·学习·mysql·考研