1 问题描述在项目开发过程中,遇到了串口发送数据乱码,串口中配置的的波特率是115200,无意间把波特率设置为115200的0.5倍即57600,发现数据是正常的。同时采集了通信过程中的波形,波特率确实降低了一半。 2 分析过程重新检查硬件电路,分析驱动库中关于串口波特率的配置代码,总结如下: 2.1 硬件电路检查1、项目中使用的是16MHz的晶振,并不是8MHz晶振 2.2 代码检查2.2.1 依据串口实际的时钟计算波特率
2.2.2 依据串口挂接在哪个总线上、结合总线分频系数获取串口实际的频率从系统框图来看,USART1是挂接在APB2总线上,其它的USART是挂接在APB1总线上, 因此可以和驱动库的代码对应上。
2.2.3 依据AHB总线时钟的频率及对APB1、APB2的分频系数计算系统APB1、APB2的频率数值
2.2.4 依据分配系数,计算AHB总线时钟的频率
2.2.5 依据时钟源中的宏定义数值、PLL倍频系数计算系统时钟的频率,该项目使用了外部晶振作为时钟源,使用PLLCLK作为系统时钟。
由于项目使用的是16MHz的晶振,因此在此处修改晶振的宏定义数值可以正确的配置串口的波特率。
3 总结虽然我们换了晶振,调整PLL倍频系数,可以正确的配置系统时钟,但是函数中获取系统时钟数值、串口驱动函数中计算波特率的方式是基于HSE的宏定义的数值来计算的,在更换晶振时,同时需要调整HSE的宏定义。
|