前言
通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统;单片机有了通信的功能,就能和别的模块互联;
通信协议:制定通信的规则,通信双方按照协议规则进行数据收发;
名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 |
USART | TX、RX | 全双工 | 异步 | 单端 | 点对点 |
有时钟线可以实现同步传输;
单端通信指的是对GND的电平差;差分是对两个引脚的电平差(差分信号)通信时不需要GND,使用差分信号可以极大的提高抗干扰能力,所以差分信号一般传输速度和距离都会非常高;
硬件电路
简单双向串口通信有两根通信线(发送端TX和接收端RX)
TX与RX要交叉连接
当只需单向的数据传输时,可以只接一根通信线
当电平标准不一致时,需要加电平转换芯片
电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
TTL电平:+3.3V或+5V表示1,0V表示0(单片机常见)
RS232电平:-3~-15V表示1,+3~+15V表示0
RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
串口参数及时序
波特率:串口通信的速率(发送和接收速率要相同,不然会有重复接收数据或者丢失数据,在二进制调制下,也可以说成比特率bit/s,规定了每隔多少秒发送一位)
起始位:标志一个数据帧的开始,固定为低电平
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
校验位:用于数据验证,根据数据位计算得来
停止位:用于数据帧间隔,固定为高电平
串口的停止位是可以配置的,配置成一位或者两位
USART简介
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器;
USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
自带波特率发生器,最高达4.5Mbits/s
可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
可选校验位(无校验/奇校验/偶校验)
支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
STM32F103C8T6 USART资源: USART1、 USART2、 USART3;硬件流控制:防止接收方处理不过来,当接收方准备好时才发送数据
常用参数:波特率9600/115200、数据位8位、停止位1位、无校验位
USART框图
TDR和RDR共用一个地址,程序上只表现一个寄存器DR,实际硬件中是两个;
TX接发送移位寄存器,RX接接收移位寄存器;
发送移位寄存器是向右移位的,和串口协议规定的低位先行是一致的,当数据移位完成后,新的数据就会自动的从TDR转移到发送移位寄存器里;
接收移位寄存器同样是向右移位的,从高位往低位移动,接收到的最后一位是高位,接收完成后会把RXNE(在接收控制器附近)标志位置1,就可以把数据读到RDR里了
发送器控制:控制发送移位寄存器工作;
接收器控制:控制接收移位寄存器工作;
硬件数据流控:控制流控的,发送设备发的太快,接收设备来不及处理,就会出现数据丢失或者覆盖的情况;通过nRTS和nCTS两个端口进行控制,n代表低电平有效(代表可以发送,拉高代表不能发送);nRTS接另一个uart的nCTS,发送电平告诉对方现在能不能接收数据;nCTS接对方的nRTS,接收对方电平,判断能不能发送数据;
SCLK控制(右边):配合发送移位寄存器工作,发送移位寄存器每移位一次,同步时钟电平就跳变一个周期,告诉对方,我移出去了一位数据(只支持输出,不支持输入)所以两个usart,不能实现同步通信;
唤醒单元(中间):可以实现多设备,上面接了一个usart的地址,可以给这个串口分配一个地址,往这个地址发数据时,唤醒单元就会唤醒开始工作(接收数据);
USART中断控制:内接中断申请位,就是状态寄存器哪里的各个标志位,比如上面的TXE(发送寄存器空),RXNE(接收寄存器非空)用来判断发送状态和接收状态;这里就是配置中断能不能通往NVIC
波特率发生器(最下面):分频器,APB时钟进行分频,得到发送和接收移位时钟;TE为1,发送器使能,发送部分的波特率有效,RE为1,接收器使能,接收部分的波特率有效;
USART基本结构
时钟来源PCLK2/1,经过波特率发生器分频后,产生的时钟通往发送控制器和接收控制器,发送控制器和接收控制器用来控制发送位移和接收位移,发送数据寄存器和发送移位寄存器配合,将数据一位一位的移出去,通过GPIO口的复用输出到TX引脚,产生串口协议规定的波形;
当数据从发送数据寄存器转移到发送移位寄存器时,会置TXE标志位,判断这个标志位,就知道是不是可以写下一个数据了;
RX引脚的波形,通过GPIO输入,在接收控制器的控制下,一位位地移入接收移位寄存器,移完一帧后,数据就会统一转移到接收数据寄存器,在转移的同时,会置RXNE标志位,检查这个标志位,就可以知道是不是接收到数据了,同时这个标志位也可以去申请中断,这样可以在收到数据时,直接进入中断函数;
图里实际上有四个寄存器,在软件层面只有一个DR寄存器给我们读写,写入DR时,数据走上面进行发送,读DR时,数据走下面进行接收;
起始位检测
通过起始位侦测,接收状态由空闲变为接收起始位;
波特率发生器
发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
计算公式:波特率 = fPCLK2/1 / (16 * DIV)
除16是因为有一个16倍频率的采样时钟;计算最终时钟,要输入时钟除以16;通过配置DIV来控制波特率