STM32_USART 串口通讯

通信方式的分类

按照通信方式分类:

并行通信:8位(一个字节)数据同步传输,传输速度快,占用引脚资源多。
串行通信:8位数据按位传输,速度相对较慢,占用引脚资源少。

同步通信:带时钟信号同步传输,如SPI,IIC通信接口。同步通讯当中,需要外加一根时钟线,进行时钟同步,收发双方根据时钟信号的节奏来进行信号传输。
异步通信:不带时钟同步信号,比如UART(通用异步收发器),单总线。对于异步通讯,不需要时钟线,而是在数据信号中穿插一些用于同步的信号位,然后接受方根据约定的协议(波特率)对收到的数据进行解析。

按照数据传送方向分类:

单工:只支持数据单向传输。
半双工:允许数据在两个方向传输,但是在某一时刻,只允许数据在一个方向传输。
全双工:允许数据同时在两个方向传输。因此,全双工通信可以看作是两个单工通信方式的结合,需要独立的接收端和发送端。

通信接口及其说明如下图所示:

在这里插入图片描述

STM32的串口通信

引脚接线

对于芯片之间的通信来说,其引脚接线方法如图所示:由于两块芯片之间都是TTL电平(5V为高,0V为低),因此可以直接相连(交叉接线)
在这里插入图片描述
对于芯片和PC机之间的通信,则不能直接相连,因为电平不兼容。所以要中间要接一个RS232的转换器,将TTL电平转换为RS232电平(+15/+13为0,-15/13为1)
在这里插入图片描述

串口通讯的过程

在这里插入图片描述

上图很形象的表示出了数据传输的过程。无论是输入还是输出,都是一位一位进行传输的。对于接收数据,一般是当一帧数据全部被移位寄存器接收以后,再并行的传输到RDR寄存器,最后被内核读取;对于发送来说,则是这个过程的逆向操作,当一帧完整的数据被发送到TDR寄存器以后,在并行的将数据报传给移位寄存器,最后由移位寄存器一位一位的发送出去。

UART串口通信都是以帧为单位,一帧数据通常包含以下几位:
1位起始位+8位数据位+1位奇偶校验位+1位停止位
如下图所示:
在这里插入图片描述

串口发送数据

当发送使能位(TE)被置1时,首先发送一个空闲帧,然后发送移位寄存器中的数据在陆续开始在TX引脚输出。
对于串口发送数据配置的流程如下:
1、通过CR1寄存器的UE位(USART使能)来使能USART。
2、通过CR1的M位定义字长。
3、通过BRR寄存器来设置波特率。
4、设置CR1的TE位(发送使能位),并发送一个空闲帧作为第一次数据发送。
5、把需要发送的数据依次写入DR寄存器,该动作同时清除TXE位(发送寄存器空),对于待发送的数据重复该步骤。
6、当DR寄存器中写入最后一个数据字以后,等待TC=1,其表示最后一个数据帧的传输结束(当需要关闭USART或者停机之前,都需要确认是否传输结束,避免破坏最后一次传输)

单字节通信:
对于清零TXE位,是通过对数据寄存器的写操作来实现的,TXE位由硬件来设置,TXE位置1表明
1、数据已经从TDR移送到移位寄存器,数据发送已经开始;
2、TDR寄存器已经清空;
3、下一个数据可以被写进DR寄存器而不会覆盖先前的数据。

若设置了TXE位 ,当一帧数据发送完成以后,这时TC位被置1。如果要使用发送完成中断,那么要提前将CR1中的TCIE位置1 ,当TC为1时,就产生中断。

串口接收数据

对于接收数据,首先,要先侦测起始位,如果确认收到起始位,就设置RXNE标志位(置1),若RXNEIE为1(提前设定是否使用中断) ,则产生中断,在中断服务函数中进行数据的接收

字符接收:
1、将CR1寄存器中的UE置1来使能USART。
2、确定CR1中的M位来调节字长。
3、在CR2中调节停止位的个数。
4、在BRR寄存器中选择波特率。
5、将CR1中的RE置1,使能接收器,并开始搜寻RX引脚上的起始位。
当一个字符被接收到以后:
此时RXNE位(读数据寄存器非空)被置位,表明移位寄存器中的数据被转移到RDR(即数据已经被接收,且可以被读出),如果需要使用到中断功能,那么需要提前将USART_CR1寄存器中的RXNEIE位(接受缓冲区非空中断使能)置1,当使能了该位以后,当USART_SR中的ORE或者RXNE位为1时,产生USART中断。

USART中断请求

在谈到串口中断请求之前,首先得知道为什么需要用到中断来进行数据的收发。假设不使用中断的功能来完成数据的收发,那还可以用轮询的方式来收发数据。这种方式是在主函数中写一个死循环来实现的,因此,这种方式效率低,在数据还有没有到来之时就一直在不停的扫描引脚,影响其他程序的执行,而中断则是在有数据到来时,才响应中断,转而执行中断服务函数,因此不会影响其他程序的执行。

要使用中断,必须在初始化的时候将下图中相应的使能位置1,否则不能产生中断。USART的各种中断事件被连接到同一个中断向量,以下各种中断事件均请求同一个中断服务函数,这些事件如下图所示:一般情况下,这几种中断事件在同一时刻只有一件事件发生。至于此刻到底是发生的什么事件,会在中断服务函数中进行判断,执行相应的响应函数。
在这里插入图片描述
若其中存在理解有误的地方还望大佬指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值