我将使用 8 MHz 晶体以 16 MIPS(PLL 4x,2 个周期指令)运行我的微控制器。但是,8 MHz 不会划分为任何 UART 频率 AFAIK ......那么这些频率有多重要?我计划使用 115,200 波特。
UART可以在±1%以内运行吗?如果这不起作用,我应该使用什么频率?(我希望尽可能接近 16 MIPS,以获得最大的处理速度。)如果重要,我使用的是 PIC24FJ64GA004。
我将使用 8 MHz 晶体以 16 MIPS(PLL 4x,2 个周期指令)运行我的微控制器。但是,8 MHz 不会划分为任何 UART 频率 AFAIK ......那么这些频率有多重要?我计划使用 115,200 波特。
UART可以在±1%以内运行吗?如果这不起作用,我应该使用什么频率?(我希望尽可能接近 16 MIPS,以获得最大的处理速度。)如果重要,我使用的是 PIC24FJ64GA004。
如果你在 1% 以内,你应该没问题。
假设您的 UART 使用 16x 过采样时钟,例如,您可以将其设置为 1,843,200 Hz 到 16x 过采样 115,200 bps。(像这样的过采样相当普遍)这让 UART 从起始位的下降沿开始计数 8 个超频,因此它可以将位单元的中心定位在超频的 +/- 一个周期内,之后它计算 16 个超频周期以确定何时采样数据。
如果您假设它可以到达起始位的中心,那么为了在 8 个数据位上保持正确位单元中的串行数据采样,时钟频率必须保持在 (8-0.5)/8 和 (8+0.5) 之间)/8,或预期比特率的 +/-6.25%。更高的超频更接近达到起始位中心的理想状态,但 8x 或 16x 通常足够接近,您可以假设 5% 的不匹配会起作用。
然而,你不能指望对方在频率上是完美的。如果您将速度快 4% 的设备连接到速度慢 4% 的设备,您就会遇到问题。我遇到过至少一种情况,一台 PC 运行速度有点慢,而一台设备运行速度有点快,两者只能进行少量通信,尽管同一设备与其他 PC 兼容,而 PC 与其他 PC 运行良好设备。(O-scoped 这些大约为 112kbps 和 119kbps)因此,最好尝试尽可能接近标称频率。我从来没有见过标称值 2% 以内的任何东西有问题。
通常要做的事情是使用一个主时钟速率,它提供预期 UART 过采样速率乘以波特率的整数倍。例如,如果您希望 CPU 运行在 8MHz 左右,您可以使用 7.3728MHz 的振荡器,可以将其除以 4 得到 1.8432MHz,恰好是 115200 的 16 倍。
@JustJeff 提到的 1% 不是必需的。大多数 UART 允许在最后一位出现半位错误。大多数情况下,一帧由 1 个起始位、8 个数据位和 1 个停止位组成,总共 10 个位。10 位的半位是 5%(JustJeff 的 6.25% 不考虑开始位和停止位)。
尚未提及的一点是,某些设备希望为接收到的每个数据字节传输一个数据字节。如果这样的设备连续输入数据,它的波特率甚至比发送设备慢 0.1%,而且它没有发送稍微收缩的停止位的能力,它的输出每连续 1000 次就会落后一个字节如果设备被限制为 16 字节的缓冲,它将在大约 16,000 字节后丢弃一个字节的数据,此后将大约每千字节丢弃一个字节。值得注意的是,所谓的“1200 波特”调制解调器实际上以略高于 1200 比特/秒的速率运行(我认为大约是 1202)正是出于这个原因(因此即使发射器比它应该快 0.15%是,
JustJeff 忘记了起始位,但 Stevenh 添加了终止位。假设8个数据位,1个起始位,没有奇偶校验位的通用协议,(停止位的个数无关紧要),从起始位的前沿到中心有8个1/2位的时间最后一个数据位。通常,您希望接收器在 1/4 位时间内对最后一位进行采样。请注意,1/2 位是保证失败的阈值。任何靠近那里的东西都变得不真实,因为总会有一些电噪声和抖动。
1/4 除以 8 1/2 = 2.94%。
正如 JustJeff 所提到的,大多数 UART 实现实际上使用异步 16x 时钟对输入数据进行采样。这增加了另一个 1/16 位时间不确定性,因为这是可以测量起始位前沿的误差。8 1/2 位中的 1/16 位时间是另一个 0.74%。这来自之前计算的误差预算。您最终会得到 2.2% 的允许时钟失配,以便接收器在其中心的 1/4 位时间内对最后一位进行采样。
正如其他人所说,当需要准确的波特率时,使用 7.3728MHz 晶体是一种常见的做法。通常,您可以安排在接近其最大速率时运行 CPU,同时在晶体误差范围内达到 UART 波特率。