STM32 USART串口超全详解(原理+接线+帧结构+中断+DMA+全套排错)
前言串口 USART 是嵌入式第一个、最重要、用得最多的通信外设属于串行、异步、一对一、全双工通信。不管是代码调试打印、蓝牙通信、GPS 采集、上位机通信、串口屏显示全部依赖串口。很多同学学串口只会复制 printf 模板只会调用函数不懂底层原理。遇到乱码、丢包、收不到数据、接收卡死完全不会排查。本篇文章纯零基础、学生向、练项目向从零彻底吃透 USART包含硬件接线、基础通信概念、帧结构、波特率原理、奇偶校验讲解、三种收发模式、常见报错、全套排错思路。看懂这一篇串口再也不用死记代码。一、基础通信概念梳理串行通信数据不一次性并行传输按照先后顺序一位一位逐根导线依次发送串口仅依靠TX、RX两根信号线传输数据属于典型串行通信。优点布线简单远距离传输稳定缺点传输速度弱于并行通信。异步通信通信双方没有共用时钟信号线不靠时钟同步时序提前约定统一波特率、帧格式设备自行采样识别数据USART日常使用模式就是异步通信。一对一通信一个发送端只对应一个接收端点对点传输串口基础用法为一对一不适合一主多从大规模挂载。全双工通信TX、RX两条线路相互独立同一时刻可以一边发数据、一边接收数据收发互不干扰串口天生支持全双工。二、UART / USART 到底有什么区别1、UART异步串口只有两根线TX、RX没有时钟线双方靠约定波特率通信。我们平时所有的调试串口、USB转串口、模块通信全部都是 UART。2、USART同步/异步串口USART UART异步通信 同步时钟通信异步模式就是我们日常用的串口串行、异步、一对一、全双工同步模式多出一根 SCLK 时钟线不需要波特率重点99% 的学习和项目只用到异步模式等同于 UART。三、串口硬件接线原理90%新手踩坑点1、终极接线规则死记TX 接 RXRX 接 TXGND 必须相连单片机 TX → 外设 RX单片机 RX → 外设 TX单片机 GND ↔ 外设 GND2、为什么必须交叉TX 是发送RX 是接收你发的数据必须对方收对方发的数据必须你来收全双工通信依靠交叉接线实现双向收发。3、为什么必须共地两个设备电压基准不一样不共地 电平识别错乱 百分百乱码 / 不收数据可以分开供电但地线必须连在一起。4、电平注意防烧芯片STM32 是 3.3V TTL很多模块是 5V TTL5V TX 绝对不能直连 3.3V 单片机 RX会击穿 IO解决方法串1k电阻或电平转换。补充初始化为何同时开启USART与GPIO时钟GPIO引脚与USART是两个独立硬件1.GPIO时钟TX、RX引脚要配置复用功能引脚电平检测、电路驱动需要时钟不开时钟引脚失效2.USART时钟串口内部分频、移位、校验、中断硬件需要时钟不开时钟串口休眠无法工作。USART1挂载APB2总线其余串口挂载APB1总线开启时钟时需要对应总线。四、串口帧结构所有乱码的根源串口不是发字节是发一帧一帧的数据标准帧格式起始位 数据位 校验位 停止位1、各分段介绍起始位固定1位低电平用来唤醒接收端告知即将传输数据数据位常用8位承载要传输的有效数据校验位可选用来简单校验传输数据是否出错分为无校验、奇校验、偶校验停止位常用1位高电平标记单帧数据传输结束。2、三种校验方式详解N 无校验日常调试默认8N1不额外计算校验位传输速度最快绝大多数普通场景使用。E 偶校验统计8位数据里1的总个数保证总数为偶数传输结束后接收端重新统计数量不符代表数据传输出错。O 奇校验统计8位数据里1的总个数保证总数为奇数接收端核对数量不一致判定数据异常。通信硬性条件两端设备配置必须一模一样波特率、数据位、校验方式、停止位任意一项不匹配直接乱码。传输过程空闲状态总线一直高电平拉低电平起始位通知对方准备接收依次发送8位数据按需发送校验位拉高电平停止位结束一帧五、波特率到底是什么为什么会乱码1、波特率定义每秒传输多少个二进制位常用9600、1152002、为什么 115200 容易乱码波特率由时钟分频计算而来高速波特率对晶振精度要求极高晶振微小误差会累积错位 → 乱码新手、调试、项目稳定优先用 9600六、USART 三种收发模式从入门到进阶1、轮询模式新手入门CPU 一直死等收发完成优点代码简单、好理解缺点阻塞程序、极易丢包适用仅简单打印调试2、中断模式学生项目主流有数据再来处理没事CPU正常跑代码常用中断RXNE收到一个字节IDLE总线空闲一整包数据发完ORE接收溢出报错标准写法中断只搬数据主循环解析数据中断里不写延时、不写打印、不写判断。3、DMA模式进阶必备硬件自动搬运数据全程不用CPU参与不卡顿、不丢包、速度最快适合大批量数据传输、屏幕、高速串口收发七、串口核心寄存器通俗理解TDR发送寄存器写数据进去就自动发RDR接收寄存器外部数据存在这里SR状态寄存器标记各类收发状态与报错重点三个常用标志位TXE发送寄存器为空。CPU写入1字节数据到TDR后硬件移出数据时TXE自动置1代表可以填入下一个待发送字节轮询发送最常用判断位。TC发送完成标志。当前一整帧数据全部移位输出、TX线路回到空闲电平后TC置1代表单次字节发送彻底结束。RXNE接收寄存器非空。硬件成功接收1帧数据并存入RDRRXNE立刻置1是接收中断的触发源头。BRR波特率寄存器决定通信速度CR1配置寄存器用来开启/关闭奇偶校验、数据位长度等功能补充简单区分TXE只管寄存器空不空TC只管一帧有没有彻底发完RXNE是收到数据最直观的信号检测到该标志就要立刻读取RDR防止数据覆盖溢出。八、串口所有常见问题 完整排错教程1、能发不能收TX/RX接反RX引脚没开复用没开接收使能没开中断2、全部乱码波特率不匹配校验方式、停止位、数据位配置不一致没共地3.3V/5V电平混用115200波特率误差大3、单字节正常、多字节丢包用了轮询模式没有缓冲区接收速度跟不上4、一直报 ORE 溢出错误数据接收太快CPU读取不及时解决加缓冲区、空闲中断、DMA5、串口助手显示问号、方框上位机校验、波特率等参数和单片机参数不一致九、标准学习架构学生练项目通用开启 RCC 时钟USART GPIO配置 GPIO 复用模式配置波特率、数据位、校验模式、停止位、收发使能配置中断优先级中断缓存接收数据主循环处理数据逻辑十、串口使用场景代码调试打印无校验8N1HC05蓝牙、GPS模块大多无校验工业简单通信会用到奇偶校验串口屏、上位机数据交互十一、面试高频考点总结串口异步通信依靠什么同步时序依靠双方提前约定一致的波特率、帧格式无共用时钟线依靠起始位校准采样。TXE 和 TC 的区别TXE代表发送数据寄存器空置可以写入新字节TC代表当前整段数据完全移位发送完毕。为什么RXNE不及时读取会产生ORE溢出错误新接收的数据会覆盖RDR寄存器内未读取的旧数据硬件判定接收溢出。串口接线为什么TX与RX交叉、GND必须共地TX负责发送、RX负责接收交叉才能互相收发共地统一电平参考基准避免乱码。中断接收为什么禁止在中断内部做数据解析、延时、打印中断运行优先级高耗时操作会拉长中断占用时间极易造成数据丢包、系统卡顿。115200高速波特率更容易乱码的原因对晶振精度敏感长时间采样误差累积导致数据采样错位。奇偶校验的作用简单校验单字节传输正误仅能排查少量错误无法修复数据工业通信常用。轮询、中断、DMA三种模式优缺点与适用场景轮询简单但阻塞CPU中断平衡性能日常项目最常用DMA解放内核适合高速大批量传输。结束语本文完整详细讲解了 STM32 USART 的全部核心知识点包含通信基础概念、硬件接线、通信原理、帧结构、奇偶校验、波特率、三种收发模式和全套报错排查非常适合新手系统学习、项目开发和期末复习。觉得内容对你有帮助的话点赞 收藏方便以后随时翻看复习后续会持续更新 STM32 定时器、ADC、DMA、外设实战教程欢迎关注