简单来说,UART串口的采样率通常固定为波特率的16倍。
下面进行详细解释:
1. 核心概念:波特率 vs. 采样率
波特率:这是指通信线上信号每秒变化的次数。例如,9600波特率表示线路上的电平每秒改变9600次。它决定了每个数据位在线上持续的时间宽度。
位时间 = 1 / 波特率。对于9600波特率,一个位的持续时间约为104微秒。
采样率:这是指UART接收器检查线路状态的频率。为了准确地读取每个位,接收器需要以比波特率高得多的速度去“偷看”线路状态,以确保在位的中心点(而不是在变化的边缘)读取到正确的值。
2. 为什么是16倍?
这是一个工程上的折衷方案,旨在提高抗干扰能力和同步准确性。
工作流程:
接收器检测到起始位(线路从高电平变为低电平)的下跳沿。
它不会立即开始采样,而是等待 7.5个位时间(对于16倍采样率而言,即等待 16 * 7.5 = 120 个采样时钟周期)。
这个等待使其大致位于第一个起始位的中心点。
从此处开始,接收器每隔 16个采样时钟(即1个位时间)采样一次。这样,它就能在后续每个数据位的中心点附近进行采样,这是信号最稳定、最不容易出错的位置。
16倍采样的优势:
避免边沿干扰:在信号跳变的边沿,信号可能不稳定(有毛刺或振铃)。在位的中心采样可以最大程度地避开这些干扰。
同步容错:即使发送器和接收器的时钟有微小偏差,16倍的高频采样也能确保在连续多个位的传输过程中,采样点不会漂移到位的边沿之外。这提供了很好的时钟容错能力。
准确识别起始位:通过多次采样来确认起始位的有效性,防止因噪声引起的误触发。
3. 计算示例
假设串口通信的波特率是115200。
位时间 = 1 / 115200 ≈ 8.68 微秒。
采样率 = 波特率 × 16 = 115200 × 16 = 1.8432 MHz。
采样周期 = 1 / 1.8432 MHz ≈ 0.542 微秒。
这意味着,在115200的波特率下,UART接收器的硬件会以大约1.84MHz的频率对RX数据线进行采样。
4. 特殊情况与现代发展
早期系统或低成本MCU:严格遵循16倍采样率规则。
过采样:一些现代的高性能微控制器(如某些STM32系列)可以使用更高的过采样率(例如8倍或4倍)。这允许在更高的波特率下工作,或者在相同的波特率下使用更低精度(更便宜)的时钟源。但基本原理是一样的:采样率是波特率的整数倍。
误差累积:虽然16倍采样提供了很大的容错空间,但如果发送和接收两端的时钟误差累积起来,仍然可能导致采样点逐渐偏移,最终造成帧错误。这就是为什么对晶振精度有要求的原因(通常要求误差在1%-2%以内)。
总结
所以,当有人问起UART的采样率时,最准确的回答是:它由波特率决定,通常是波特率的16倍,这是一个硬件设计的标准,用户无法直接更改。 你只需要设置正确的波特率,硬件会自动处理采样。
————————————————
版权声明:本文为CSDN博主「zhmc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42963788/article/details/154561785
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|