串口通讯的数据包:发送设备通过自身的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 |