打印
[应用相关]

STM32串口调不通?你可能犯了这5个低级错误

[复制链接]
447|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
paotangsan|  楼主 | 2025-4-19 18:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 的串口(USART/UART)通信是最常用的功能之一,但你是否遇到过这些情况:

波特率配置正确,却什么也收不到?

发送数据后接收端乱码?

用串口助手调试时完全无反应?

下面这5个低级错误,初学者常中招。

1. 波特率设置错误
STM32 的波特率由主时钟决定,如果主时钟配置不当,波特率就可能错得离谱。CubeMX 中配置时钟树时,必须确保 USART 使用的 APB 时钟频率是准确的。

常见误区: 用默认时钟,没配置 HSE/PLL,结果 72MHz 变成了 8MHz,波特率差了9倍,串口助手当然收不到数据。

检查方法:查看 SystemCoreClock 的值,确认主频和外设频率。

2. TX/RX 引脚没配置成复用功能
很多人忘记 STM32 的 GPIO 默认是普通输入输出,要用串口必须配置为复用(Alternate Function)。

在 CubeMX 里你需要:

把 TX 设为 AF_PP(推挽复用输出)

把 RX 设为 Floating Input 或 AF(具体型号略有不同)

检查方法:确认 HAL_GPIO_Init 时用的是 GPIO_MODE_AF_PP 不是 GPIO_MODE_OUTPUT_PP。

3. RX引脚悬空或无上拉
RX 脚未接线或悬空时,逻辑状态可能漂移,引发接收错误或持续中断。

尤其在调试阶段,只接了 TX,RX 口浮空但未禁用接收逻辑,会误触发中断甚至干扰主循环。

建议:空闲RX口加一个10K上拉电阻,避免浮空。

4. 未使能中断 / 缺少回调处理
你在用 HAL 库写串口程序时,别忘了两件事:

是否调用了 __HAL_UART_ENABLE_IT() 开启中断

是否实现了 HAL_UART_RxCpltCallback() 等回调函数

很多人收不到数据,就是因为用的是中断/ DMA 模式,却没有写任何回调处理函数,收进来了但没人处理。

5. 串口调试时“看不到输出”其实是TX FIFO没准备好
STM32发送数据使用 HAL_UART_Transmit(),但它是阻塞式,如果使用不当或者在中断里调用,可能卡死。

而且 TX FIFO 需要准备时间,如果直接连续发送 printf,你看到的就是乱码或丢字节。

建议:使用 HAL_Delay() 模拟间隔,或者使用非阻塞 HAL_UART_Transmit_IT()

总结
STM32 串口调不通,大多数时候不是代码错,而是细节配置出了锅。

务必确认:

波特率和时钟树对应

TX/RX 配置正确

RX不悬空

是否用了正确的 HAL 接口和中断回调

只要排除这些低级错误,串口调试的通畅度会提升一个层级。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/jk5518852/article/details/147149768

使用特权

评论回复
沙发
回复就哭哭| | 2025-4-30 23:47 | 只看该作者
USART 使用的是外设时钟(PCLKx),它受系统主频配置影响。

对于 STM32F1 系列:APB2 控制 USART1,APB1 控制 USART2/3。

如果 APB1 时钟设成了 8MHz,波特率计算就会错。

建议检查:

c
复制
编辑
SystemCoreClock  // 确认主频
HAL_RCC_GetPCLK1Freq()  // USART2/3 使用
HAL_RCC_GetPCLK2Freq()  // USART1 使用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

4229

帖子

0

粉丝