江科大STM32入门:USART串口通信详解(知识点梳理)
我的STM32学习专栏[点击直达 | 持续更新中]本文基于江科大STM32入门教程结合《STM32F10xxx参考手册》对USART串口通信的知识点进行系统梳理。适用平台STM32F103C8T6。前言USART串口这一章是非常重要的一章江科大STM32教程以“硬件→寄存器→现象”的实战风格被众多初学者奉为嵌入式入门经典。本讲基于该课程体系系统梳理USART串口通信的核心知识点协议硬件串并转换、全双工、TTL/RS232电平、TX-RX交叉连接参数配置波特率、起始位、数据位、校验位、停止位代码实现寄存器/库函数配置、发送接收、printf重定向、汉字乱码处理数据包解析HEX包与文本包收发、状态机拆包、固定/可变包长方案本节先带大家一起充分理解USART的知识点为后续代码实现打下基础。一、通信接口概述1.1 什么是通信接口目的将一个设备的数据传送到另一个设备扩展硬件系统。通信协议规定通信规则通信双方按照协议规则进行数据收发。1.2 常见通信接口对比我的理解这张表建议直接背下来以后做项目选通信方式的时候先看双工方式能不能同时收发再看时钟需不需要时钟线最后看电平标准。USART最大的优势就是异步全双工只需要两根线TX、RX就能双向通信线路特别简单。几个重要概念全双工通信双方能够同时进行双向通信USART的TX发的同时RX可以收。半双工同一时刻只能单向通信比如I2C只有一根SDA线发的时候不能收。单端引脚的高低电平都是对GND的电压差所以双方必须共地。差分用两个引脚的电压差表示数据如CAN_H和CAN_L抗干扰能力极强。SPI引脚补充MOSI主机输出数据脚Master Output Slave InputMISO主机输入数据脚Master Input Slave OutputCS片选用于指定通信的对象低电平有效二、串口通信基础第一个为USB转串口本节用的第二个为陀螺仪传感器第三个为蓝牙串口模块串口是一种应用十分广泛的通讯接口串口成本低、容易使用、通信线路简单可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、与各种各样的模块互相通信极大地扩展了单片机的应用范围增强了单片机系统的硬件实力。我的理解学STM32一定要学好串口因为调试的时候最常用的就是串口打印。而且很多模块比如蓝牙、GPS、WiFi、4G都是串口通信的学会一个串口就能驱动一堆模块性价比极高。三、硬件电路连接3.1 接线规则硬件电路连接图简单双向串口通信有2根通信线发送端TX和接收端RX。TX与RX要交叉连接设备1的TX → 设备2的RX设备1的RX → 设备2的TX。当只需单向数据传输时可以只接一根通信线只发不接或只接不发。当电平标准不一致时需加电平转换芯片比如STM32和电脑RS232串口直连会烧芯片。我的理解交叉连接这个新手很容易搞混记住一句话我的发送接你的接收我的接收接你的发送。还有单端信号一定要共GND不共地的话电平参考点都不一样数据全是乱的。四、电平标准电平标准是数据1和数据0的表达方式是传输线缆中人为规定的电压与数据的对应关系。串口常用的电平标准有如下三种电平标准逻辑1逻辑0特点TTL电平3.3V / 5V0V单片机直接使用的电平RS232电平-3V ~ -15V3V ~ 15V电脑老式DB9串口负逻辑RS485电平两线压差 2V ~ 6V两线压差 -2V ~ -6V差分信号抗干扰强适合远距离我的理解STM32引脚出来的是TTL电平而电脑老式的DB9串口是RS232电平两者电压范围完全不同不能直接连中间需要MAX232芯片转换。现在我们都用USB转TTL模块比如CH340、CP2102直接插电脑USB口就能和STM32通信省了很多事。RS485在工业现场用得很多因为差分信号传得远、抗干扰。五、串口参数及时序5.1 一帧数据的组成串口通信是逐位传输的一帧数据包含以下几个部分参数作用电平状态起始位标志一个数据帧的开始固定为低电平数据位数据帧的有效载荷低位先行1为高电平0为低电平校验位用于数据验证根据数据位计算得来可选奇/偶/无停止位用于数据帧间隔标志一帧结束固定为高电平5.2 波特率波特率串口通信的速率表示每秒传输的码元个数。通信双方必须约定相同的波特率常见有9600、115200等。串口时序图时序图解读空闲状态高电平没有数据传输时。起始位拉低一个位的时间告诉对方我要开始传数据了。数据位8位或9位低位先行D0先传D7后传。停止位拉高表示一帧结束回到空闲状态。我的理解低位先行这个点初学者很容易忽略比如你要传0x55二进制01010101实际线上是先传最低位1再传0再传1……也就是从D0到D7的顺序。还有起始位固定低电平、停止位固定高电平这是硬件自动处理的我们配置好参数就行。六、串口时序串口时序示波器图TX引脚在波特率时钟控制下输出定时翻转的高低电平。RX引脚在同样的时间点定时读取引脚的高低电平。我的理解看示波器图就很清楚了TX引脚按照波特率一位一位地翻转。RX引脚则在同样的时间点去采样只要双方波特率一致就能正确解析出数据。这就是为什么波特率必须一致的原因——你发得快我收的慢或者你发得慢我收得快数据肯定乱套。七、USART外设简介7.1 USART是什么USARTUniversal Synchronous Asynchronous Receiver Transmitter通用同步/异步收发器。USART是STM32内部集成的硬件外设可根据数据寄存器的一个字节数据自动生成数据帧时序从TX引脚发送出去也可自动接收RX引脚的数据帧时序拼接为一个字节数据存放在数据寄存器里。简单说我们只需要把数据丢给USART它会自动帮我们加上起始位、停止位、按波特率一位一位发出去接收的时候也会自动去掉起始位停止位把有效数据拼好给我们。7.2 USART的主要特性自带波特率发生器相当于分频器最高达4.5 Mbits/s。可配置数据位长度8位或9位。可配置停止位长度0.5、1、1.5、2个停止位。可选校验位无校验、奇校验、偶校验。支持同步模式可输出CLK时钟平时用异步模式这个很少用。硬件流控制RTS/CTS防止接收方处理慢而导致数据丢失。其他功能DMA传输、智能卡、IrDA、LIN协议支持。7.3 STM32F103C8T6的USART资源表格USART挂载总线最高时钟备注USART1APB272MHz性能最好常用USART2APB136MHz普通串口USART3APB136MHz普通串口我的理解USART1挂在APB2上时钟最快所以如果要高速通信优先用USART1。USART2和3挂在APB1上速度稍慢但完全够用。一般调试打印用USART1默认引脚PA9、PA10因为串口下载程序也用这个口一根USB转串口线既能下载又能调试特别方便。八、USART框图与基本结构8.1 USART框图解读USART框图框图中几个关键部分发送数据寄存器TDR要发送的数据先放到这里。接收数据寄存器RDR接收到的数据存在这里读RDR就能拿到数据。发送移位寄存器把TDR的数据一位一位移出去从TX引脚发送。接收移位寄存器把RX引脚的数据一位一位拼成字节完成后转存到RDR。TXETransmit Empty发送寄存器空标志位1表示TDR已空可以写入下一个数据。RXNERead Not Empty接收寄存器非空标志位1表示RDR里有数据可以读取。8.2 基本结构简化图USART基本结构图简化后的数据流向波特率发生器 → 发送控制器 → 发送移位寄存器 → GPIO(TX) → 接收控制器 → 接收移位寄存器 → GPIO(RX)数据发送流程用户把数据写入发送数据寄存器TDR。当TXE1发送寄存器空硬件自动把TDR数据转移到发送移位寄存器。移位寄存器在波特率时钟控制下逐位从TX引脚输出先低位后高位。数据接收流程RX引脚的数据在波特率时钟控制下逐位移入接收移位寄存器。收完一帧检测到停止位后数据转移到接收数据寄存器RDR。RXNE置1表示接收寄存器非空用户读取RDR即可拿到数据。8.3 默认引脚与重映射功能默认引脚重映射引脚USART1_TXPA9PB6USART1_RXPA10PB7我的理解框图看着复杂但抓住核心就行——发送和接收各有一个移位寄存器在底层一位一位地干活我们只需要关心TDR和RDR两个寄存器。TXE和RXNE是两个最重要的标志位查询方式和中断方式都要靠它们来判断收发状态。九、数据帧格式详解9.1 字长设置字长设置时序图9位字长设置了M位实际包含8位数据 1位校验位或9位纯数据。8位字长未设置M位实际包含7位数据 1位校验位或8位纯数据。建议选择9位字长有校验位8位字长无校验位9.2 停止位配置配置停止位时序图停止位适用场景1个停止位最常用默认配置通用场景1.5个停止位智能卡模式2个停止位常规USART模式兼容性更好0.5个停止位智能卡模式我的理解平时用8位数据位、无校验、1个停止位简称8N1就行这是业界标准配置。停止位越多帧与帧之间的间隔越长兼容性越好但传输效率略低。一般不用纠结选1个停止位准没错。如果通信不稳定可以尝试改成2个停止位试试。十、起始位侦测起始位侦测图USART在接收时采用16倍过采样即以16倍波特率的频率对RX引脚采样。起始位侦测过程空闲状态RX为高电平。检测到下降沿由高变低怀疑是起始位来了。在下降沿后的第3、5、7个采样点进行第一次采样前3位。在第8、9、10个采样点再次采样后3位。采用3选2原则每3位里面至少应有2个为0才确认是真正的起始位。我的理解这个设计太妙了因为实际信号会有噪声和边沿抖动如果只看一次采样很可能误判比如一个毛刺就被当成起始位了。16倍过采样 3选2就像投票机制大大提高了抗干扰能力。STM32的硬件帮我们做了这些复杂的事我们只需要配置好波特率剩下的交给硬件。十一、数据采样数据采样图数据采样同样采用16倍过采样一位的时间长度被分成16份。在一位的中间位置第8、9、10个采样点进行采样。采用3选2原则确定该位的电平值。我的理解在位的中间采样是最稳的因为边沿处信号可能还在跳变中间最稳定。3选2又是防误判机制。所以STM32的串口硬件在抗干扰方面确实做得挺完善的这也是为什么串口通信虽然简单但很可靠的原因。十二、波特率发生器12.1 计算公式波特率发生器部分波特率由波特率寄存器BRR里的DIV值确定波特率 f_PCLKx/ (16 * DIV)其中f_PCLKxUSART挂载总线的时钟频率USART1在APB2为72MHzUSART2/3在APB1为36MHz。DIV分频系数由BRR寄存器配置。12.2 BRR寄存器结构BRR寄存器分为两部分DIV_Mantissa[11:0]整数部分12位。DIV_Fraction[3:0]小数部分4位。所以DIV是一个带小数的分频系数可以精确配置波特率USARTDIVDIV_Mantissa16DIV_Fraction我的理解带小数分频这个设计很精髓如果只能整数分频很多标准波特率比如115200配出来误差会很大通信就容易乱码。有了4位小数相当于可以精确到1/16波特率误差就能控制在很小范围内通常1%。库函数里的USART_Init()就是自动帮我们算这个DIV值的但手写代码的时候要知道这个公式。十三、CH340 USB转串口模块13.1 模块作用电脑USB口输出的不是TTL电平我们需要一个转换芯片把USB信号转成TTL电平才能和STM32通信。CH340是国内最常用的USB转串口芯片之一。13.2 原理图要点CH340原理图稳压电路从USB的5V稳压到3.3V给CH340和外部电路供电。晶振电路12MHz晶振提供CH340的工作时钟。TXD/RXD串行数据输出/输入接STM32的RX/TX注意交叉连接。LED指示PWR电源灯、TXD发送灯、RXD接收灯有数据闪烁。供电与电平选择短路VCC5V到CH340G VCC模块供电为5VTTL电平为5V。短路VCC3V3到CH340G VCC模块供电为3.3VTTL电平为3.3V。我的理解用CH340模块的时候一定要注意电平选择STM32F103是3.3V单片机虽然大部分IO口5V tolerant但最好让CH340输出3.3V TTL电平这样最安全。还有TXD和RXD一定要和STM32交叉连接别接反了看到PWR灯亮、TX/RX灯在闪但收不到数据先检查线是不是交叉的。以上就是USART串口通信的知识点梳理。从通信接口的概念到硬件电路、电平标准、时序参数再到STM32内部USART外设的结构、数据帧格式、起始位侦测、波特率计算最后到CH340模块的原理把这些串起来串口的整个知识框架就清晰了。开发环境Keil5 STM32F103C8T6最小系统板 ST-Link参考资料江科大STM32入门教程、《STM32F10xxx参考手册》前置文章江科大STM32入门DMA库函数详解与ADCDMA多通道采集实战如果本文对你有帮助欢迎点赞 收藏 ⭐ 有任何问题欢迎在评论区交流一起学习进步