嵌入式 - 晶振频率的来源和UART波特率的选择

本文探讨了UART通讯中常用晶振频率的选择原因,特别是32.768KHz和7.3728MHz的晶振。解释了这些频率如何与波特率如115200bps相关联,并回顾了波特率的历史演变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电路板上经常要用到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的波特率,这个也和设备自身的时钟周期有关,以及另外一边的终端要支持。

参考:

Why 32.768KHz? | Microchip

What standard UART rates are there? - Electrical Engineering Stack Exchange

FTDI Knowledgebase

### 回答1: GD32是一款单片机芯片,支持CAN通信协议。而CAN通信需要设置波特率才能实现数据传输,因此需要对GD32进行波特率计算。 首先,波特率是指数据传输时每秒钟传输的位数。在CAN通信中,波特率的计算需要考虑以下几个因素: 1. Tq:CAN通信周期的时间,通常是由时间触发器提供的,可通过预设分频系数调整周期长度。 2. Bit time:每个传输单位的时间,可通过时序控制器进行设置,通常由同步段、传输段重复段组成。 3. Sync Seg:同步段的长度,通常是Bit time的1/4到1/8。 4. Prop Seg:传输段的长度,表示在信号从发射器传输到接收器时的时延,通常为1-8个Tq。 5. Phase Seg1:第一重传输段的长度,通常为1-8个Tq。 6. Phase Seg2:第二重传输段的长度,通常为1-8个Tq。 根据上述参数,GD32的CAN波特率计算公式为: 波特率 = 时钟频率 / (Tq x (Sync Seg + Prop Seg + Phase Seg1 + Phase Seg2 + 1)) 其中,时钟频率指GD32的主频,Sync Seg、Prop Seg、Phase Seg1Phase Seg2为通过寄存器设置的参数,Tq为CAN周期的时长。在实际应用中,可以根据需要调整参数值,以满足不同的波特率需求。 总结来说,GD32的CAN波特率计算需要考虑多个参数,其中包括时钟频率、CAN周期时长各个传输段的长度等。通过设置这些参数,可以实现不同波特率的CAN数据传输。 ### 回答2: GD32是一种微控制器芯片系列,它支持CAN总线通信协议。在使用GD32进行CAN总线通信时,需要设置正确的波特率来保证正常的数据传输。一般来讲,GD32支持的CAN波特率范围为1Mbps到125Kbps。如果需要计算具体的波特率数值,可以使用以下公式: CAN波特率 = 系统时钟频率 / (分频器系数 * (时间段1 + 时间段2 + 1)) 其中,系统时钟频率是GD32的主时钟频率,分频器系数可以设定为1到1024之间的整数,时间段1时间段2分别表示CAN总线的两个时间段,它们的值也可以设定为1到16之间的整数。 具体地,可以通过以下步骤来计算GD32的CAN波特率: 1. 确定系统时钟频率。在GD32的时钟配置中,可以设置CPU时钟频率、AHB总线时钟频率APB总线时钟频率。需要根据具体的需求来选择合适的时钟频率。 2. 选择合适的分频器系数。GD32的CAN模块支持的分频器系数为1到1024之间的整数,选择哪一个分频器系数,可以根据需要得到的波特率范围来决定。一般来说,分频器系数越小,得到的波特率就越高。 3. 设定时间段1时间段2的值。时间段1时间段2的值决定了CAN总线的两个时间段的长度,一般来说,这两个值要尽量相等,可以设定为1到16之间的整数。 通过以上步骤,可以得到一个合适的CAN波特率。在设置CAN模块的波特率时,需要把计算出的数值配置到相应的寄存器中,以确保CAN总线的正常通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值