STM32_USART 串口通讯详解

版权声明:均是学习笔记、心得,如有冒犯,请指出,会及时处理。https://blog.csdn.net/qq_27485531 https://blog.csdn.net/qq_27485531/article/details/85392084

对51单片机有了解的都知道51单片机的串口通讯工作原理,我们单片机使用的电平TTL电平,为了使我们的的单片机与PC进行通信,就需要一个电平转换芯片,把TTL电平转换为USB电平(使用的USB接口,如果使用的DB9接口,电平转换芯片则为TTL转RS232电平芯片),然后通过对SBUF寄存器的读写操作来实现PC与MCU的通信。STM32的串口通讯原理与51相同。下面就对USART尽行具体的介绍。

USART(Universal synchronous asynchronous receivertransmitter )通用同步异步收发器,是STM32上基于串口通讯协议来实现与外部通信的一个外设,因为串口通讯协议的简单,便捷,所以在如今大多数的产品中都带支持串口通信,通过串口通信我们可以实现与单片机的通信,能够监控到我们MCU的收发数据,在进行产品的调试与开发时起着至关重要的作用。

在进行USART讲解之前,先讲解一下通讯的基本概念。

1、串行通信与并行通信

通讯按照数据传输的方式可分为串行通信与并行通信,串行通讯是指设备之间通过少量数据信号线(一般是 8根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。而并行通讯一般是指使用 8、16、32 及 64根或更多的数据线进行传输,数据位是同时传输的通讯方式,就好比这时有8辆车,串行通信就相当于只有一条马路8辆车一辆一辆过,而并行通信相当于有8条马路,8辆车同时通过,方式如下。

串行通信与并行通信的特性对比如下

由于并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著影响通讯性能,现在随着技术的发展,越来越多的应用场合采用高速率的串行差分传输。

2、全双工、半双工及单工

根据通讯方向的不同,通讯方式又可以分为全双工、半双工及单工三种方式。

 全双工:在同一时刻允许两个设备的任何一个都可以同时进行数据的发送与接收,就好比双向车道,两个方向的车辆不会有任何的干扰。

半双工:在同一时刻,只允许两个设备进行接收或者发送,不允许在同一时刻单个设备既接收又发送,就好比在一条乡间小道上同一时刻只允许一辆车通过。

单工:在任何时刻,数据的传输方向都是不变的,数据只允许一个固定的方向传输,接收双方是固定的,一个固定为发送设备,一个固定为接收设备。就好比是单行道,只允许一个方向的行驶。

3、同步通讯与异步通讯

  根据通讯的数据同步方式又分为同步和异步两种通讯方式。主要区别在于当数据传输时是否有使用到时钟信号来进行区分。

同步通讯:在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。如下图所示

异步通讯:在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。

在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。

4、通讯速率

衡量通讯性能的一个非常重要的参数就是通讯速率,通常以比特率(Bitrate)来表示,即每秒钟传输的二进制位数,单位为比特每秒(bit/s)。容易与比特率混淆的概念是“波特率”(Baudrate),它表示每秒钟传输了多少个码元。而码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。如常见的通讯传输中,用 0V 表示数字 0,5V 表示数字 1,那么一个码元可以表示两种状态 0和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通讯传输中,有 0V、2V、4V 以及 6V 分别表示二进制数 00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。因为很多常见的通讯中一个码元都是表示两种状态,人们常常直接以波特率来表示比特率。

以上四个就是通讯的基本知识,下面开始就是USART的部分

文章开头有提到串口通讯是一种非常常用的通讯方式,所以想要使用串口通讯收发双方设备就需要符合串口通讯协议的物理规定也就是串口的机械电气特性,同时接受发送时也要符合规定通讯逻辑,统一收发双方的数据打包、解包标准。也就是要统一收发双方的物理层与协议层。

我们先来讲一下物理层,也就是实现串口通讯协议大多数用以下几种方式

1、RS232标准

2、USB转串口

3、原生的串口到串口

1、RS232标准串口通信结构图如下图所示

如果两个通讯设备之间使用的是RS232串行通讯协议标准,那么MCU出来的TTL电平信号先经过一个TTL转RS232电平转换芯片,然后经过一个DB9接口与外部设备进行连接(RS232串行通讯标准COM口俗称DB9接口),再经过一个电平转换芯片转换成CPU可以识别的TTL电平信号来实现通讯。为什么要使用电平转换芯片呢?是因为TTL电平与RS232电平不兼容,RS232接口任何一条信号线的电压均为负逻辑关系,即

RS232:+3v~+15v为二进制的逻辑0,(-3)v~(-15)v为二进制的逻辑1,

TTL:+2.4~+5v为逻辑1,  0~+0.5为逻辑0

RS232因为其抗干扰能力强一般用于工业通信而TTL当通讯距离大于40cm时,传输数据就会收到干扰。

DB9标准的公头与母头的接法如下图所示

实物如下图下图所示

2、USB转串口的串行通信方式

USB转串口的通讯方式就是我文章开头所提到的我当时学习51单片机的UART时的串行通信方式,通讯原理图如下

USB转串口的串行通讯协议主要用于MCU与PC间的通讯,并且在通讯时,PC要安装电平转换芯片的驱动。

3、原生串口到串口的串行通讯方式

原生的串口通信主要是控制器跟串口的设备戒者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信,比如GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块等。原理图如下

在应用串口通讯协议时,首先要保证物理层也就是收发双方的机械电气特性符合通讯协议的规定,接下来就是要同一收发双方的数据打包、解包标准。也就是要统一收发双方的协议层。

我们上边讲通讯的基本概念有提到串行通讯是指设备之间通过少量数据信号线(一般是 8根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,收发双方都有两个端口,一个RXD 一个TXD , 具体连接如下

数据总是从TXD引脚到RXD引脚,与并行通讯不同在串口传输数据中包括起始位、数据帧、校验位和停止位。通讯双方的数据包格式要约定一致才能正常收发数据。这里主要讲解异步串行通信,所以没有时钟信号,收发双方只要约定好波特率,即每个码元的长度(下图两个虚线代表一个码元),就可以完成解码。串口数据包组成如下

起始位: 由1个逻辑 0 的数据位表示
结束位: 由 0.5、 1、 1.5 戒 2 个逻辑 1 的数据位表示
有效数据 :在起始位后紧接着的就是有效数据,有效数据的长度常被约定为 5、 6、 7 戒 8 位长。

校验位:有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity),它们介绍如下:

奇校验:奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为:01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8位的有效数据加上 1位的校验位总共 9位。

偶校验:偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为 4个,所以偶校验位为“0”。

 0校验:0 校验是不管有效数据中的内容是什么,校验位总为“0”。

1 校验:1校验是不管数据中内容为什么校验位总为1 。

无校验:没有校验位。

要想实现串口通信协议1、配置好物理层2、统一规定收发双方波特率、起始位、数据帧、校验位和停止位。

关于串口通讯的物理层与协议层就是以上内容,接下来实际讲解STM32如何去配置实现串口通讯

1、STM32_USART简介

STM32芯片具有多个 USART 外设用于串口通讯,它是 Universal SynchronousAsynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于 USART,它还有具有 UART 外设(Universal AsynchronousReceiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 满足外部设备对工业标准 NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART 支持同步单向通信和半双工单线通信;还支持局域互连网络 LIN、智能卡(SmartCard)协议与 lrDA(红外线数据协会) SIR ENDEC 规范。USART 在 STM32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。STM32的 USART 输出的是 TTL电平信号,若需要 RS-232标准的信号可使用MAX3232芯片进行转换。

那我们如何对STM32的USART进行配置呢,我们如何来规定串口通讯的起始位那些呢,这就需要我们对STM32的USART的功能框图有一定的了解,如下图所示

功能框图大致分为4部分

1、功能引脚

TX:发送数据输出引脚。

RX:接收数据输入引脚。

SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

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

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

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

2、数据寄存器(USART_DR)   ********************* 收发原理                                                                                                              USART 数据寄存器(USART_DR)只有低 9位有效,并且第 9 位数据是否有效要取决于USART 控制寄存器 1(USART_CR1)的 M 位设置,当 M 位为 0 时表示 8位数据字长,当 M位为 1表示 9位数据字长,我们一般使用 8位数据字长。

USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR数据。

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

3、控制器   ********************接下来是如何配置收发

USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用 USART 之前需要向 USART_CR1寄存器的 UE 位置 1 使能 USART。发送或者接收数据字长可选 8位或 9位,由 USART_CR1的 M 位控制。

(1)发送器

当 USART_CR1寄存器的发送使能位 TE 置 1时,启动数据发送,发送移位寄存器的数据会在 TX 引脚输出,如果是同步模式 SCLK也输出时钟信号。

一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的 8位或 9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。

停止位时间长短是可以通过 USART 控制寄存器 2(USART_CR2)的 STOP[1:0]位控制,可选 0.5个、1个、1.5个和 2个停止位。默认使用 1个停止位。2个停止位适用于正常USART 模式、单线模式和调制解调器模式。0.5 个和 1.5个停止位用于智能卡模式。

当选择 8位字长,使用 1个停止位时,具体发送字符时序图如下

当发送使能位 TE 置 1之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往 USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需要等待 USART 状态寄存器(USART_SR)的 TC位为 1,表示数据传输完成,如果
USART_CR1寄存器的 TCIE 位置 1,将产生中断。

在发送数据时,编程的时候有几个比较重要的标志位如下表所示

(2)接收器

如果将 USART_CR1寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到 RDR内,并把 USART_SR 寄存器的 RXNE 位置1,同时如果 USART_CR2寄存器的 RXNEIE 置 1的话可以产生中断。

在接收数据时,编程的时候有几个比较重要的标志位如下表所示

为得到一个信号真实情况,需要用一个比这个信号频率高的采样信号去检测,称为过采样,这个采样信号的频率大小决定最后得到源信号准确度,一般频率越高得到的准确度越高,但为了得到越高频率采样信号越也困难,运算和功耗等等也会增加,所以一般选择合适就好。
接收器可配置为不同过采样技术,以实现从噪声中提取有效的数据。USART_CR1寄存器的 OVER8位用来选择不同的采样采样方法,如果 OVER8位设置为 1采用 8倍过采样,即用 8个采样信号采样一位数据;如果 OVER8 位设置为 0采用 16 倍过采样,即用 16 个采样信号采样一位数据。

4、小数波特率生成

波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。USART 的发送器和接收器使用相同的波特率。计算公式如下:。                                                           其中,f PLCK 为 USART 时钟,OVER8 为 USART_CR1 寄存器的 OVER8位对应的值,USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV 的小数部分,DIV_Fraction[3]位只有在 OVER8 位为 0 时有效,否则必须清零。当设置波特率时直接调用库函数即可,原理只需了解。

5、校验控制

STM32F4xx 系列控制器 USART 支持奇偶校验。当使用校验位时,串口传输的长度将是 8位的数据帧加上 1位的校验位总共 9位,此时 USART_CR1寄存器的 M 位需要设置为1,即 9 数据位。将 USART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR 寄存器的 PE 位置 1,并可以产生奇偶校验中断。使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

6、中断控制

USART 有多个中断请求事件,具体如下图所示。

以上就是有关于STM32的USART的基本介绍。关于USART的应用,我会在下一篇中进行操作。

猜你喜欢

转载自blog.csdn.net/qq_27485531/article/details/85392084