在STM32中,我们使用USART的目的是为了建立设备之间的通讯,实现微控制器与外部设备之间的数据传输,允许通过串行接口发送和接收数据。而USART(通用同步/异步收发器)给予是一种用于串行通信的外设模块。
当我们在设备之间建立了一种通信之后,我们就要进行通信了。但是,我们如何懂得对方所发送的信息呢?比如说在微信上,我向你发送了“你好,世界”,对方给你回复“Hello,World”,我们如何知道对方发送的信息含义呢?对方又是如何知道我给它发送的信息含义呢?这里就需要定义一种规则,比如都说中文或者都说英文,当然了,在MCU和外部设备之间,我们也要有这样的一种规则,这里就是我们所说的通信协议了,让双方都按照协议的规则来进行收发数据。
上面只是我们定义了通信协议,然后我们还需要知道对方使用什么硬件电路来进行发送和接收,比如,我向你发送数据使用BB机,你给我发送数据则使用手机,那么,我们两个之间肯定无法建立有效的连接,所以,我们也就无法进行通信,所以下面也就是定义了我们之间互相通信的硬件信息。
- 双向串口通信有两根通信线(发送端TX和接收端RX)
- TX和RX要交叉连接
- 当只需单向的数据传输时,可以只接一根通信线
- 当电平标准不一致时,需要加电平转换芯片
在上面提到了电平标准,我们要知道比如说你打电话时,你在国内互相通信是完全没有问题的。但是当你需要向国外打电话时,你就需要知道对方国家的代码和区号等等,所以这里就有一个标准了。
- 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压和数据的对应关系。串口常用的电平标准有以下三种:
- TTL电平(USART):+3.3V或5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
当我们都把所有的准备工作做好以后,我们知道,我们该给对方发信息了,但是,我们如何来确保对方接收到的信息都是正确的呢?这里,我们就需要对信息来进行一个处理,以确保对方所接收到的信息都是正确的。
上面这两个时序图,是串口发送一个字节的格式。在串口中。每一个字节都装载在一个数据帧里面,每个数据帧都由起始位、数据位、停止位这三个部分组成。
我们的数据位可分为添加奇偶检验位(数据位为9位)和不添加奇偶检验位(数据位为8位),接下来我们来看一下串口的参数:
- 波特率:串口通信的速率
- 起始位:标志一个数据帧的开始,固定为低电平
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
- 检验位:用于数据验证,根据数据位计算得来
- 停止位:用于数据帧间隔,固定为高电平
由于串口是异步通信,故需要通信双方来约定一个通信速率,比如我每隔1秒发送一位数据,那你也就得每隔1秒接收一位数据。假设当你接收的速率过快,那么你就会重复接收某些位数据。当你接受的速率过慢,那么你就会错过接收某些数据。
当我们在发送数据的时候,我们必须要先发送一个起始位,这个起始位必须是低电平,用来打破空闲状态的高电平,使得其产生一个下降沿信号,这里的下降沿就相当于一个标志,高速接收设备,这一帧数据要开始传输,你要准备好接收数据了。同理,也就是为什么要有一个停止位,用来告诉设备我传输完数据了。可以准备开始下一帧数据的传输了,这也就是为什么要将停止位置为高电平。
起始位固定为0,产生下降沿,表示传输数据开始。停止位固定为1,产生上升沿,表示传输数据结束。
在串口中,使用一种叫奇偶检验的数据验证方法,奇偶检验可以用来判断数据是不是传输错误了。如果数据出错,可以选择丢弃或者要求重传。校验可以选择三种方式,无校验,奇校验、偶校验。
- 无校验:就是不需要对数据进行校验,如上图的左边所示。起始位、数据位、停止位三部分。
- 奇校验、偶校验:如上图的右边所示。起始位、数据位、校验位、停止位四部分。
如果使用奇校验,那么包括校验位在内的9位数据会出现奇数个1。如果使用偶校验,那么包括校验位在内的9位数据会出现偶数个1。
USART可以用于以下几个目的:
1.与外部设备进行通信:通过USART,STM32微控制器可以与其他设备(如计算机、传感器、显示屏等)进行双向通信。它可以实现异步通信(不同设备之间的通信速率可以不同)或同步通信(设备间通信速率相同)。
2.调试和日志输出:USART可以被用于将调试和日志信息从微控制器发送到计算机。这在开发和调试应用程序时非常有用,可以帮助检测错误和跟踪程序执行过程。
3.Bootloader和固件更新:通过USART,可以实现微控制器的固件更新和bootloader的功能。这样可以方便地在外部设备连接时更新或改变程序功能。
4.串行通信接口替代:USART还可以替代其他串行通信接口,如SPI(串行外设接口)或I2C(串行总线接口),在某些特定应用中提供更高的灵活性和性能。