3.2.2 实验原理
在嵌入式领域里说的串口一般就是说的UART接口,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。
对于UART总线,TXD和RXD分别用于发送和接收数据,相当于两根独立工作的单线总线,没有了时钟线的配合,那么接收端应该怎样获取发送端传输的数据呢?其实也是有方法的,那就是通信双方需要约定好UART总线数据传输的通信速率和时序格式。
通信速率:
UART的数据传输速度用波特率来描述,也就是UART每秒接收或发送的数据位。例如9600波特率表示每秒钟发送或接收9600比特的数据,即发送端需要将发送的每个数据位保持对应的时间,计算如下:
小脚丫硬件上使用12MHz的时钟晶振,如果以12MHz时钟信号作为系统时钟,使用计数器延时完成UART通信数据采样,那么计数器延时计数终值计算如下:
因为波特率是协议里约定的,为保证协议的通用性和灵活性,波特率参数有固定的选项,不可以随意设置(如果UART通信双方都是自己编程的,可以根据自己的要求定义自己需要的波特率,这种情况除外),波特率参数选项很多,大家可以打开串口调试助手工具找到波特率配置列表查看,我们比较常用的波特率值有以下几种:
UART常用波特率:
1200 | 4800 | 9600 | 38400 | 115200 |
---|
时序格式:
通信过程中时序依次为:起始位、数据位、校验位、停止位、空闲位,其中数据位可以是5~8位,本设计我 们使用8位数据,校验位可以省略,最后确定的时序格式如下:

前面所说的通信速率和时序格式其实就是UART通信中的两个重要的参数,需要传输的数据根据通信速率的节拍按照UART的时序格式输出,就可以实现UART通信了,可以按照下面三个步骤实现。
-
将需要发送的数据与起始位和停止位组成10bit位宽的数据
-
计数器计数延迟产生相应波特率需要的时序节拍
-
数据按照(起始位—bit0~bit7—停止位)的时序串行输出
例如,将8‘h73和8’h5a通过UART发送的时序,红色箭头为波特率对应的节拍点

对于UART发送数据来说,波特率节拍是自己产生的,数据是自己主动发出的,逻辑相对简单,而当UART接收数据的时候,因为不确定对方什么时候发送数据,所以需要对RX信号持续检测,当检测到有数据传送时,根据约定的波特率节拍采样,可以按照下面三个步骤实现。
-
检测UART的RXD信号的下降沿(自锁,完成接收后再解锁继续检测)
-
接收采样时,采样点应该在计数器的中值点进行
-
将采样后的数据按照UART时序的要求重新组成8bit的数据
例如,当UART的RX端接收到数据8‘h73和8’h5a的时候,红色箭头为检测到数据传输的点,绿色箭头为对应的采样节拍点(采样点在数据中间最是稳定)。

通过以上理论,我们了解了UART发送和接收数据的整个流程,两个过程中我们都需要波特率节拍,那么我们就可以设计一个节拍模块Baud,这样我们的发送和接收都可以实例化节拍模块用于产生对应波特率的节拍信号。