笔者前几天碰到了串口波特率的问题,想要1M以上的波特率,发现波特率总是乱码,常用标准的几种波特率也不是很好用。
1、UART时钟情况说明
ch340G模块,时钟为12MHZ。
某PMC开发板,ARM Coretex A53内核,主频为1.6G,串口时钟为6.25MHZ,理论最大支持2Mbit/s。
该开发板的串口波特率是通过分频而来。
Baud Rate = 625000/(UDLH <<8+UDLL)
2、理论计算
当选择常用的波特率时,开发板分出的波特率时钟的偏差。
波特率 | 总时钟 | 分频系数 | 误差计算 |
---|---|---|---|
115200 | 6250000 | 54 | 0.47% |
128000 | 6250000 | 48 | 1.7% |
230400 | 6250000 | 27 | 0.47% |
256000 | 6250000 | 24 | 1.7% |
468000 | 6250000 | 13 | 4.3% |
512000 | 6250000 | 12 | 1.7% |
921600 | 6250000 | 7 | 3.1% |
1000000 | 6250000 | 6 | 4.1% |
1024000 | 6250000 | 6 | 1.7% |
2000000 | 6250000 | 3 | 4.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/12MHZ | 9600 | 1152/1250 | 0%/0% |
11.0592MHZ/12MHZ | 115200 | 96/104 | 0%/0.16% |
11.0592MHZ/12MHZ | 230400 | 48/52 | 0%/0.16% |
11.0592MHZ/12MHZ | 256000 | 43/47 | 0.47%/0.26% |
11.0592MHZ/12MHZ | 460800 | 24/26 | 0%/0.16% |
11.0592MHZ/12MHZ | 921600 | 12/13 | 0%/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、波特率以及比特率的理解增加