1 背景
芯片型号:STM32F103C8T6
应用类型:普通UART应用
错误现象:配置9600波特率正常,当配置115200时出现第一个字符乱码
2 场景描述
使用STM32的USART1做一个简单的RS485应用时,使用了内部8M时钟,经过PLL倍频到48M(倍频到64M后,芯片会出现死机现象,无解),然后经过1分频后给AHB2提供时钟,因为USART1是属于AHB2的外设。后使用USART1,先是配置USART1的波特率为9600,收发正常,后又将比特率设置为115200,这时候在串口助手上接收的第一个字节出现乱码现象,且出现跳动,这时就非常无解。
3 分析原因
UART波特率出现乱码的原因其实很简单就能推算出来:
①时钟配置错误
②波特率寄存器配置错误
③一些硬件问题
根据上面的三个方向,我就开始了漫长的推断,一开始我以为是因为使用了内部时钟的问题或者波特率设置的问题,导致了不稳定,但是又很快被我pass了,如果是时钟或者配置的问题,那为什么只有第一个字节出现了问题,其他字节却非常稳定呢,这就非常诡异,后来我又把问题锁定在了第三个问题,于是我抓了一下波形,结果波形稳如狗,雷打不动的那种稳,what fuck!!!
4 解决方案
研究了一下午,我快对自己的代码还有芯片产生怀疑了,就在这时,有人注意到了我的USB转485模块是那种有隔离的功能,所以就怀疑是不是这个玩意的隔离响应不行,后来就将这个USB转485换成普通的,结果完美。。。What Fuck!!!这个USB转485模块我以前用了很久,没有问题啊,怎么突然就出问题了,这是怎么回事呢。。。后来。。。我们又注意到了我们的应用上也使用了485隔离芯片,真相若隐若现。。。
盲猜:两个隔离模块加在一起出现了不可估计的影响,具体是怎么影响的,就没有过多去追究了。
教训:作为一个合格的程序员请相信自己的代码!!!
END