代码改变世界

STM32 USART 补充

2022-04-05 15:06  jym蒟蒻  阅读(471)  评论(0编辑  收藏  举报

串口通讯的数据包:发送设备通过自身的TXD接口传输到接收设备的RXD接口。

串口通讯的协议层中,规定了数据包的内容,由起始位、主体数据、校验位、停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。

异步通讯:不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,有时还需要双方约定数据的传输速率,以便更好地同步。异步通讯中会包含帧的各种标识符,异步通讯双方的时钟允许误差较大。

“波特率” (Baudrate):表示每秒钟传输了多少个码元。异步通讯中由于没有时钟信号,以两个通讯设备之间需要约定好波特率。

数据包的起始信号由一个逻辑0的数据位表示;数据包的停止信号由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

数据包的起始位之后是要传输的主体数据内容,有效数据的长度常被约定为5到8位。

有效数据之后是可选的数据校验位,校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)、无校验(noparity)。

奇校验:有效数据和校验位中1的个数为奇数。如果有效数据为11110000,4个1,为达到奇校验,校验位为1。

偶校验:有效数据和校验位中1的个数为偶数。

0校验校验位总为0;1校验校验位总为1。

全双工:在同一时刻,两个设备之间可以同时收发数据。

串行通信:同一时刻只能传输一个数据位的数据。串行通讯可以节省数据线的硬件成本。以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。

UART(Universal Asynchronous Receiver and Transmitter):异步通讯、串行通信、可以支持全双工。

USART功能框图

USART功能框图如下。

在这里插入图片描述

TX:发送数据输出引脚。

RX:接收数据输入引脚。

SCLK:发送器时钟输出引脚。

nRTS、nCTS的n表示低电平有效。

nRTS:请求以发送(Request To Send),如果使能RTS流控制,USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时, nRTS 将被设置为高电平。该引脚只适用于硬件流控制。

nCTS:清除以发送(Clear To Send),如果使能CTS流控制,发送器在发送下一帧数据之前检测nCTS引脚,低电平,表示可以发送数据;高电平,发送完当前数据帧之后停止发送。只适用于硬件流控制。

STM32F103VET6系统控制器有三个USART 和两个UART,USART1时钟来源于 APB2 总线时钟,最大频率72MHz,其他四个的时钟来源于APB1总线时钟,最大频率为36MHz。UART异步传输,没有SCLK、nCTS、nRTS功能引脚。

USART数据寄存器(USART_DR):包含两个寄存器TDR和RDR。进行发送操作时,向USART_DR写入数据会自动存储在TDR内;进行读取操作时,向USART_DR读取数据会自动提取RDR数据。

TDR和RDR:在系统总线和移位寄存器之间,串行通信一个位一个位传输,发送时,把TDR内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去;接收时,把接收到的每一位顺序保存在接收移位寄存器内,然后转移到RDR。

USART控制寄存器1(USART_CR1):USART_CR1寄存器的UE位开启串口的时钟,使用USART之前,需要UE位置1使能USART。USART_CR1的M位控制发送或者接收数据字长是8位还是9位,USART_DR只有低9位有效,第9位数据是否有效要取决于M位,当M位为0时表示8位数据字长,当M位为1表示9位数据字长。

发送

发送器:USART_CR1寄存器的发送使能位TE置1时,启动数据发送。发送移位寄存器的数据在TX引脚输出,低位前高位后。同步模式下SCLK也输出时钟信号。

一个普通字符帧有三部分,起始位、数据帧、停止位。

位周期:每一位占用的时间。

起始位:一个位周期的低电平。

数据帧:要发送的8位或9位数据,从最低位开始传输。

停止位:一定时间周期的高电平。停止位时间长短由USART_CR2的STOP[1:0]位控制,可选0.5、1、1.5、2个停止位,默认1个停止位。

发送8位字长,使用1个停止位,USART字符发送时序图如下,时钟是SCLK。

在这里插入图片描述

在USART_DR寄存器中写入最后一个数据字后,要等待USART状态寄存器(USART_SR)的TC=1,它表示最后一个数据帧的传输结束。

数据传输完成后,如果USART_CR1寄存器的TCIE位置1,将产生中断。

USART状态寄存器(USART_SR):TXE,发送寄存器为空,发送单个字节的时候使用。TC,发送完成,发送多个字节数据的时候使用。

接收

USART_CR1寄存器的RE位置 1,使能USART接收。使得接收器在RX线开始搜索起始位。

起始位侦测:在USART中,如果辨认出一个特殊的采样序列,就认为侦测到一个起始位。序列为:1110 X0X0X0 000。

在这里插入图片描述

如果该序列不完整,那么接收端将退出起始位侦测并回到空闲状态(不设置标志位)等待下降沿。

确定到起始位后,根据RX线电平状态,把数据存放在接收移位寄存器内。

接收完成,把接收移位寄存器数据移到RDR内,并把USART_SR寄存器的RXNE位置1,表明读数据寄存器非空。

如果USART_CR2寄存器的RXNEIE发送完成中断使能位置1的话可产生中断。

小数波特率

发送器和接收器使用相同的波特率。公式如下。

在这里插入图片描述

USARTDIV是存放在波特率寄存器(USART_BRR)的无符号定点数。写入USART_BRR之后,波特率计数器会被波特率寄存器的新值替换。不要在通信进行中改变波特率寄存器的数值。DIV_Mantissa[11:0]位定义USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV的小数部分。

fck是是给外设的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1)。

USART1 fPLCK=72MHz,得到115200bps的波特率如何设置寄存器。

在这里插入图片描述

USARTDIV=39.0625,DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x17,设置USART_BRR的值为0x171。

校验

使用校验位时,串口传输的长度将是数据帧加上1位的校验位。每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

USART_CR1寄存器的PCE位置1,启动奇偶校验控制,奇偶校验由硬件自动完成。

启动了奇偶校验控制后,发送数据帧时自动添加校验位,接收数据时自动验证校验位。

如果奇偶校验位验证失败,USART_SR寄存器PE位置1,产生奇偶校验中断。

USART中断请求事件:

中断事件事件标志使能控制位
发送数据寄存器为空 TXE TXEIE
CTS 标志 CTS CTSIE
发送完成 TC TCIE
准备好读取接收到的数据 RXNE RXNEIE
检测到上溢错误 ORE RXNEIE
检测到空闲线路 IDLE IDLEIE
奇偶校验错误 PE PEE
断路标志 LBD LBDIE
多缓冲通信中的噪声标志、 上溢错误和帧错误 NF/ORE/FE EIE