一些微控制器如何实现波特率,即使它使用不能扩展到标准波特率的晶体频率?
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,具有量化噪声等所有含义。但是您应该了解总体思路。