文章目录
- 前言
- 一、同步传输和异步传输
- 二、UART协议
- 三、UART硬件结构
- 1.波特率,数据位,校验位,停止位设置
- 2.数据发送流程
- 3.数据接收流程
- 4.中断控制
- 总结
前言
本篇文章来给大家讲解一下STM32中的USART,USART是STM32中非常重要的一个模块,本篇文章将从STM32F1的参考手册出发进行讲解。
一、同步传输和异步传输
同步传输和异步传输是指在数据通信中数据传输的两种基本方式。它们之间的主要区别在于数据传输的方式和实时性。
同步传输:
1.在同步传输中,数据的发送和接收是基于某种时钟信号或同步信号进行的。
2.发送端和接收端之间需要共享时钟信号或通过其他方式保持同步,以确保数据的正确传输。
3.传输速率通常是固定的,因为数据的发送和接收都是根据同一个时钟信号进行同步的。
4.典型的同步传输包括 SPI(Serial Peripheral Interface)和 I2C(Inter-Integrated Circuit)等总线协议。在这些协议中,主设备通常负责生成时钟信号,从设备则在时钟信号的边沿接收或发送数据。
异步传输:
1.在异步传输中,数据的发送和接收是基于各自独立的时钟信号进行的,而不需要共享时钟信号。
2.发送端和接收端之间不需要保持同步,因为数据中包含了用于确定数据开始和结束的特定标志,例如起始位和停止位。
3.传输速率可以是可变的,并且不受外部时钟的限制。
4.典型的异步传输包括 UART(Universal Asynchronous Receiver-Transmitter)等串行通信协议。在 UART 中,数据的传输不依赖于外部时钟信号,而是通过起始位、数据位、停止位和可能的校验位来确定数据的传输时序。
同步传输需要发送端和接收端之间保持同步,通常具有固定的传输速率,而异步传输则不需要共享时钟信号,可以具有更灵活的传输速率,并且通过特定的起始位和停止位来确定数据的传输时序。
二、UART协议
UART(Universal Asynchronous Receiver/Transmitter)是一种串行通信协议,用于在设备之间传输数据。它是一种异步协议,这意味着发送和接收端之间不需要共享时钟信号,而是使用起始位、数据位、校验位和停止位来组织数据帧。
基本的UART通信包括以下几个要素:
起始位(Start Bit): 表示数据帧的开始。它始终是逻辑0,并且指示接收端开始读取数据。
数据位(Data Bits): 这是实际的数据比特,可以是5位、6位、7位或8位。
校验位(Parity Bit): 用于错误检测。可以选择在数据帧中添加一个奇偶校验位,以帮助检测数据传输中的错误。
停止位(Stop Bit): 表示数据帧的结束。通常是一个或两个停止位。
UART通信只需要两根线,它们分别是:
TX(Transmit): 发送线,用于从发送端发送数据到接收端。
RX(Receive): 接收线,用于从接收端接收数据。
这两根线允许双向通信,其中TX线传输数据,RX线接收数据。UART通信没有明确的主从之分,设备之间可以灵活地进行通信。通常,两个设备之间进行UART通信时,它们的TX线连接到对方的RX线,而RX线连接到对方的TX线。
UART通常使用TTL(Transistor-Transistor Logic)或CMOS(Complementary Metal-Oxide-Semiconductor)逻辑电平进行通信。这些是常见的逻辑电平标准,用于表示数字信号的高低电平状态。
在UART通信中,逻辑电平标准通常定义了高电平(逻辑1)和低电平(逻辑0)的电压范围,以及在这些电平下传输数据的方式。
标准的TTL/CMOS逻辑电平一般如下定义:
高电平(逻辑1): 通常在+3.3V或+5V左右。对于TTL逻辑,+3.3V或+5V被认为是逻辑高电平。对于CMOS逻辑,通常在VDD(供电电压)的70%以上被认为是逻辑高电平。
低电平(逻辑0): 通常在0V附近,接近地电位(GND)。对于TTL逻辑,接近0V被认为是逻辑低电平。对于CMOS逻辑,通常在VDD的30%以下被认为是逻辑低电平。
UART通信在这些逻辑电平下工作,发送端将数据转换为相应的电平信号进行传输,接收端根据这些电平信号来解析接收到的数据。这种标准化的逻辑电平确保了不同设备之间的兼容性,并简化了UART通信的实现和集成。
UART通常使用标准的TTL或CMOS逻辑电平进行数据传输,其中高电平代表逻辑1,低电平代表逻辑0,这些电平标准为UART通信提供了稳定和可靠的传输环境。
三、UART硬件结构
1.波特率,数据位,校验位,停止位设置
USART_BRR(USART Baud Rate Register)是用于设置 USART(Universal Synchronous Asynchronous Receiver Transmitter)模块的波特率的寄存器。波特率是指每秒传输的比特数,通常用 bps(bits per second)来表示。
在设置波特率时,USART_BRR 寄存器的值取决于USART的时钟源频率和所需的波特率。通常,波特率的计算公式如下:
[ \text{BRR} = \frac{\text{时钟源频率}}{(\text{波特率} \times 16)} ]
在具体设置时,步骤如下:
1.确定USART的时钟源频率,这通常由微控制器的系统时钟提供。
2.确定所需的波特率。
3.使用上述公式计算得到USART_BRR的值。
4.将该值写入USART_BRR寄存器。
USART_CR1控制寄存器可以设置数据位的长度和校验位。
USART_CR1控制寄存器可以设置停止位
2.数据发送流程
当使用 USART 模块发送数据时,涉及到几个关键寄存器:
1.TDR 寄存器(Transmit Data Register):用于存放待发送的数据。当向 TDR 寄存器写入数据后,数据会立即被发送移位寄存器发送。
2.TXE 标志位(Transmit Data Register Empty):用于指示 TDR 寄存器是否为空。当 TXE 标志位被置位时,表示 TDR 寄存器为空,可以接受新的数据写入。CPU 可以通过监视 TXE 标志位来确定何时向 TDR 寄存器写入新的数据。
3.TC 标志位(Transmission Complete):用于指示当前的数据传输是否完成。当 USART 完成发送 TDR 寄存器中的最后一个数据后,TC 标志位会被置位。这可以作为发送完成的标志,以便 CPU 可以在必要时采取后续操作。
在数据发送的过程中,大致步骤如下:
1.CPU 将要发送的数据写入 TDR 寄存器。
2.数据进入发送移位寄存器开始发送。
3.USART 开始逐位发送数据,并在发送过程中不断监视 TXE 标志位。
4.当 TXE 标志位被置位时,表示 TDR 寄存器已经空闲,可以接受新的数据。CPU 可以继续向 TDR 寄存器写入下一个数据。
5.当发送移位寄存器中的所有数据位都被发送完毕时,USART 会自动置位 TC 标志位,表示整个数据传输过程完成。
6.CPU 可以检测到 TC 标志位被置位,从而知道当前的数据传输已经完成,可以进行下一步操作,如关闭 USART 或者准备发送下一个数据。
通过 TXE 和 TC 标志位,USART 模块能够有效地协调数据的发送,并向 CPU 提供发送状态的反馈,以便 CPU 及时作出相应的处理。
3.数据接收流程
串口接收数据的流程通常涉及以下几个关键组件:
1.接收移位寄存器(Receive Shift Register):用于暂存从串口线接收到的数据位。这是串口接收数据的第一站,数据在此处按位接收。
2.RDR 寄存器(Receive Data Register):用于存放接收到的完整数据字节。接收移位寄存器中的数据位被组装成完整的字节,并存储在 RDR 寄存器中,以便 CPU 读取。
3.RXNE 标志位(Receive Data Register Not Empty):用于指示 RDR 寄存器中是否有可读取的数据。当 RXNE 标志位被置位时,表示 RDR 寄存器中有新的接收数据,可以被 CPU 读取。
串口接收数据的流程如下:
1.数据接收:当外部设备通过串口发送数据时,数据会通过串口线进入接收移位寄存器。
2.逐位接收:接收移位寄存器将逐位接收数据,直到完整的数据字节被接收完毕。在此过程中,数据位被暂存在接收移位寄存器中。
3.数据组装:一旦接收移位寄存器中的数据位被接收完毕,这些数据位会被组装成完整的字节,并存储在 RDR 寄存器中。
4.RXNE 标志位置位:当 RDR 寄存器中有新的接收数据时,RXNE 标志位会被置位,通知 CPU 可以读取 RDR 寄存器中的数据。
5.数据读取:CPU 可以通过读取 RDR 寄存器来获取接收到的数据。一旦 CPU 读取了 RDR 寄存器中的数据,RXNE 标志位会自动清除。
串口接收数据的过程就完成了。接收移位寄存器负责逐位接收数据,RDR 寄存器用于存储完整的数据字节,而 RXNE 标志位则用于通知 CPU 可以读取接收到的数据。这样,串口通信就可以实现双向的数据传输。
在STM32F103系列微控制器中,RDR(Receive Data Register)和TDR(Transmit Data Register)是同一个寄存器的不同别名,它们在内存映射中具有相同的地址。这种设计简化了对串口通信的控制和管理。
在STM32F103中,USART(Universal Synchronous Asynchronous Receiver Transmitter)模块用于串口通信。USART包含了用于接收和发送数据的数据寄存器,即RDR和TDR。这两个寄存器虽然在功能上有所区别,但在硬件层面上实际上是同一个物理寄存器。
因此,当你读取或写入RDR和TDR时,实际上是对同一个寄存器进行操作。这意味着,你可以使用相同的地址来访问这个寄存器,无论是进行数据的接收还是发送。
4.中断控制
TXEIE(Transmit Data Register Empty Interrupt Enable):当 TXEIE 被设置为 1 时,表示使能了“发送数据寄存器为空”中断。这个中断会在 USART 的发送数据寄存器(TDR)为空时触发,通常用于指示可以发送新的数据。当 USART 发送完成当前的数据字节并且 TDR 可以接受新的数据时,这个中断会被触发,从而通知 CPU 进行数据发送操作。
TCIE(Transmission Complete Interrupt Enable)寄存器使能了“传输完成”中断。当TCIE被设置为1时,表示使能了这个中断功能。这个中断在USART完成一次数据帧的传输后触发,而不是仅仅指发送完最后一个数据字节。
一次数据传输指的是发送或接收一个完整的数据帧,这包括起始位、数据位、校验位和停止位。当USART发送完最后一个数据位并且停止位已经完全发送时,TCIE中断就会被触发。
RXNEIE(Receive Data Register Not Empty Interrupt Enable):当 RXNEIE 被设置为 1 时,表示使能了“接收数据寄存器非空”中断。这个中断会在 USART 的接收数据寄存器(RDR)中有新的数据可供读取时触发,通常用于指示可以读取新的接收数据。当 USART 接收到新的数据并存储到 RDR 寄存器中时,这个中断会被触发,从而通知 CPU 进行数据接收操作。
总结
本篇文章就讲解到这里,大家可以自己下去再多研究研究数据手册当中的内容。