定时器相关
最近在用 ch552 芯片做 usb 转串口的调试板
串口需要设置波特率,在 ch552 上需要给串口提供设定的波特率,这里使用定时器产生
初值计算问题
一般使用定时器的模式2,8位自动重装,使用 TL 计数,使用 TH 重装
波特率初值的计算公式如下
THn = TLn = 256 - fsys/12/16/波特率/2
ch552 有 1T 的模式,所以可以不用除以 12,还可以设置波特率倍频,也不用除以 2,这样的话,计算公式改为
THn = TLn = 256 - fsys/16/波特率
这里顺便提一下除以 16 的原因。在51单片机内置的串口模块中,他采取的方式是把一位信号采集16次,然后把第7、8、9次取出来,如果这三次中其中有两次是高电平的话,就认定这一位数据是1,如果两次数据是低电平,就认为是0。这样可以提高通信的容错率。【参考来源】
(PS:STC12C5A60S2 的 datasheet 8.2.2 节有更详细的介绍)
波特率误差问题
异步串口有起始和停止位,再加校验位,8位字节最多可有12位。51单片机的串口模块通常在位中间采样,如此12位偏差50%就可能采样错误造成通信失败,对应通信双方波特率偏差约50%/12=4%。
串口通信误码率与通信双方波特率高低无关,不过波特率和通信距离的乘积有上限。