前言:
今天自己做了一块STM32F103C8T6的最小系统,在打印数据时出现了单片机端有数据发出,但是在串口助手上无法显示,如果切换为16进制显示则出现00 00 00 的现象。
问题现象:
原因分析:
在解决问题的过程中,我首先查看了一下几点:
- 串口配置的波特率是否和串口接收的波特率对应,只有在对应的情况下才能保证不会出现乱码,这里我使用的波特率是115200;
- 其间我使用了其它的串口助手,出现的现象是相同的;
- 查看时钟树配置正确,且接线无误(GND必须要供起来,作为零点电位参考点);
在解决完成上述检查后我没有发现产生这个现象根本的原因,于是我用上了大家伙——逻辑分析仪
使用逻辑分析捕捉的电平如下:
作为小白的我就第一眼没看出来,我认为它就是一帧一帧的数据发出来的,但是实际上经过细致的观察如下:
首先我们先简要的介绍一个概念波特率:
在串口通信中波特率就是每秒能传输的数据位,9600就是每秒能传输9600位,一个字节有8位,那么,他每秒能传输9600/8个字节
那么我们正常得频率应该为几十KHZ才正常,能对频率产生影响得只有时钟配置和晶振了,我为了确定时钟是否配置正确,拿了一块正常得开发板来测试测试结果如下:
根据上述测测试结果我将目光转移到板子上,只有晶振才会造成这样得影响。
原因分析:
最后的最后,我发现确实时晶振有问题,是晶振电路出现问题了,导致晶振不能正常起振。
最后补充一下晶振两端的电容有什么作用:
晶振负载电容值指的是晶振的交流电路中参与振荡与晶振串联或者并联的负载电容值。晶振的电路频率主要是有晶振自身决定,既然负载电容参与电路振荡,肯定会对频率多少起到微调作用。负载电容值越小,振荡电路就会反而越高。