USART-CH32FV1x_2x_V3x--串口波特率误差分析及计算
串口通讯波特率出现误差的因素
串口通讯是一种异步通讯,收发双方需要按照约定的波特率进行通讯。当波特率出现误差时,在一些高精度要求场所可能会导致通讯出错。
那导致波特率出现误差的因素都有哪些呢,今天就来分析一下。
1.分频误差
首先,波特率是根据系统时钟分频产生的,而系统时钟和波特率可能不是整数倍的关系,所以分频时也会产生误差。但是目前大部分MCU的系统时钟比较高,
一般都在几十M甚至几百M,远远大于串口通讯波特率,所以这个误差影响很小。那么这个误差具体该怎么计算呢,我们可以看下手册。
根据手册,假设我们波特率为230400,串口时钟为36M,那么我们算得USARTDIV=9.765625,我们发现小数部分0.765625*16=12.25,取最接近整数的那就
是12,后12/16=0.75,那么正常填入波特率寄存器的值为9.75而不是9.765635,后我们根据9.75反推波特率的值,36M/(9.75*16)=230769,那么我们误差这时
就算出来了,(230769-230400)/230400=0.16%。同时计算时有些特殊结果需要注意,如要求 USARTDIV = 50.99
就有:
DIV_Fraction = 16*0.99 = 15.84
最接近的整数是: 16 = 0x10 => DIV_frac[3:0]溢出 => 这时进位就必须加到小数部分了
于是: USART_BRR = 0x330, USARTDIV=51,那么我们这时就该以51来反推实际波特率是多少了!
2.时钟误差
时钟误差也是必须考虑到的,如果采用内部时钟,温度对于内部时钟的稳定性影响肯定是大于外部时钟的,所以如果对此要求高,采用外部时钟是有必
要的。串口通讯由起始位、数据位、校验位、停止位组成。以常见的8N1为例,即1位起始位,8位数据位,无校验,1位停止位。也就是说传输一个字节需
要10bits。每一个字节都有一个起始位做同步,所以误差只会在一个字节内累计。 不难看出,在最后一个位采样时,误差最大,允许极限误差为0.5位。按照
每个字节10位计算,最大允许误差为±0.5/10=±0.05,即±5%。考虑到串口通讯涉及收发两端,两端都可能存在误差,所以,每端的误差最好控制在±2.5%以
内。 当数据位、校验位等较多时,要求的时钟误差就更高一些。考虑到上面所说的分频误差,一般来说,当时钟误差小于±2%时,串口通信是比较可靠的。
经验:
之前在与一个客户合作的一个项目中,由于他们合作方采用了一个低速光耦,导致串口波形失真严重,从而我们芯片无法准确采样到,但逻辑分析仪确是可以准
确分析出来,当然这个不能怪芯片原因,因为毕竟两者的采样规律可能是不同的。所以最后我们采用了模拟串口的方法,这样采样点我们可以自定义,这时直接
模拟分析仪的采样点就可以准确分析出来了!