电路板上经常要用到32.768KHz的晶振,表示晶振经过32768K个周期就是1s,16进制就是0x8000,是2的n次方形式,2^15。
这颗料已经出现了20年,非常普遍,也非常便宜,在各种电路中使用。
频率越低,消耗电流越低,这样手表等靠电池供电的产品就更省电。同时要兼顾频率越低误差越大的因素,还有生产工艺,频率越低的话,可能物料体积越大。
而我们还有经常使用的晶振物料,比如7.3728MHz。这个是因为经常使用的通信波特率的原因。
7.3728MHz/64 = 115200
而这个115200,就是我们平时使用串行通讯,比如UART等总线传输数据的频率。
这个波特率最早来自电报(teletypes),开始波特率是75,然后逐渐增加,每次翻倍,有时还会是1.5倍,比如28800,直到达到电话线的调制解调器modem已经无法支持的速度。所以后来的晶振也会根据这些波特率的使用,所沿用同样的标准。
在波特码(baudot code)中,通信标准是一个起始位,五个数据位和一个半停止位。后来5位的波特代码被搁置,一个新的8位码被开发出来,这就是ASCII的来源。
在Windows中使用的RealTerm中,一个免费的Windows下的终端程序,里面列出的UART的波特率如下:110, 150, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600。110的波特率使用的是8-level的电报类型比如ASR-33,150的波特率是75的2倍,常常和60波特率一起使用的是5-level的TTY。最初电话线调制解调器的标准是300bps。同时出现了每秒传送30个字符的终端。但bps和波特率是不同的。比如1200bps的调制解调器实际上使用的是600的波特率,4800bps调制解调器是哦那个的是1600的波特率。56K的猫用的是8000的波特率。这种差异是因为除了使用每秒一定数量的音调脉冲(tone pulses)外,还使用相移键控(phase-shift keying)和其他方法从相同的波特率中提取额外的带宽,以获得越来越高的bps。
正如你所看到的,UART速率的列表基本上从75开始,不断翻倍(跳过600),直到达到38400,然后乘以1.5,得到57600。而56K bps是模拟电话线的极限。更高的速率115200以上(再次从57600开始翻倍)用于硬线连接。14400和28800 bps是在当时调制解调器速度不能翻倍的情况下作为1.5 x 9600和1.5 x 19200推出的,但现在很少使用。
IBM PC的8250 UART,这个设备现在还是使用广泛,在Linux kernel中就能看到,路径是drivers\tty\serial\8250。而最开始,这个就是用的1.8432MHz的晶振时钟,然后再分频产生内部时钟,然后16个周期处理一个bit,如果不分频就是1.8432MHz/16 = 115200,如果分频1/2,就是57600波特率。这个晶振频率就是上面7.3728的1/4。
长期以来,使用115,200或其因子进行通信是很常见的,比如除以3就是38,400,还可以用38400的2次方,或者是除以2的57,600。大多数PC硬件支持这些速率。有些PC硬件可以支持230,400或460,800。请注意,许多嵌入式控制器喜欢的数据速率是其自身时钟速度的因子,一些USB-to-serial芯片可以支持3,000,000bps的任何整数分频,因此通过USB芯片连接到PC就会使用像1,000,000bps或1,500,000bps这样的速度。
不过现在UART通讯中是可以使用更高的波特率的,比如FTDI的芯片就支持3M的波特率,这个也和设备自身的时钟周期有关,以及另外一边的终端要支持。
参考:
What standard UART rates are there? - Electrical Engineering Stack Exchange