ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

7.STM32 串口通信详解:从通信基础到 UART/USART 实战调试

7.STM32 串口通信详解:从通信基础到 UART/USART 实战调试 摘要本文系统讲解嵌入式通信的基础知识从通信的本质与历史演变出发介绍通信的多种划分方式传输介质、时钟同步、数据传输方向、数据位传输方式并重点剖析 STM32 中常用的 UART/USART 通信包括 UART 与 USART 的区别、接线方法、数据帧结构、波特率计算、相关寄存器、串口电平标准TTL、RS232、RS485最后总结串口乱码、数据丢失等常见问题的调试技巧帮助读者快速掌握串口通信的实战要点。一、什么是通信1、我们见到的通信通信的本质是信息的传递与交换。在人类历史上通信方式经历了漫长的演变烽火台古代边防军事通信通过点燃烟火传递敌情信号烽火戏诸侯便是利用烽火传递信息的典故。特点是传递速度快但信息量极少只能传递预设的简单信号。飞鸽传书利用信鸽的归巢本能传递书信可携带一定文字信息但受天气、距离和鸽子状态影响可靠性有限。驿站快马通过接力方式传递公文和信件是古代官方主要的长途通信手段。旗语、鼓号在近距离或战场上通过视觉、听觉信号传递指令。这些原始通信方式的共同局限是传输距离有限、信息量小、速度慢、易受干扰。2、电子领域通信在电子与计算机领域通信指设备与设备之间进行数据的交互即通过电信号或光信号按照一定的协议规范在两个或多个电子设备之间传递二进制数据。电子通信的核心要素包括发送端Tx将数据编码为电信号并发送出去的设备。接收端Rx接收电信号并解码还原为数据的设备。传输介质信号传播的载体如导线有线、空气无线、光纤等。通信协议收发双方约定的数据格式、时序规则和纠错机制确保数据能被正确理解。与传统通信相比电子通信具有速度快、容量大、抗干扰能力强、可长距离传输等优势是现代嵌入式系统、计算机网络和物联网的基础。二、通信的划分通信可以从不同维度进行分类以下是嵌入式领域最常见的几种划分方式1、按传输介质划分无线通信利用电磁波在空气中传播信号无需物理连线。常见方式Wi-Fi、蓝牙Bluetooth、星闪、ZigBee、LoRa、NB-IoT窄带宽物联、4G/5G、GPRS 2G 等。优点部署灵活、移动性强、无需布线。缺点易受干扰、安全性相对较低、功耗较高。有线通信通过物理导线如铜线、光纤传输信号。常见方式UART、SPI、I2C、USB、以太网Ethernet、CAN 等。优点传输稳定、抗干扰能力强、安全性高、速度快。缺点需要物理布线、移动性差、设备间距离受线缆限制。2、按时钟同步方式划分同步通信收发双方共用同一时钟信号数据在时钟节拍下同步传输。特点需要额外的时钟线SCK/CLK数据传输效率高适合高速大批量数据传输。典型协议SPI、I2S。同步通信优点安全、快。缺点占用 IO 资源多。异步通信收发双方不共用时钟各自使用独立的本地时钟通过约定的波特率和数据帧格式来同步。特点无需时钟线只需两根数据线TX/RX即可通信通过起始位和停止位标识数据帧的开始和结束。缺点每个字节都需要额外的起始位和停止位传输效率相对较低。典型协议UART。优点占用 IO 资源少。缺点慢、丢包率高。3、按数据传输方向划分模式定义特点典型示例单工数据只能沿一个方向传输发送端只能发送接收端只能接收。方向固定不可反向。广播、电视、遥控器发射半双工数据可以双向传输但同一时刻只能沿一个方向传输收发不能同时进行。需要切换收发方向存在切换延迟。对讲机、I2C、SPI单条数据线时全双工数据可以同时双向传输发送和接收互不影响。需要独立的发送和接收通道效率最高。UART、电话、以太网4、按数据位传输方式划分串行通信数据按位bit依次在一条数据线上传输每次只传一位。优点占用引脚少通常只需 TX、RX 两根线布线简单适合长距离传输。缺点传输速度相对较低相对于并行。典型协议UART、SPI、I2C、USB、CAN。并行通信数据的多个位同时在多条数据线上传输一次可传输多个 bit。优点传输速度快一次可传输 8/16/32 位数据。缺点占用引脚多布线复杂信号线间存在串扰不适合长距离和高速场景。典型示例传统打印机并口、IDE 接口、STM32 FSMC 外部存储器接口。在现代嵌入式系统中串行通信已成为主流。随着芯片工艺和信号处理技术的进步串行通信的速度已大幅提升如 USB 3.0、PCIe且引脚少、抗干扰强的优势更加突出。三、STM32中的通信STM32 系列微控制器集成了丰富的通信外设能够满足各种嵌入式应用场景的通信需求。以下是 STM32 中常见的通信外设及其特点通信外设通信方式同步/异步duplex典型应用场景UART / USART串行、有线异步UART/ 同步异步USART全双工串口调试、GPS 模块、蓝牙模块、Wi-Fi 模块、与 PC 通信SPI串行、有线同步全双工Flash 存储、OLED/LCD 显示屏、ADC/DAC、SD 卡、NRF24L01I2C串行、有线同步半双工传感器温湿度、加速度、EEPROM、RTC 时钟、OLED 屏CAN串行、有线异步半双工汽车电子、工业控制、多机通信网络USB串行、有线异步全双工虚拟串口VCP、USB 主机/设备、HID 设备、U盘Ethernet串行、有线异步全双工网络通信、物联网网关、远程控制485串行、有线异步各通信方式的选择建议调试与简单数据传输优先选择 UART使用简单、工具成熟几乎所有开发板都引出串口。高速短距离板内通信选择 SPI速度快可达几十 MHz适合与高速外设Flash、显示屏通信。多设备、低速、少引脚选择 I2C只需两根线SCL/SDA即可挂载多个从设备适合传感器网络。多机长距离、高可靠性选择 CAN支持差分信号传输抗干扰能力强最远可达数公里。与 PC 高速通信选择 USB可虚拟为串口CDC或使用自定义协议速度远高于普通串口。STM32 不同型号的通信外设数量和种类有所差异。例如 F1 系列通常有 3 个 USART 2 个 SPI 2 个 I2C 1 个 USBF4 系列则有 6 个 UART/USART 3 个 SPI 3 个 I2C 2 个 CAN USB OTG 等。使用时需查阅对应型号的数据手册。四、UART和USART1、是什么UARTUniversal Asynchronous Receiver/Transmitter通用异步收发器是一种通用的串行异步通信协议也是嵌入式系统中最常用、最基础的通信方式之一。它将并行数据转换为串行数据发送出去同时将接收到的串行数据转换为并行数据。USARTUniversal Synchronous/Asynchronous Receiver/Transmitter通用同步异步收发器是 UART 的增强版在支持异步通信的基础上额外支持同步通信模式提供时钟输出引脚 SCLK。在 STM32 中USART 可以工作在异步模式此时功能等同于 UART也可以工作在同步模式。而 UART 外设仅支持异步模式。2、UART 和 USART 的区别对比项UARTUSART全称通用异步收发器通用同步异步收发器同步模式不支持支持提供 SCLK 时钟引脚异步模式支持支持引脚数量TX、RX最少 2 根TX、RX、SCLK同步模式需 3 根时钟源收发双方各自独立时钟异步模式同 UART同步模式由主机提供时钟在实际开发中绝大多数场景使用的都是异步模式此时 USART 和 UART 的用法完全相同。STM32 的 USART 外设默认工作在异步模式因此教程中常说的串口通常指的就是 USART 的异步模式。3、UART 接线UART 通信最基本的连接需要三根线TXTransmit发送端数据发送引脚设备 A 的 TX 连接设备 B 的 RX。RXReceive接收端数据接收引脚设备 A 的 RX 连接设备 B 的 TX。GNDGround地线共地确保双方电平参考一致这是通信稳定的必要条件。接线原则TX 接 RXRX 接 TXGND 接 GND交叉连接。设备 A 设备 B┌─────────┐ ┌─────────┐│ TX │───▶ │ RX ││ RX │◀─── │ TX ││ GND │──── │ GND │└─────────┘ └─────────┘注意事项如果只需要单向传输如只发送不接收可以只接 TX-RX 和 GND 两根线。部分 UART 还支持硬件流控引脚 RTS请求发送和 CTS清除发送用于防止数据溢出但一般场景不使用。必须确保双方电平一致如都是 3.3V TTL 电平否则需要电平转换芯片如 MAX3232 转 RS232或 CH340/CP2102 转 USB。4、UART 通信协议UART 异步通信以数据帧Frame为单位传输每一帧包含以下部分1数据帧结构空闲位Idle总线空闲时保持高电平。起始位Start Bit1 位由高电平拉低为低电平表示一帧数据的开始。接收端检测到下降沿后开始接收数据。数据位Data Bits5~9 位通常为 8 位1 字节。低位在前LSB First高位在后MSB Last。校验位Parity Bit可选0 或 1 位。用于数据校验可选择奇校验Odd、偶校验Even或无校验None。停止位Stop Bit1 位、1.5 位或 2 位高电平表示一帧数据的结束。2波特率Baud Rate波特率表示每秒传输的二进制位数单位是 bpsbit per second。常见的波特率有9600、19200、38400、57600、115200 等。收发双方必须设置相同的波特率否则会因时钟偏差导致数据错乱。以最常用的8N1 格式8 位数据位、无校验、1 位停止位和 115200 波特率为例每帧实际传输位数 1起始 8数据 1停止 10 位面试会问。每秒可传输字节数 115200 / 10 11520 字节/秒。3常见配置组合配置含义使用场景8N18 数据位、无校验、1 停止位最常用绝大多数场景默认配置8E18 数据位、偶校验、1 停止位需要数据校验的工业场景8O18 数据位、奇校验、1 停止位需要数据校验的工业场景8N28 数据位、无校验、2 停止位部分老设备或对可靠性要求高的场景5、UART 框图STM32 USART 外设的内部结构主要包含以下几个部分各部分功能说明发送数据寄存器TDR / DRCPU 将待发送的数据写入该寄存器数据会自动转移到发送移位寄存器。发送移位寄存器TX Shift Register将并行数据按位串行化在波特率时钟驱动下从 TX 引脚逐位发送出去。接收移位寄存器RX Shift Register从 RX 引脚逐位接收串行数据组装成并行数据后转移到接收数据寄存器。接收数据寄存器RDR / DR存放接收到的完整数据CPU 从该寄存器读取数据。波特率发生器Baud Rate Generator根据 BRR 寄存器的配置对系统时钟分频产生收发所需的波特率时钟。控制寄存器CR1/CR2/CR3配置 USART 的工作模式、数据位、校验位、停止位、中断使能等。状态寄存器SR反映 USART 当前的工作状态如发送寄存器空TXE、发送完成TC、接收寄存器非空RXNE、溢出错误ORE等。6、UART 相关寄存器以 STM32F1 系列为例USART 主要涉及以下寄存器基地址因 USART 编号不同而异寄存器全称主要功能USART_SR状态寄存器反映 TXE、TC、RXNE、IDLE、ORE、FE、NE、PE 等状态标志位USART_DR数据寄存器低 9 位有效写入即发送读取即接收TDR 和 RDR 共用同一地址USART_BRR波特率寄存器设置波特率分频值高 12 位为 DIV_Mantissa低 4 位为 DIV_FractionUSART_CR1控制寄存器 1UEUSART 使能、M数据位长度、PCE校验使能、PS校验选择、TXEIE/TCIE/RXNEIE中断使能、TE/RE发送/接收使能USART_CR2控制寄存器 2STOP停止位位数、LINEN、CLKEN同步模式时钟使能、CPOL/CPHA同步时钟极性/相位USART_CR3控制寄存器 3CTSE/RTSE硬件流控使能、DMAT/DMARDMA 发送/接收使能、IREN红外模式、EIE错误中断使能USART_GTPR保护时间和分频寄存器智能卡模式下的保护时间和红外分频常用状态位说明USART_SRTXE位 7发送数据寄存器空。当 TDR 中的数据已转移到移位寄存器时置 1表示可以写入下一个数据。写入 DR 后硬件自动清零。TC位 6发送完成。当一帧数据包括停止位完全从 TX 引脚发送出去且 TXE1 时置 1。需要软件清零先读 SR再写 DR。RXNE位 5接收数据寄存器非空。当移位寄存器中的数据已转移到 RDR 时置 1表示有数据可读。读取 DR 后硬件自动清零。IDLE位 4检测到空闲总线。当 RX 引脚持续一帧时间为高电平时置 1常用于判断一帧数据接收结束。需软件序列清零读 SR 再读 DR。ORE位 3溢出错误。当 RDR 中已有数据未读又接收到新数据时置 1表示数据丢失。FE位 1帧错误。检测到无效的停止位时置 1。PE位 0校验错误。接收到的数据校验位不匹配时置 1。波特率计算USART_BRR波特率分频值计算公式$$\text{USARTDIV} \frac{f_{CK}}{16 \times \text{BaudRate}$$其中 f$${}_{CK$$ 为 USART 的时钟频率APB1 或 APB2 总线时钟。例如USART1 挂在 APB2 上f$${}_{CK$$ 72MHz目标波特率 115200$$\text{USARTDIV} \frac{72000000}{16 \times 115200} \frac{72000000}{1843200} \approx 39.062$$DIV_Mantissa 39整数部分DIV_Fraction 0.0625 × 16 1小数部分 × 16 取整USART_BRR (39 4) | 1 0x2717、串口电平标准UART 本身只定义了通信协议数据帧格式、时序但没有规定物理电平标准。在实际应用中常见的串口电平标准有以下三种电平标准逻辑1高电平逻辑0低电平信号类型典型距离应用场景TTL3.3V 或 5V0V单端、正逻辑板内 / 短距离1mMCU 引脚直接输出、开发板串口RS232-3V ~ -15V通常 -12V3V ~ 15V通常 12V单端、负逻辑约 15m老式 PC 串口、工业设备RS485A-B 200mVA-B -200mV差分A/B 双线最远 1200m工业现场总线、多机通信、Modbus1TTL 电平TTL 电平是 MCU 引脚直接输出的电平STM32 的 IO 口通常为 3.3V TTL 电平部分引脚兼容 5V 输入。逻辑上高电平代表 1低电平代表 0是最常见的板内通信电平。3.3V TTL 和 5V TTL 设备互连时需要注意3.3V 设备的 TX 接 5V 设备的 RX 通常没问题3.3V 可被识别为高电平但 5V 设备的 TX 接 3.3V 设备的 RX 可能会烧坏 3.3V 引脚需要电平转换或分压。2RS232 电平RS232 是传统的串行通信标准使用 ±12V 电压且逻辑是反转的负电压代表逻辑 1正电压代表逻辑 0。这与 TTL 电平完全不同因此 TTL 设备与 RS232 设备通信时必须使用电平转换芯片。常用的 TTL 转 RS232 芯片MAX32323.3V 供电、MAX2325V 供电。3RS485 电平RS485 使用差分信号A 线和 B 线通过两根线之间的电压差来表示逻辑 0 和 1具有很强的抗干扰能力支持长距离传输和多设备挂载一条总线上最多可挂 32 个设备。STM32 的 UART 本身不直接输出 RS485 电平需要外接SP3485、MAX485等收发芯片并通过一个 GPIO 控制收发方向DE/RE 引脚。4常见电平转换方案转换方向常用芯片/模块说明TTL ↔ USBCH340、CP2102、PL2303、FT232最常用开发板通过 USB 连接电脑串口助手TTL ↔ RS232MAX3232、MAX232连接老式 PC 串口或 RS232 设备TTL ↔ RS485MAX485、SP3485工业现场总线、长距离通信8、常见问题与调试技巧1串口乱码串口乱码是最常见的问题表现为接收到的字符全是看不懂的符号。按以下顺序排查波特率不匹配确认发送端和接收端的波特率设置完全一致如都是 115200。这是乱码最常见的原因。时钟配置错误STM32 的波特率由系统时钟分频得到如果系统时钟HSE/PLL配置不正确实际波特率会偏离设定值。检查 SystemClock_Config() 配置。电平不匹配确认双方使用相同的电平标准都是 TTL 或经过正确的电平转换。3.3V TTL 直接接 RS232 一定会乱码。接线错误确认 TX 接 RX、RX 接 TX交叉连接GND 必须共地。TX 接 TX、RX 接 RX 会导致完全收不到数据或乱码。数据格式不匹配确认数据位、校验位、停止位设置一致如都是 8N1。2数据丢失或接收不完整溢出错误ORE当接收数据寄存器RDR中的数据还没被读取新的数据又接收到了就会触发溢出错误导致新数据丢失。查询方式下如果 CPU 处理其他任务时间过长来不及读取 DR就会出现这个问题。解决方法在读取 DR 前检查 ORE 标志位如果 ORE1先读 SR 再读 DR 来清除该标志或者提高读取频率避免数据积压。uint8_t USART1_ReceiveByte(void) { // 等待接收数据寄存器非空 while (!(USART1-SR USART_SR_RXNE)); // 检查溢出错误可选 if (USART1-SR USART_SR_ORE) { // 读 SR 再读 DR 清除 ORE 标志 (void)USART1-SR; (void)USART1-DR; } return (uint8_t)(USART1-DR); }3第一个字节发送丢失在初始化 USART 后立即发送第一个字节有时会出现第一个字节丢失的现象。原因是 USART 使能UE1后发送器需要一个时间来完成初始化如果在 TE 置位后立即写 DR第一个字节可能不会被正确发送。解决方法初始化后等待 TC 标志位置 1或者在发送第一个字节前加一个短暂延时。void USART1_Init(void) { // ... 其他初始化代码 ... USART1-CR1 | USART_CR1_UE; // 使能 USART // 等待发送器就绪TC1 表示发送完成空闲状态 while (!(USART1-SR USART_SR_TC)); }4串口助手使用要点端口选择在设备管理器中确认 USB 转串口模块对应的 COM 口号。波特率设置必须与开发板程序中的波特率一致。发送模式ASCII 模式发送文本字符HEX 模式发送十六进制原始数据适合发送二进制协议数据。行结束符发送时可选择追加 \r\n回车换行方便接收端按行解析。时间戳和显示模式调试时建议开启 HEX 显示可以直观看到每个字节的原始值方便判断是乱码还是协议数据。5硬件调试技巧万用表测电平空闲状态下 TX 引脚应为高电平3.3V如果一直是低电平可能是引脚配置错误或硬件损坏。LED 指示在 TX 或 RX 线上串联 LED 和电阻发送/接收数据时 LED 会闪烁可直观判断是否有数据传输。回环测试将开发板的 TX 和 RX 直接短接发送什么就应该收到什么可快速判断串口本身是否正常工作。五、总结本文围绕嵌入式通信特别是 STM32 中的 UART/USART 串口通信系统梳理了从基础概念到实战调试的完整知识链路核心要点如下通信分类通信可按传输介质有线/无线、时钟同步方式同步/异步、数据传输方向单工/半双工/全双工以及数据位传输方式串行/并行等多个维度划分其中串行通信凭借引脚少、抗干扰强的优势已成为现代嵌入式系统的主流。UART 与 USART 的区别UART 仅支持异步通信而 USART 在异步基础上额外支持同步模式提供 SCLK 时钟引脚。实际开发中绝大多数场景使用异步模式此时两者用法完全相同。通信协议要点UART 以数据帧为单位传输包含起始位、数据位、校验位和停止位收发双方必须设置相同的波特率如 115200和数据格式如 8N1否则会导致数据错乱。电平标准常见串口电平标准有 TTL3.3V/5V 正逻辑、RS232±12V 负逻辑和 RS485差分信号不同电平之间互连必须使用对应的转换芯片如 MAX3232、MAX485、CH340 等。调试技巧串口乱码、数据丢失、第一个字节发送丢失等问题通常与波特率、时钟配置、电平匹配、接线方式和数据格式有关可通过回环测试、万用表测电平、LED 指示等方法快速定位。六、参考资料以下资料可帮助读者进一步深入学习 STM32 串口通信与嵌入式开发STM32 参考手册Reference Manual以 STM32F1 系列为例可查阅 RM0008《STM32F101xx、STM32F102xx、STM32F103xx、STM32F105xx 和 STM32F107xx 高级 ARM-based 32 位 MCU 参考手册》其中 USART 章节详细介绍了寄存器、数据帧结构和波特率计算。STM32 数据手册Datasheet对应型号的数据手册如 STM32F103C8T6 数据手册包含引脚定义、电气特性和通信外设资源分配是硬件设计和接线的重要依据。串口调试工具推荐使用 XCOM、SSCOM、PuTTY 等串口调试助手支持 ASCII/HEX 收发、时间戳显示和自动发送便于调试和验证串口通信。官方与社区教程可参考 ST 官方文档与例程STM32Cube 固件包中的 UART/USART 示例以及 CSDN、正点原子、野火等社区发布的 STM32 串口通信实战教程结合实际项目加深理解。
返回列表