1. USART和UART
USART(Universal Synchronous Asynchronous Receiver and Transmitter)即通用同步异步收发器,它是一个串行通信设备,与外部设备可灵活进行全双工数据交换。在这之前我们常用到的是UART(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。区分同步和异步最简单的方法就是看通信时需不需要对外提供时钟输出,我们平时使用的串口通信基本都是UART。关于串口通信其他基本概念,在上一篇文章http://blog.csdn.net/qq_29344757/article/details/75246263已有详细解析,这里不再赘述。
2. STM32中USART功能框图
2.1 功能引脚
(1)TX:输出引脚,用于发送数据
(2)RX:输入引脚,用于接收数据
(3)SW_RX:输入引脚,用于单线和智能卡模式,属于内部引脚,没有具体外部引脚引出
(4)IRDA_OUT:输出引脚,用于发送红外数据
(5)IRDA_IN:输入引脚,用于接收红外数据
(6)nRTS:请求以发送(Request To Send),n表低电平有效。若使能RTS硬件流控制,当USART接收器准备好接收数据时,nRTS有效,即它为低电平;当接收寄存器已满时,nRTS被设置为高电平
(7)nCTS:请求以发送(Clean To Send),n表低电平有效。若使能CTS硬件流控制,发送器在发送下一帧数据前会检测nCTS引脚状态,若为低电平表可以发送数据,若为高电平则在发送完当前数据帧之后停止发送。
(8)SCLK:发送器时钟输出引脚,仅适用于同步模式。
2.2 数据寄存器
USART数据寄存器(USART_DR)只有低9位有效,
第9位数据是否有效要取决于USART_CR1(USART控制寄存器1)的M位设置,
当M位为0时表示8位数据字长,当M位为1时表9位数据字长,一般我们使用8位数据字长。
USART_DR实际是包含了两个寄存器,一个专门用于发送的TDR,一个专门用于接收的RDR。进行发送数据操作时,往USART_DR写入数据会自动存储在TDR内,当进行读取数据操作时,向USART_DR读取数据会自动提取RDR数据。串行通信时一位一位传输的,所以TDR和RDR寄存器都是介于系统总线和移位寄存器间的:发送数据时把TDR内容转移到发送移位寄存器上,接收数据时则是把接收到的每一位顺序保存在接收移位寄存器内进而转移到RDR。
2.3 控制器
STM32的USART有专门用于控制发送、接收、唤醒单元和中断等的寄存器。例如:
(1)USART_CR1寄存器的UE位用于开启/关闭给串口的时钟源的,使用USART之前向该位写1用于使能USART。
(2)USART_CR1寄存器的M位用于控制发送/接收数据字长可选8位/9位。
(3)USART_CR1寄存器的TE位用于启停数据发送,向该位写1时发送移位寄存器上的数据会从TX引脚输出,低位在前,高位在后。如果设置USART为同步模式,SCLK引脚将会输出时钟信号。
(4)USART_CR1寄存器的RE位用于开启/关闭USART的接收,若为1,接收器在RX线开始接收数据帧的起始位,确定到起始位后就根据RX线电平状态把数据存放在接收移位寄存器内,接收完成后就要接收移位寄存器移到RDR内,并将USART_SR寄存器的RXNE位置1(若USART_CR2寄存器的RXNEIE置1的话此时可以产生中断)
一般在我们编程中较为重要的USART_CR1寄存器标志位有:
在发送数据时,
TE:发送使能
TXE:发送寄存器为空
TC: 发送完成
TXIE:发送完成中断使能
接收数据时,
RE:接收使能
RXNE:读数据寄存器非空
RXNEIE:发送完成中断使能
2.4 波特率设置
USART的发送器和接收器使用相同的波特率,计算公式为:
Tx/Rx波特率 = USART的时钟频率 / (16 * USARTDIV)
USARTDIV是一个存放波特率寄存器(USART_BRR)的无符号浮点数