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数据手册

相关推荐
YCY^v^6 小时前
JeecgBoot 项目运行指南
java·学习
飞睿科技6 小时前
乐鑫智能开关方案解析:基于ESP32-C系列的低功耗、高集成设计
嵌入式硬件·物联网·esp32·智能家居·乐鑫科技
云小逸6 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
JustDI-CM6 小时前
AI学习笔记-提示词工程
人工智能·笔记·学习
悟纤6 小时前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
爱写bug的野原新之助6 小时前
加密摘要算法MD5、SHA、HMAC:学习笔记
笔记·学习
来自晴朗的明天6 小时前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
ZH15455891317 小时前
Flutter for OpenHarmony Python学习助手实战:Web开发框架应用的实现
python·学习·flutter
百锦再7 小时前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
17(无规则自律)7 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件