当前位置: 代码迷 >> 综合 >> UART 波特率选择的认识与理解
  详细解决方案

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

热度:74   发布时间:2023-09-22 07:54:55.0

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

1、UART时钟情况说明

ch340G模块,时钟为12MHZ。
UART 波特率选择的认识与理解

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

Baud Rate = 625000/(UDLH <<8+UDLL)
UART 波特率选择的认识与理解

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,
UART 波特率选择的认识与理解

对于板子的时钟,是否与实际的符合也做了测试。
发送和接收均是针对Host端来说的。
频率的抓取位置均是通过示波器自动完成的。
(1)115200波特率的测试抓取。(发送)
UART 波特率选择的认识与理解

115200波特率的测试抓取。(接收)
UART 波特率选择的认识与理解

6250000/54 = 115740HZ,和抓到的波形频率一致。
(2)1562500波特率测试(6250000/4 = 1562500 恰好整除)(接收,即开发板生成)
UART 波特率选择的认识与理解

串口工具设置的频率若为1562500,(发送),选择那种可以自己设置波特率的串口工具。
比如Mobaxterm以及SecureCRT。
UART 波特率选择的认识与理解
UART 波特率选择的认识与理解

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

抓取的发送频率为: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。
发送时钟频率(串口模块)
UART 波特率选择的认识与理解
接收时钟频率(开发板发送时钟频率,相对概念)
UART 波特率选择的认识与理解
误差计算为:0.064%,符合范围,可以正常通信。
UART 波特率选择的认识与理解

6、总结

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