51晶振为什么选11.0592MHz,而对ARM没有要求?

晶体0.001%~0.01%的相对误差与波特率4.99%的相对误差相比,晶体误差不是问题。关键在分频系数上。

UART串行通信,接收是从起始位下降沿开始同步的,如果格式为9600,8,N,1的串行通信,共10位,只要第10位的误差不大于半位就行(9.5~10.5)。接收下一个字节时又重新同步,不会有累积误差。

精确每位时间应该是1/9600=0.10417毫秒/位,10位的精确时间是1.0417毫秒,而接收方在接收最后一位可以有半位+-0.05208毫秒的误差,相对误差=0.05208/1.0417=4.99%。也就是说,以9600bps通信时,接收方波特率可以有+-4.99%的误差,接收方波特率从9120~10080范围都可以。而这个波特率是从晶振通过计数器分频得到的。

如果晶体是f=12Mhz/10ppm,它的误差是十万分之一(0.001%),最大频率误差+-120hz。如果晶体是f=12Mhz/100ppm的,它的误差是万分之一(0.01%),最大频率误差+-1200hz。

晶体的万分之一对波特率的百分之4.99,这都不是问题。问题在计数分频器上,分频数值n不一样时,波特率=f/n也不一样,分频后的频率与要求的波特率误差不大于4.99%就可以。

在低波特率时,n值大,分频器每位变化对应的波特率变化间隔小(f/(n*n)),可以保证误差在4.99%以内;而波特率高时,n值小,分频器每位变化对应的波特率变化间隔大(f/(n*n)),可能不会保证误差在4.99%以内。

对于晶振比较低的51单片机,12Mhz,分频系数n比较小,在高波特率时,误差超过了4.99%;选用11.0592Mhz时,可以保证高波特率时误差小于4.99%。(实际是按高波特率误差要求找到11.0592这个数值的);而在9600低波特率时,用12Mhz晶体也没有问题。

而ARM为什么没有要求?因为ARM内部时钟频率高,分频系数大,f/n, 分频器每位变化对应的波特率变化很小,很精细,可以保证高低波特率时误差都小于4.9%。

推荐阅读更多精彩内容