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
|