STM32通信接口----USART

作者:雾岛听风眠日期:2025/11/17

STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等,这些都是芯片内部的电路,这些电路的配置寄存器、数据寄存器斗殴在芯片里面,操作这些寄存器直接读写即可。但也有一些功能是STM32内部没有的,如蓝牙无线遥控功能、陀螺仪加速度计测量姿态的功能,只能外挂芯片来完成,外挂的芯片,数据都在STM32外面,STM32若想获取这些数据,则需在两个设备之间连接上一根或多跟通信线,通过通信线路发送或接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。

全双工:通信双方能够同时进行双向通信,一般来说,全双工(发送线路和接受线路互不影响)的通讯都有两根数据线(串口TX发送RX接收;SPI,一根MOSI发送,一根MISO接收)。

半双工:I2C,CAN,USB都只有一根数据线

单工:数据只能从一个设备到另一个设备,而不能反着来,如把串口的RX引脚去掉,那串口就退化成单工

时钟:告诉接收方什么时候需要采集数据,I2C和SPI有单独的时钟线,接收方可以在时钟信号的指引下进行采样;串口、CAN、USB没有时钟线,需要双方约定一个采样频率,并且还需要加一些帧头帧尾等,进行采样位置的对齐

电平:单端信号引脚的高低电平都是对GND的电压差,所以单端信号通信的双方必须要共地(把GND接在一起),表中前3个还应加一个GND引脚,不接GND没法通信;差分信号是靠两个差分引脚的电压差来传输信号的,通信时可不用GND,使用差分信号可以极大地提高抗干扰特性,一般传输速度快、距离远。

设备:中间3个可在总线上挂载多个设备,需要有一个寻址的过程,以确定通信的对象

单片机和电脑通信,是串口的一大优势,可以接电脑屏幕,非常适合调试程序,打印信息I2C和SPI等一般都是芯片之间的通信,不会接在电脑上

如上图,第一个是USB转串口模块,上面有一个芯片,型号是CH340,这个芯片可以把串口协议转换为USB协议,左边是USB口,可以插在电脑上,右边是串口的引脚,可以和支持串口的芯片接在一起,以实现串口和电脑的通信;第二个是陀螺仪传感器模块,可测角速度、加速度这些姿态参数,左右各有4个引脚,一边是串口的引脚,另一边是I2C的引脚;第三个是蓝牙串口模块,下面4个脚是串口通信的引脚,上面的芯片可以和手机互联,实现手机遥控单片机的功能

一般串口通信的模块都有四个引脚,TX和RX都是单端信号,它们的高低电平都是相对于GND的,线路对地是0V,就代表发送了逻辑0;线路对地是3.3V,就代表发送了逻辑1

串口通信的TX、RX、GND是必须要接的,上面的VCC,如果两个设备都有独立供电,那VCC可以不接;如果其中一个设备没有供电,如设备1是STM32,设备2是蓝牙串口模块,STM32有独立供电,蓝牙串口没有独立供电,那样就需要把蓝牙串口的VCC和STM32的VCC接在一起,STM32通过这根线,向右边的子模块供电。

串口有很多电平标准,直接从控制器出来的信号,一般都是TTL电平。相同的电平才能相互通信,不同的电平信号,需要加一个电平转换芯片,转接一下。

单片机(低压小型设备)电路中最常见的是TTL电平

RS232电平,一般在大型的机器上使用

前两种电平标准,通信最远只能达到几十米,而使用RS485电平标准,通信距离可以达到上千米

在软件层面,它们都属于串口,所以程序并不会有什么变化

上图的两个时序图,就是串口发送一个字节的格式,该格式是串口协议规定的。串口中,每一个字节都装载在一个数据帧里面,每个数据帧都有起始位、数据位和停止位组成。数据位有8个,代表一个字节的8位,在右边这个数据帧里面,还可以在数据位的最后,加一个奇偶校验位,这样数据位总共是9位,有效载荷是前8位,代表一个自己字节,校验位跟在有效载荷后面,占1位

波特率(二进制调制下,波特率等于比特率,单片机的串口通信,基本都是二进制调制,高电平表示1,低电平表示0,1位就是1bit):串口一般是使用异步通信,所以需要双方约定一个通信速率,如A每隔1s发送一位,那么B应该每隔1s接收一位,若接受快了,就会重复接收某些位;如果接收慢了,就会漏掉某些位。故发送和接收,必须要约定好速率,这个速率参数,就是波特率。如双方规定波特率为1000bps,表示1s要发1000位,每一位的时间就是1ms

串口的空闲状态是高电平,即没有数据传输时,引脚必须置高电平,需要传输时,必须要先发送一个起始位(低电平),打破空闲状态的高电平,产生一个下降沿,告诉接收设备,这一帧数据要开始了

低位先行:如要发送一个字节,是0x0F,首先把0F转化为二进制,即0000 1111,数据要从低位进行发送,也就是1111 0000,依次发送在引脚上。

校验位:使用奇偶校验的数据验证方法,可判断数据传输是不是出错了,若数据出错,可选择丢弃或者要求重传,校验可选3种方式:无校验(上图左)、奇校验、偶校验(上图右)。

奇校验:包括校验位在内的9位数据会出现奇数个1,如传输0000 11111,校验位需再补一个1,

若数据是0000 1110,校验位补0。发送方在发送数据后,会补一个校验位,保证1的个数为奇数;

接收方,在接收数据后,会验证数据位和校验位,如果1的个数还是奇数,就认为数据没有出错;如果在传输中因为干扰,有一位由0变成1,或者由1变成0,那么整个数据的奇偶特性就会发生变化,接收方就认为传输出错。奇偶校验的检出率不是很高,如果有两位数据同时出错,奇偶特性变不变,那就校验不出来了。更高的检出率,可了解CRC校验(STM32也有CRC的外设)

串口通信的实际波形

探头GND接在负极,探头接在发送设备的TX引脚

在STM32中,根据字节数据翻转高低电平,是由USART外设自动完成的

TX引脚发送------置定时翻转的高低电平

RX引脚接收-------定时读取高低电平

串口的停止位是可以进行配置的,可以选择1位、1.5位、2位等

STM32内部的USART外设(串口通信的硬件支持电路):按照串口协议来产生和接收高低电平信号,实现串口通信

STM32的USART同步模式,只是多了一个时钟输出而已,只支持时钟输出,不支持时钟输入,更多是为了兼容别的协议或者特殊用途而设计的,并不支持两个USART之间进行同步通信

波特率发生器:用来配置波特率,其实是一个分频器,如APB2总线给个72MHZ的频率,然后波特率发生器进行分频,得到我们想要的波特率时钟,在这个时钟下进行收发,就是我们指定的通信波特率

常用串口参数:波特率9600或者115200,数据位8位,无校验

串口支持DMA进行数据转运,如果有大量数据进行收发,可以使用DMA转运数据,减轻CPU的负担

STM32F103C8T6总共有3个独立的USART外设,可以挂载很多串口设备,USART1是APB2总线上的设备,其余两个是APB1总线的设备

TDR(只写)与RDR(只读)占用一个地址,在程序上表现为一个寄存器,就是数据寄存器DR

发送移位寄存器:把一字节的数据一位一位地移出去,正好对应串口协议的波形的数据位。如在某时刻给TDR写入了0x55这个数据,在寄存器里是二进制数据,0101 0101,此时硬件检测到你写入数据了,就会检查,当前移位寄存器是不是有数据正在移位,如果没有,这个0101 0101就会立刻全部移动到发送移位寄存器(在发送器控制下,一位一位地把数据输出到TX引脚,这里是向右移位的,正好和串口协议规定的低位先行是一致的),准备发送。当数据从TD动到移位寄存器时,会置一个标志位(TX Empty),检查这个标志位,如果置1(数据其实还没有发送出去)了,我们就可以在TDR写入下一个数据了。当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器里来;如果当前移位寄存器移位还没有完成,TDR的数据就会进行等待,一但移位完成,就会立刻转移过来。有了TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲。

数据从RX引脚通向接收移位寄存器,在接收器控制下,一位一位地读取RX电平,先放在最高位,然后向右移,移位8次之后,就能接受一个字节了,当一个字节移位完成后,这一个字节的数据就会整体地一下子转移到接收数据寄存器RDR里来,在转移的过程中,也会置一个标志位RXNE(RX Not Empty),当检测到RXNE置1后,就可以把数据读走了,当数据从移位寄存器转移到RDR时,就可以直接接收下一帧数据了。

发送还需要加上帧头帧尾,接收还需要剔除帧头帧尾,这些操作,内部有电路会自动执行

硬件数据流控:如果发送设备发的太快,接收设备来不及处理,就会出现丢弃或覆盖数据的现象,

nRTS:(Request To Send)是请求发送,是输出脚(n代表低电平有效),输出一个能不能接收的反馈信号,接到对方的CTS。能接收的时候,RTS就置低电平,请求对方发送,对方的CTS接收到之后,就可以一直发。当处理不过来时,比如接受数据寄存器一直没有读,又有新的数据过来了,RTS就会置高电平,当对方的CTS接收到之后,就会暂停发送,直到接收数据寄存器被读走,RTS置低电平,新的数据才会继续发送。

nCTS:(Clear To Send)清除发送,是输入脚,用于接收别人nRTS信号的。

反过来,当我的TX给别人发送数据时,我们的CTS就要接到对方的RTS,用于判断对方能不能接收

TX-------CTS RX-------RTS

SCLK控制 :用于产生同步的时钟信号(可以兼容别的协议,有了时钟输出的串口,就可以兼容SPI;也可以做自适应波特率,如接收设备不确定发送设备给的什么波特率,就可以测量一下适中的周期,计算得到波特率),配合发送移位寄存器输出的,发送寄存器每移位一次,同步时钟电平就跳变一个周期(时钟只支持输出,不支持输入,两个USART之间,不能实现同步的串口通信)

唤醒单元 :实现串口挂载多设备, 可以给串口分配一个地址,发送指定地址时,此设备唤醒开始工作

**中断控制:**配置中断是不是能通向NVIC,中断申请位,就是状态寄存器里的各种标志位,TXE(发送寄存器空)和TXNE(接收寄存器非空)较为重要,是判断发送状态和接收状态的必要标志位

波特率发生器:APB时钟进行分频,得到发送和接收移位的时钟,USART1挂载在APB2,所以就是PCLK2的时钟,一般是72MHZ;其它的USART都挂载在APB1,所以是PCLK1的时钟,一般是36MHZ,之后这个时钟进行分频,除一个USARTDIV的分频系数(分为整数部分和小数部分,支持小数点后4位),分频完之后,还要再除以16得到发送器时钟和接收器时钟,通向控制部分

TE为1,发送器使能,发送部分的波特率就有效;RE为1,接收器使能,接收部分的波特率就有效 。

复用功能这一栏,给出了每个USART,它的各个引脚都是复用在了哪个GPIO上

简化结构图,给出了USART最主要最基本的结构

波特率发生器用于产生约定的通信速率,时钟来源是PCLK2/1,经过波特率发生器分频后,产生的时钟通向发送控制器(控制发送移位)和接收控制器(控制接收移位),之后发送数据寄存器和发送移位寄存器两个寄存器配合,将数据一位一位地移出去,通过GPIO口的复用输出,输出到TX引脚,产生串口协议规定的波形(向右的箭头表示移位寄存器是向右移的,低位先行),当数据由数据寄存器转移到移位寄存器时,会置一个TXE的标志位

RX引脚的波形,在接受控制器的控制下,一位一位地移入接收移位寄存器,右移符号代表也是右移,因为是低位先行,所以要从左边开始移进来,移完一帧数据后,数据就会统一转运到接收数据寄存器,转移的同时,置一个RXNE标志位,检查这个标志位,就可以知道是不是接收到数据了,同时这个标志位也可以去申请中断,这样就可以在接收到数据时,直接进入中断函数,然后快速的读取和保存数据

在软件层面,(上图的4个寄存器)只有一个DR寄存器可以供我们读写,写入DR时,数据走上面这条路,进行发送;读取DR时,数据走下面这条路,进行接收,这就是USART进行串口数据收发的过程

右下角是一个开关控制,配置完成之后,用Cmd开启一下外设

串口的输出TX比输入RX简单很多,输出时定时翻转TX引脚高低电平,输入时不仅要保证输入的采样频率和波特率保持一致;还要保证每次输入采样的位置,正好处于每一位的正中间(只有在每一位正中间采样,这样读进来的高低电平才最可靠,如果采样点过于靠前或靠后,有可能高低电平还正在翻转,电平还不稳定);输入最好还要对噪声有一定的判断能力,如果是噪声,最好置标志位提醒一下

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据,同时从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了,后面都是对齐的,为了实现这些功能,首先输入的这部分电路对采样时钟进行了细分,会以波特率的16倍频率进行采样,即在一位的时间里,可以进行16次采样。

采样策略:最开始,空闲状态是高电平,那采样一直是1,在某个位置突然采到一个0,说明,在这两次采样之间,出现了下降沿。如果没有任何噪声,之后应该是起始位,在起始位,会连续进行16次采样,如果没有噪声,那么这16次采样都是0;但是实际电路会存在一些噪声,所以即使这里出现下降沿了,后续也要再采样几次,以防万一。根据手册描述,这个接收电路还会在下降沿之后的第3次、5次、7次进行一批采样,在第8次、9次、10次再进行一次采样,且这两批采样都要求每3位里面至少有两个0。如果有一些轻微噪声,导致3位里面,只有两个是0,另一个是1,也算是检测到了起始位,但是在状态寄存器里会置一个NE(Noise Error),噪声标志位;若3位里面只有1个0,就不算检测到了起始位,可能前面的那个下降沿是噪声导致的,这是电路就忽略前面的数据,重新开始捕捉下降沿。

以上是STM32的串口在接收过程中,对噪声的处理,如果通过了起始位侦测,那接受状态就由空闲变为接受起始位,同时第8、9、10次采样的位置,正好是起始位的正中间,之后接收数据位时,就都在8、9、10次进行采样,这样就能保证采样位置在位的正中间了,这就是起始位侦测和采样位置对齐的策略

从1到16,是一个数据位的时间长度,在一个数据位,有16个采样时钟,由于起始位侦测已经对齐了采样时钟,所以这里就直接在第8、9、10次采样数据位,为了保证数据的可靠性,这里是连续采样3次。没有噪声的理想情况下,3次全为1或者全为0,若有噪声,导致3次采样不是全为1或者全为0,那就按照2:1的规则来,2次为1,就认为收到了1;2次为0,就认为收到了0,在这种情况下,噪声标志位NE也会置1

输入时钟/DIV=16倍的波特率

跳线帽用来选择通信电平,最好插上跳线帽,如果拿掉,相当于整个芯片没有供电

STM32通信需要3.3V,把跳线帽插在4、5引脚即可


STM32通信接口----USART》 是转载文章,点击查看原文


相关推荐


我开发了一款关于病历管理的app:安康记
叶子的技术碎碎念2025/11/16

上线了!上线了!基于Vibe Coding我终于也能独立开发出一款属于自己的app-安康记,目前终于成功上架App Store啦。 独立开发app这个事情我很早之前就有点念头,但学习Swift过程还挺痛苦的,总觉的各种语法糖很膈应,导致进度缓慢,后面就一直搁置了。ChatGPT出来之后也尝试了一点,但还是觉得当时的AI能力不够,并且纯靠聊天还是不太行,自从Cursor、Windsurf、CC、Codex这一类AI开发工具出来之后,Vibe Coding的概念也随之火热,我想也是时候重启自己的开发


Python 的内置函数 locals
IMPYLH2025/11/15

Python 内建函数列表 > Python 的内置函数 locals Python 的内置函数 locals() 是一个非常有用的工具函数,它返回一个字典,包含当前局部命名空间中的所有变量名及其对应的值。这个字典反映了函数或代码块中当前可访问的所有局部变量。 def locals(): ''' 返回一个代表当前局部符号表的映射对象 :return: 当前局部符号表的映射对象 ''' 功能详解: 返回内容:locals() 返回的字典包含当前作用域中


Python编程实战 - Python实用工具与库 - 文件批量处理脚本
程序员爱钓鱼2025/11/14

在实际开发、数据整理或办公自动化中,我们经常需要一次性处理大量文件,例如: 批量重命名文件 批量复制/移动文件 批量压缩文件 批量格式转换 批量读取与写入文本内容 Python 的标准库中,os、shutil、glob 等模块可以轻松构建各种文件批处理脚本,是自动化办公与数据清洗的利器。 本章将从常见场景出发,通过示例脚本帮助你快速掌握文件批量处理能力。 一、基础库介绍 1. os 模块 提供文件路径、文件夹、新建/删除目录等操作。 常用方法: os.listdir() os.rena


Arya - 功能强大的在线 Markdown 编辑器
修己xj2025/11/12

在当今信息爆炸的时代,Markdown 已成为写作、文档编写和内容创作的必备工具。今天我要向大家推荐一款功能强大、界面优美的在线 Markdown 编辑器——Arya(二丫)。 ScreenShot_2025-11-12_195419_427.png 项目简介 Arya 是一款基于 Vue2 和 Vditor 构建的现代化在线 Markdown 编辑器。它不仅具备了传统 Markdown 编辑器的所有基础功能,还集成了众多高级特性,让 Markdown 写作变得更加高效和愉悦。 该项目在git


Skip Fuse现在对独立开发者免费! -- 肘子的 Swift 周报 #0110
东坡肘子2025/11/11

📮 想持续关注 Swift 技术前沿? 每周一期《肘子的 Swift 周报》,为你精选本周最值得关注的 Swift、SwiftUI 技术文章、开源项目和社区动态。 📬 在 weekly.fatbobman.com 免费订阅 💬 加入 Discord 与中文 Swift 开发者深入交流 📚 访问 fatbobman.com 查看数百篇深度原创教程  一起构建更好的 Swift 应用!🚀 Skip Fuse现在对独立开发者免费! 在 Swift 社区发布官方 Android 版 SD


Vue SSR 深度解析:ssrProcessTeleport 的源码机制与实现原理
excel2025/11/9

在 Vue 3 的服务端渲染(SSR)编译阶段中,ssrProcessTeleport 是一个二次编译(second-pass)阶段的代码生成转换函数,用于处理 <teleport> 组件的服务端输出逻辑。 本文将深入剖析其设计目的、实现原理与编译链中的位置,并通过逐行注释展示源码的运行流程。 一、概念背景:SSR 与 Teleport 的特殊性 Teleport 的核心作用是在客户端渲染时允许开发者将某些内容渲染到 DOM 树的其他位置,例如: <teleport to="#modal">


单链表反转:从基础到进阶的完整指南
oioihoii2025/11/6

单链表反转是数据结构与算法中的经典问题,它不仅考察对链表结构的理解,也考验编程思维和技巧。本文将带你从基础实现到高级应用,全面掌握单链表反转。 1. 理解单链表 在深入反转算法之前,我们先回顾单链表的基本结构: class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next 单链表的特点是每个节点包含数据和指向下一个节点的指针,只能单向遍历。 2.


前端基础:从0到1实现简单网页效果(一)
<但凡.2025/11/1

目录 1、HTML 概述 2、HTML 的基本结构 3、HTML 常用标签 文本标签 链接与图片 列表 表格 表单 HTML5 新特性 HTML 与 CSS/JavaScript 的协作 HTML 开发工具 学习资源 4、HTML 标签拓展 结构标签 文本标签 链接与媒体标签 列表标签 表格标签 表单标签 元信息标签 语义标签 5、HTML 常用全局属性 表单相关属性 链接与媒体属性 事件处理属性 其他实用属性 6、HTML闭合与非闭合标签


大模型安全:从对齐问题到对抗性攻击的深度分析
鲁大猿2025/10/30

引言 随着大语言模型(LLM)在自然语言处理任务中展现出惊人能力,其安全性问题已成为学术界和工业界关注的焦点。大模型安全不仅关乎技术可靠性,更涉及伦理道德、社会影响和实际应用风险。本文从技术角度深入分析大模型面临的安全挑战及其解决方案。 一、大模型安全的多维框架 大模型安全可划分为三个层次:基础安全、对齐安全和应用安全。基础安全关注模型训练过程的稳定性;对齐安全确保模型行为与人类价值观一致;应用安全则针对具体部署场景中的风险。 从技术视角看,大模型安全的核心问题可归纳为: 价值对齐问题:如何将


Python 的内置函数 divmod
IMPYLH2025/10/27

Python 内建函数列表 > Python 的内置函数 divmod Python 的内置函数 divmod() 是一个实用的数学运算函数,它能够同时返回两个数值相除的商和余数。这个函数接受两个非复数数字作为参数,返回一个包含两个元素的元组,第一个元素是两数相除的商,第二个元素是余数。 def divmod(x, y): ''' 返回整数除法时的商和余数 :param x: 被除数 :param y: 除数 :return: 商和余数的元组

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0