STM32关于异步串口的原理(尽量同步时钟+每一个位的中间时刻采样)

发送方是单片机的TX,接收方是另一个单片机的RX,所有的串口都是TX那一方是主控,负责电平高低的变换。
串口通信只需要一根线,串口的协议也很简单,这根线默认高电平,当这根线首次被TX拉低时,RX立马开启内部时钟进行计时,然后收发约定长度的数据,然后校验停止位,然后结束电平被TX拉高。
具体来看:
假如双方约定的波特率是9600,那么发送一个位的时长就是104us左右,所以RX会在50us左右去采样一次,看看这条线是否还是低电平如果是就证明了是真的开启信号。
(这里说到50us左右去采样一次,实际上也就是尽量在这一位的中间时刻去采样,这样采样到的数据更稳定)。
那怎么样才能做到中间时刻去采样?那肯定需要把这段时间进行划分,串口内部是进行了16等分的,所以说,9600波特率的串口至少需要9600 * 16HZ的时钟信号,
这也是为什么我72M的主频在CUBEMX中配置串口,最大只能把波特率设置在4.5Mbit的原因了。72=16*4.5
为什么说是异步通信,因为两边的时钟没有同步,都有自己独立的时钟
TX和RX这两个的主控芯片都有独立的时钟源,虽然都把串口设置成了9600,但是实际上的时间可能有偏差,
如果以时间为衡量尺,那么当计时1秒钟时,其中一个对应的可能是9600个时钟周期,另一个则是9700也说不准,也就是说虽然两个都分别设置成了9600,但是一个对应的时间可能是1秒,另一个对应的可能是1.04秒之类的。
那接着来,
假设第一个开始信号验证通过,那么再过一个位的时间,也就是104us(如果RX的时钟更快说不定会是102us),会再进行一次采样(这次的采样点同样是想要尽量落在TX的一个位的中间),然后如此下去...直到停止位。
所以说,只要RX能在检测到开始信号的一瞬间迅速开启时钟,并且两者的时钟误差不大,那么采样成功也很简单啊!毕竟只有10位左右,完成一帧后就又重启校对时钟,难怪我串口发送的数据一般都错不了,一根线也这么强,稳了。

下图是我画的草稿,重点关注每一个位对应时间的中间位置进行采样(也就是每个时钟周期的中间时刻采样)
image

posted @ 2026-04-08 04:27  青春猪头青年  阅读(2)  评论(0)    收藏  举报