STM32 通信基本知识 串口通信(USART)
Dir_xr
于 2023-02-07 14:01:36 发布
文章标签: stm32 网络 嵌入式硬件
版权
文章目录
一、通讯的基本知识
串行通讯与并行通讯
全双工、半双工及单工通讯
同步通讯与异步通讯
通讯速率
二、USART—串口通讯
物理层
电平标准
RS-232 信号线
协议层
波特率
通讯的起始和停止信号
有效数据
数据校验
三、STM32 的USART 简介
四、USART 功能框图
功能引脚
数据寄存器
控制器
小数波特率生成
中断控制
一、通讯的基本知识
串行通讯与并行通讯
按数据传送的方式,通讯可分为串行通讯与并行通讯;
串行通讯是指设备之间通过少量数据信号线(一般是8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式;
并行通讯一般是指使用8、16、32 及64 根或更多的数据线进行传输的通讯方式;
并行通讯使用多个信号线,可以同时传输多个数据位的数据,而串行通讯只有一个信号线,同一时刻只能传输一个数据位的数据。
并行通讯因为一次可传输多个数据位的数据,在数据传输速率相同的情况下,并行通讯传输的数据量要大得多;
串行通讯则可以节省数据线的硬件成本(特别是远距离时) 以及PCB 的布线面积;
下面是详细的比较表格
特性 |
串行通讯 |
并行通讯 |
通讯距离 |
较远 |
较近 |
抗干扰能力 |
较强 |
较弱 |
传输速率 |
较慢 |
较高 |
成本 |
较低 |
较高 |
由于并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著影响通讯性能,现在随着技术的发展,越来越多的应用场合采用高速率的串行差分传输。
全双工、半双工及单工通讯
根据数据通讯的方向,通讯又分为全双工、半双工及单工通讯,它们主要以信道的方向来区分;
通讯方式 |
说明 |
全双工 |
在同一时刻,两个设备之间可以同时收发数据 |
半双工 |
两个设备之间可以收发数据,但不能在同一时刻进行 |
单工 |
在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备 |
以公路来类比:
全双工的通讯就是一个双向车道,两个方向上的车流互不相干;
半双工则像乡间小道那样,同一时刻只能让一辆小车通过,另一方向的来车只能等待道路空出来时才能经过;
单工则像单行道,另一方向的车辆完全禁止通行。
同步通讯与异步通讯
根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。
同步通讯:收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。
异步通讯:不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。
同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。
通讯速率
衡量通讯性能的一个非常重要的参数就是通讯速率,通常以比特率(Bitrate) 来表示,即每秒钟传输的二进制位数,单位为比特每秒(bit/s);
容易与比特率混淆的概念是波特率(Baudrate),它表示每秒钟传输了多少个码元。而码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。
如常见的通讯传输中,用0V 表示数字0,5V 表示数字1,那么一个码元可以表示两种状态0 和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通讯传输中,有0V、2V、4V 以及6V 分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。
因为很多常见的通讯中一个码元都是表示两种状态,人们常常直接以波特率来表示比特率;
二、USART—串口通讯
串口通讯(Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式。
对于通讯协议,把它分为物理层和协议层;
物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。
协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。
简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。
物理层
串口通讯的物理层有很多标准及变种,我们主要讲解RS-232 标准,RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。
在上面的通讯方式中,两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232 标准”传输数据信号。由于RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 标准”的电平信号,才能实现通讯。
电平标准
根据通讯使用的电平标准不同,串口通讯可分为TTL 标准及RS-232 标准
通讯标准 |
电平标准(发送端) |
5V TTL |
逻辑1:2.4V - 5V 、 逻辑0:0 ~ 0.5V |
RS-232 |
逻辑1:-15V ~ -3V 、 逻辑0:+3V ~ +15V |
常见的电子电路中常使用TTL 的电平标准,理想状态下,使用5V 表示二进制逻辑1,使用0V 表示逻辑0;
而为了增加串口通讯的远距离传输及抗干扰能力,RS-232 使用-15V 表示逻辑1,+15V 表示逻辑0。
因为控制器一般使用TTL 电平标准,所以常常会使用MA3232 芯片对TTL 及RS-232 电平的信号进行互相转换。
RS-232 信号线
RS-232 串口标准常用于计算机、路由与调制调解器(MODEN,俗称“猫”) 之间的通讯,在这种通讯系统中,设备被分为数据终端设备DTE(计算机、路由) 和数据通讯设备DCE(调制调解器)。
其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。 在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232 标准调制的。
在这里常常会说到TXD RXD;
接收数据:RXD (Receive Data),数据接收信号,即输入。
发送数据:TXD (Transmit Data),数据发送信号,即输出。
两个设备之间的TXD 与RXD 应交叉相连
协议层
串口通讯的数据包由发送设备通过自身的TXD 接口传输到接收设备的RXD 接口。
在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,
波特率
异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率为4800、9600、115200 等。
通讯的起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑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”,1 校验是校验位总为“1”。
三、STM32 的USART 简介
通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter) 是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。
有别于USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在USART 基础上裁剪掉了同步通信功能,只有异步通信;也就是USART比UART多一个时钟信号
简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。
USART 就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。
USART 满足外部设备对工业标准NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。
USART 支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard) 协议与lrDA(红外线数据协会) SIR ENDEC 规范。
USART 支持使用DMA,可实现高速数据通信,有关DMA 具体应用将在DMA 章节作具体讲解。
USART 在STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
四、USART 功能框图
功能引脚
TX: 发送数据输出引脚。
RX: 接收数据输入引脚。
SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS: 请求以发送(Request To Send),n 表示低电平有效。如果使能RTS 流控制,当USART 接收器准备好接收新数据时就会将nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS: 清除以发送(Clear To Send),n 表示低电平有效。如果使能CTS 流控制,发送器在发送下一帧数据之前会检测nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK: 发送器时钟输出引脚。这个引脚仅适用于同步模式。
数据寄存器
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。
USART 支持DMA 传输,可以实现高速数据传输,具体DMA 使用将在DMA 章节讲解。
控制器
USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART 之前需要向USART_CR1 寄存器的UE 位置1 使能USART,UE 位用来开启供给给串口的时钟。发送或者接收数据字长可选8 位或9 位,由USART_CR1 的M 位控制。
发送器
当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,将产生中断。
在发送数据时,比较重要的标志位有
名称 |
描述 |
TE |
发送使能 |
TXE |
发送寄存器为空,发送单个字节的时候使用 |
TC |
发送完成,发送多个字节数据的时候使用 |
TXIE |
发送完成中断使能 |
接收器
如果将USART_CR1 寄存器的RE 位置1,使能USART 接收,使得接收器在RX 线开始搜索起始位。在确定到起始位后就根据RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR 内,并把USART_SR 寄存器的RXNE 位置1,同时如果USART_CR2 寄存器的RXNEIE 置1 的话可以产生中断。
在接收数据时,比较重要的标志位有
名称 |
描述 |
RE |
接收使能 |
RXNE |
读数据寄存器非空 |
RXNEIE |
发送完成中断使能 |
小数波特率生成
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位bit/s(bps)。对于USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。
其中,fPLCK 为USART 时钟,USARTDIV 是一个存放在波特率寄存器(USART_BRR) 的一个无符号定点数。其中DIV_Mantissa[11:0] 位定义USARTDIV 的整数部分,DIV_Fraction[3:0] 位定义USARTDIV 的小数部分。
波特率的常用值有2400、9600、19200、115200。下面以实例讲解如何设定寄存器值得到波特率的值。
我们知道USART1 使用APB2 总线时钟,最高可达72MHz,其他USART 的最高频率为36MHz。
我们选取USART1 作为实例讲解,即fPLCK=72MHz。为得到115200bps 的波特率,此时:
115200 = 72000000 / (16 ∗ USARTDIV)
解得USARTDIV=39.0625,可算得DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即应该设置USART_BRR 的值为0x271。
校验控制
STM32F103 系列控制器USART 支持奇偶校验。当使用校验位时,串口传输的长度将是8 位的数据帧加上1 位的校验位总共9 位,此时USART_CR1 寄存器的M 位需要设置为1,即9 数据位。
将USART_CR1 寄存器的PCE 位置1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。
接收数据时如果出现奇偶校验位验证失败,会见USART_SR 寄存器的PE 位置1,并可以产生奇偶校验中断。
使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+ 数据帧+ 校验位+ 停止位。
中断控制
中断事件 |
事件标志 |
使能控制位 |
发送数据寄存器为空 |
TXE |
TXEIE |
CTS 标志 |
CTS |
CTSIE |
发送完成 |
TC |
TCIE |
准备好读取接收到的数据 |
RXNE |
RXNEIE |
检测到上溢错误 |
ORE |
RXNEIE |
检测到空闲线路 |
IDLE |
IDLEIE |
奇偶校验错误 |
PE |
PEIE |
断路标志 |
LBD |
LBDIE |
多缓冲通信中的噪声标志、上溢错误和帧错误 |
NF/ORE/FE |
EIE |