UART 波特率选择的认识与理解

笔者前几天碰到了串口波特率的问题,想要1M以上的波特率,发现波特率总是乱码,常用标准的几种波特率也不是很好用。

1、UART时钟情况说明

ch340G模块,时钟为12MHZ。
在这里插入图片描述

某PMC开发板,ARM Coretex A53内核,主频为1.6G,串口时钟为6.25MHZ,理论最大支持2Mbit/s。
该开发板的串口波特率是通过分频而来。

Baud Rate = 625000/(UDLH <<8+UDLL)
在这里插入图片描述

2、理论计算

当选择常用的波特率时,开发板分出的波特率时钟的偏差

波特率总时钟分频系数误差计算
1152006250000540.47%
1280006250000481.7%
2304006250000270.47%
2560006250000241.7%
4680006250000134.3%
5120006250000121.7%
921600625000073.1%
1000000625000064.1%
1024000625000061.7%
2000000625000034.1%

波特率误差计算说明:由于波特率是由总时钟分频而来,所以分频系数必须是整数。(由上面寄存器可知,总不能向寄存器写入小数吧)

误差率 = (总时钟/分频系数 – 波特率)/波特率。 分频系数 = int(总时钟/波特率)。最好取4舍5入,可以减少误差。

选择上述的波特率范围原因是:串口转USB的模块支持上述波特率,

正常波特率的接收误差范围要小于2%,为了稳定通信要小于1%,(因为)且当前串口线较长,超过15cm

3、实际测试

双方通信测试(乱码测试),基于CH340测试。
921600 测试乱码
1000000 测试乱码
1024000 测试乱码 (256000*4)
2000000 测试乱码

示波器采用KeySight(是德MSO X3054T),带宽为500MHZ,采样率5GSa/s,
在这里插入图片描述

对于板子的时钟,是否与实际的符合也做了测试。
发送和接收均是针对Host端来说的。
频率的抓取位置均是通过示波器自动完成的。
(1)115200波特率的测试抓取。(发送)
在这里插入图片描述

115200波特率的测试抓取。(接收)
在这里插入图片描述

6250000/54 = 115740HZ,和抓到的波形频率一致。
(2)1562500波特率测试(6250000/4 = 1562500 恰好整除)(接收,即开发板生成)
在这里插入图片描述

串口工具设置的频率若为1562500,(发送),选择那种可以自己设置波特率的串口工具。
比如Mobaxterm以及SecureCRT。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

抓取的发送频率为:1.4966MHZ,误差率为:4.2%.
两个波特率的测试,基本可以确定开发板的波特率总时钟是OK的。
但是无法支持1M以上的波特率。

4、最大波特率问题

不太好确定双方都支持的最大波特率。即双方的波特率目前512000(误差率低于2%,可能误码率交高)是找到最大的且符合误差范围的波特率值。

  • 串口工具上常见的波特率,512000之上的开发板都不支持,即计算出来的误差率较高。
  • 1024000波特率是因为串口模块支持能力有限,虽然说得支持2MHz,但是实际测试下来误差较大。
    (CH340G与PL2302 在相同波特率下(1M以上)测试,无法正常通信)。
  • 其实我们经常看到51单片机或者串口模块的晶振选择11.05625MHZ,其实原因是特定晶振分出的串口波特率时钟偏差小。

由下表可以看到11.0592MHZ的时钟偏差比12MHZ要小。

时钟波特率分频系数误差
11.0592MHZ/12MHZ96001152/12500%/0%
11.0592MHZ/12MHZ11520096/1040%/0.16%
11.0592MHZ/12MHZ23040048/520%/0.16%
11.0592MHZ/12MHZ25600043/470.47%/0.26%
11.0592MHZ/12MHZ46080024/260%/0.16%
11.0592MHZ/12MHZ92160012/130%/0.16%

假如我们不选择这种串口模块,其实可以配置成任意的波特率,只要符合一定范围内的误差就行。

5、波特率提高

再选择另外一种串口模块之后(CMSIS DAPLink 支持虚拟串口),波特率在1.5625Mhz可以成功通信。因为开发板4分频正好为1.5625Mhz。
发送时钟频率(串口模块)
在这里插入图片描述
接收时钟频率(开发板发送时钟频率,相对概念)
在这里插入图片描述
误差计算为:0.064%,符合范围,可以正常通信。
在这里插入图片描述

6、总结

0、发送乱码原因:模块支持M级别波特率的问题。 1、选择常用固定的波特率是因为:ch340或者其他模块的时钟可以对这些常见波特率进行整分频。 2、发现PL2302和CH340G在1M以上的波特率无法通信。 3、如果需要较高的波特率(比如1M以上),需要看看模块是否满足,可以通过示波器来看,计算一下误差 4、选择用一些可以自己设置波特率的串口工具,比如SecureCRT、Mobaxterm等。 5、下次测试一下STM32的波特率支持情况 6、波特率以及比特率的理解增加