硬汉嵌入式论坛

 找回密码
 立即注册
查看: 845|回复: 4
收起左侧

[UART] STM32H7串口在8倍过采样和16倍过采样下,各种常用波特率误差和实际速度

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-11-11 00:39:30 | 显示全部楼层 |阅读模式
串口外设主频配置为100MHz。

LUA代码:

[Lua] 纯文本查看 复制代码
BspArray = 
{
	110,
	300,
	600,
	1200,
	2400,
	4800,
	9600,
	19200,
	38400,
	57600,
	115200,
	128000,
	230400,
	256000,
	460800,
	500000,
	512000,
	600000,
	750000,
	921600,
	1000000,
	1152000,
	1500000,
	2000000,
	2500000,
	3000000
}

Fclk = 100000000  -- 用户设置串口外设主频
OVER8 = 0         -- 0表示16过采样,1表示8倍过采样

print("所需波特率    实际值波特率    误差     BRR寄存器数值")

for i=1, #BspArray, 1 do

	Bsp = BspArray[i]

	if(OVER8 == 0) then

		UARRTDIV = Fclk/Bsp

		mantissa = (UARRTDIV + 0.5)//1
		
		Bsp1 = Fclk/mantissa

		str = string.format("%-13d %-13.4f %7.4f%%   %-.4f = 0x%08x",
								Bsp, Bsp1, (Bsp1-Bsp)/Bsp*100, mantissa, mantissa)
		print(str)
	else

		UARRTDIV = 2*Fclk/Bsp

		mantissa = (UARRTDIV + 0.5)//1

		mantissa = mantissa & 0xfff0
		fraction = mantissa & 0x0f
		fraction = fraction >> 1

		Bsp1 = 2*Fclk/(mantissa+fraction)

		str = string.format("%-13d %-13.4f %7.4f%%   %-.4f=0x%08x",
								Bsp, Bsp1, (Bsp1-Bsp)/Bsp*100, mantissa+fraction, mantissa+fraction)
		print(str)
	end
end


16过采样的误差率和实际速度如下 :

[C] 纯文本查看 复制代码
所需波特率    实际值波特率    误差     BRR寄存器数值
110           110.0000      -0.0000%   909091.0000 = 0x000ddf23
300           300.0003       0.0001%   333333.0000 = 0x00051615
600           599.9988      -0.0002%   166667.0000 = 0x00028b0b
1200          1200.0048      0.0004%   83333.0000 = 0x00014585
2400          2399.9808     -0.0008%   41667.0000 = 0x0000a2c3
4800          4800.0768      0.0016%   20833.0000 = 0x00005161
9600          9599.6928     -0.0032%   10417.0000 = 0x000028b1
19200         19201.2289     0.0064%   5208.0000 = 0x00001458
38400         38402.4578     0.0064%   2604.0000 = 0x00000a2c
57600         57603.6866     0.0064%   1736.0000 = 0x000006c8
115200        115207.3733    0.0064%   868.0000 = 0x00000364
128000        128040.9731    0.0320%   781.0000 = 0x0000030d
230400        230414.7465    0.0064%   434.0000 = 0x000001b2
256000        255754.4757   -0.0959%   391.0000 = 0x00000187
460800        460829.4931    0.0064%   217.0000 = 0x000000d9
500000        500000.0000    0.0000%   200.0000 = 0x000000c8
512000        512820.5128    0.1603%   195.0000 = 0x000000c3
600000        598802.3952   -0.1996%   167.0000 = 0x000000a7
750000        751879.6992    0.2506%   133.0000 = 0x00000085
921600        917431.1927   -0.4523%   109.0000 = 0x0000006d
1000000       1000000.0000   0.0000%   100.0000 = 0x00000064
1152000       1149425.2874  -0.2235%   87.0000 = 0x00000057
1500000       1492537.3134  -0.4975%   67.0000 = 0x00000043
2000000       2000000.0000   0.0000%   50.0000 = 0x00000032
2500000       2500000.0000   0.0000%   40.0000 = 0x00000028
3000000       3030303.0303   1.0101%   33.0000 = 0x00000021


1.png

8过采样的误差率和实际速度如下 :

[C] 纯文本查看 复制代码
所需波特率    实际值波特率    误差     BRR寄存器数值
110           4106.4389     3633.1263%   48704.0000=0x0000be40
300           17705.3824    5801.7941%   11296.0000=0x00002c20
600           35410.7649    5801.7941%   5648.0000=0x00001610
1200          5620.5036     368.3753%   35584.0000=0x00008b00
2400          11241.0072    368.3753%   17792.0000=0x00004580
4800          4800.3072      0.0064%   41664.0000=0x0000a2c0
9600          9600.6144      0.0064%   20832.0000=0x00005160
19200         19201.2289     0.0064%   10416.0000=0x000028b0
38400         38461.5385     0.1603%   5200.0000=0x00001450
57600         57603.6866     0.0064%   3472.0000=0x00000d90
115200        115740.7407    0.4694%   1728.0000=0x000006c0
128000        128865.9794    0.6765%   1552.0000=0x00000610
230400        231481.4815    0.4694%   864.0000=0x00000360
256000        260416.6667    1.7253%   768.0000=0x00000300
460800        462962.9630    0.4694%   432.0000=0x000001b0
500000        500000.0000    0.0000%   400.0000=0x00000190
512000        520833.3333    1.7253%   384.0000=0x00000180
600000        625000.0000    4.1667%   320.0000=0x00000140
750000        781250.0000    4.1667%   256.0000=0x00000100
921600        961538.4615    4.3336%   208.0000=0x000000d0
1000000       1041666.6667   4.1667%   192.0000=0x000000c0
1152000       1250000.0000   8.5069%   160.0000=0x000000a0
1500000       1562500.0000   4.1667%   128.0000=0x00000080
2000000       2083333.3333   4.1667%   96.0000=0x00000060
2500000       2500000.0000   0.0000%   80.0000=0x00000050
3000000       3125000.0000   4.1667%   64.0000=0x00000040


2.png
回复

使用道具 举报

4

主题

14

回帖

26

积分

新手上路

积分
26
发表于 2024-1-23 18:32:39 | 显示全部楼层
请问这个485 最快能使得传输速率大于等于10M 吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2024-1-24 08:48:32 | 显示全部楼层
VDVA 发表于 2024-1-23 18:32
请问这个485 最快能使得传输速率大于等于10M 吗

不行,10M的485要通信起来,对布线和各种设计要求很高。之前实测过。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-3-17 02:01:21 来自手机 | 显示全部楼层
如果两个串口同时都在收发数据,那么总有一个串口的接收长度容易不对(空闲中断dma),换成收一发一就没有问题,请问这种现象要怎么去解释呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
 楼主| 发表于 2024-3-18 08:06:41 | 显示全部楼层
whiteNight 发表于 2024-3-17 02:01
如果两个串口同时都在收发数据,那么总有一个串口的接收长度容易不对(空闲中断dma),换成收一发一就没有 ...

如果是H7系列,考虑用超时接收。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 21:43 , Processed in 0.233001 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表