eric2013 发表于 2023-11-11 00:39:30

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

串口外设主频配置为100MHz。

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

        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过采样的误差率和实际速度如下 :

所需波特率    实际值波特率    误差   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




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

所需波特率    实际值波特率    误差   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


VDVA 发表于 2024-1-23 18:32:39

请问这个485 最快能使得传输速率大于等于10M 吗

eric2013 发表于 2024-1-24 08:48:32

VDVA 发表于 2024-1-23 18:32
请问这个485 最快能使得传输速率大于等于10M 吗

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

whiteNight 发表于 2024-3-17 02:01:21

如果两个串口同时都在收发数据,那么总有一个串口的接收长度容易不对(空闲中断dma),换成收一发一就没有问题,请问这种现象要怎么去解释呢?

eric2013 发表于 2024-3-18 08:06:41

whiteNight 发表于 2024-3-17 02:01
如果两个串口同时都在收发数据,那么总有一个串口的接收长度容易不对(空闲中断dma),换成收一发一就没有 ...

如果是H7系列,考虑用超时接收。
页: [1]
查看完整版本: STM32H7串口在8倍过采样和16倍过采样下,各种常用波特率误差和实际速度