比如STM32H7的串口外设主频配置为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

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

|