本帖最后由 lvben5d 于 2023-2-26 18:31 编辑
首先主频16M 不要去降频应用 毕竟指令是4个时钟周期执行1个,很多都是双周期指令呢。且计算波特率的时候 在分子哟。 分频因子 选高速模式下 m =4 这样 16 000 000/4 = 4000 000 /19200 =》 208 = (EUBRGL1 +1)
寄存器值EUBRGL1
18348 == 217 -4.43%
18518 == 216 -3.99%
18518 == 215 -3.55%
18604 == 214 -3.1% 29.0
18691 == 213 -2.65% 24.8
18779 == 212 -2.19% 20.5
18867 == 211 -1.73% 16.2
18957 == 210 -1.26% 11.8
19047 == 209 -0.79% 7.4
19138 == 208 - 0.32% 3
19200 == 0%
19230 == 207 +0.15%
19323 == 206 +0.64%
19417 == 205 +1.13%
理论19200 9bit 是937次计数值 (我是0.5us计数一次)
if(Checksum > 937)
{ //说明此时晶振比16M主频 要快一点 计数数值才大于937 所以定时器的数值在19200波特率下 Tbit大于52us
differ = Checksum - 937;
if(differ < 2) //0 1
{
EUBRGL1 = 207;
}
if(differ < 6) //3 4 5 -0.32%以内误差
{
EUBRGL1 = 208;
}
else if(differ < 10) //6 7 8 9 -0.79%以内误差
{
EUBRGL1 = 209;
}
else if(differ < 14) //10 11 12 13 -1.26%以内误差
{
EUBRGL1 = 210;
}
else if(differ < 19) // 14 15 16 17 18 -1.73%以内误差
{
EUBRGL1 = 211;
}
else if(differ < 23) //19 20 21 22 -2.19%以内误差
{
EUBRGL1 = 212;
}
else if(differ < 27) //23 24 25 26 -2.65%以内误差
{
EUBRGL1 = 213;
}
else if(differ < 32) // 27 28 29 30 31 3.1%以内误差
{
EUBRGL1 = 214;
}
else if(differ < 34) //3.55%以内误差
{
EUBRGL1 = 215;
}
else if(differ < 38) //3.99%以内误差
{
EUBRGL1 = 216;
}
else if(differ < 42) //4.43%以内误差
{
EUBRGL1 = 217;
}
}
else {
differ = 937 - Checksum ;
if(differ < 4)
{
}
}
备注:不要用官网PDF手册的办法走不通(测试过误差太大), 我是利用break帧中断 检测到break帧之后,开定时器检测0x55的5个上升沿来推算晶振误差!并进行误差修正
|