一些微控制器如何实现波特率,即使它使用不能扩展到标准波特率的晶体频率?

电器工程 波特率
2022-01-08 08:44:02

我刚刚意识到8051系列使用 11.0592 MHz 及其倍数来生成标准波特率。但是有些SoC使用 15 MHz。那他们是怎么做到的呢?

4个回答

UART 并不关心,只要它相当准确。

\$\frac{15000000}{230400}\约65\$

\$65\cdot230400=14976000\$

因此,您的 UART 会以 \$\frac{15000}{14976}\approx1.002204\$ 的因子太快。当跨 11 位的时间偏移超过半位时,在 \$1+\frac{1}{2\cdot11}\approx1.045\$ 处就会出现问题。

这是相对高端的 ARM MCU 的“大字”功能描述。

在此处输入图像描述

有许多带有预分频器和后分频器的 PLL 和分频器能够创建几乎任何您可能需要的整数比率频率。PLL 将其输入频率乘以某个整数,而分频器可以除以某个数字(在每种情况下不一定是 2 的幂)。

内部相对较高的频率(在这种情况下约为半 GHz)不是问题(如果不在芯片上就会出现问题) - 消耗的功率相对较少。

仅以 2 的幂进行除法的日子在很久以前就结束了,现在 PLL 已得到普遍应用,我们几乎不必担心确切的晶体频率。另一方面,对于多个内部总线时钟、USB、以太网、UART 等外围设备,我们可能需要许多不同的时钟频率。

如果您想了解更多有关这些工作原理的信息,您可以研究一些相对简单的专用时钟合成芯片(尽管仍然足够复杂,以至于一些制造商提供软件来计算设置常数)。

这可以使用调制器来实现。

例如,参见MSP430x1xx 用户指南在第 260 页上它说:

USART 波特率发生器能够从非标准源频率产生标准波特率。波特率发生器使用一个预分频器/分频器和一个调制器,如图 13-7 所示。这种组合支持波特率生成的小数除数。

波特率定时

(注意灰色区域)

除法因子N通常是一个非整数值,其整数部分可以通过预分频器/除法器实现。波特率发生器的第二级,调制器,用于尽可能接近小数部分。

[...]

当需要非整数除数时,可以使用调制器逐位调整 BITCLK 以满足时序要求。如果调制器位 mi 置位,则每个位的时序扩展一个 BRCLK 时钟周期。每次接收或发送一个位时,调制控制寄存器中的下一位确定该位的时序。设置的调制位将分频因子增加一,而清除的调制位保持由 UxBR 给出的分频因子

[...]

很多人认为 UART 实际上是在固定时钟上运行的,即您每 \$ T \$ 秒采样一次。这不一定是真的。至少不是在我设计的所有 UART 模块中。

它的工作方式是你有一个内部采样时钟。假设您可以每 100ns 采样一次。你知道每一位的中间在哪里。因此,您选择一个最接近中间的采样点。这最多会给你 50ns 的误差。

会发生什么是您收到起始位。然后,您确定位的中间位置,即您的参考点。然后,您就知道需要等待多长时间才能对下一位进行采样。因此,您加载一个计数器,并在它重置您的样本时。现在,您最多将关闭快速内部时钟的 1 个时钟周期,但在大多数情况下,这是纳秒。此外,你知道你有多少。对于下一位,您使用不同的值加载计数器,因此您尽可能靠近中间,依此类推。

在实际系统中,还会发生很多其他事情。例如,您不采集一个样本,您可以采集几个样本并对它们进行一些处理等。实际上它是一个 1 位 ADC,具有量化噪声等所有含义。但是您应该了解总体思路。