20221213-UART串口通信介绍

串口通信 UART 介绍

通用异步收发传输器 ,通常称作UART ,是一种异步收发传输器

首先先来介绍一下同步和异步通信

在常见通信总线协议中,I2C SPI 属于同步通信而UART 属于异步通信

在UART 通信中,数据起始位和停止位是必不可少的

硬件层

常用RS-232标准,这里不详细解释,主要是对应设备的Tx 线和Rx 线要对应正确

协议层

协议层中,规定了数据包的内容,它由起始位,主体数据,校验位以及停止位组成,通信双方的数据包格式要约定一致才能正常收发数据

波特率 异步通信中由于没有时钟信号,所以2个通信设备需约定好波特率,常见的有4800 9600 15200 等

通信的起始和停止信号,串口通信的一个数据包从起始信号开始,知道停止信号结束,数据包的起始信号由一个逻辑0 的数据位表示,而数据包的停止信号可由0.5 1 1.5 2 个逻辑1 的数据位表示,只要双方约定一致即可

有效数据,在数据包的起始位置之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为8位或9位长

数据校验 可以在传输过程中加上校验位来解决这个问题,校验方法有奇校验 偶校验 0校验 1校验 以及无校验

奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为:01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为 4 个,所以偶校验位为“0”。0 校验是不管有效数据中的内容是什么,校验位总为“0”,1 校验是校验位总为“1”。

UART 功能框图剖析

这张图是当年上学时使用system C 对uart 建模的模块图,对于接口部分,重要的即为Tx Rx 数据输出,接受接口,clk 提供波特率生成模块的初始时钟信号,

有关控制器部分,在这里使用逻辑电路来实现,具体控制输出/接收使能,设备使能等

在目前的微控制器上,数字电路控制部分已被封装,现在只需要操作对应寄存器的对应位即可实现对UART 的控制
下图是uart 框图

波特率生成模块

USART 的发送器和接收器使用相同的波特率,有以下的计算公式

其中,fck为 USART 时钟, USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV 的整数部分,DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。

例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此时 USART_BRR 值为0x18A;那么USARTDIV的小数位10/16=0.625;整数位24,最终USARTDIV的值为24.625。

波特率的常用值有 2400、9600、19200、115200。下面以实例讲解如何设定寄存器值得到波特率的值。我们知道 USART1 使用APB2总线时钟,最高可达72MHz,其他USART的最高频率为36MHz。我们选取USART1作为实例讲解,即fck=72MHz。为得到115200bps的波特率,此时:115200=72000000/(16∗USARTDIV),解得USARTDIV=39.0625,可算得DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即应该设置USART_BRR的值为0x171。

数据寄存器

UART 数据寄存器 只有低9位有效,并且第9位 数据是否有效要取决于uart 控制寄存器1的M 位设置,当M 位为0 时表示8位数据字长,当M 位为1 表示9位数据字长,我们一般使用8位数据字长

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

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

UART支持DMA传输,可以实现高速数据传输(不经过CPU),使能UART的DMA功能需要将USART_CR1寄存器DMAT位置1。

控制器

UART 有专门控制发送的发送器,控制接收的接收器,还有唤醒单元,中断控制等,使用uart 之前需要向 usart_CR1 寄存器的ue位置使能UART UE 位用于开启供给串口的时钟

发送器

当USART_CR1寄存器的发送使能位TE置1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出,低位在前,高位在后。

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

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

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

发送数据时,几个重要的标志位如下

TE 发送使能
TXE 发送寄存器为空,发送单个字节时使用
TC 发送完成,发送多个字节数据时候使用
TXIE 发送完成中断使能

接收器

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

接收数据时,几个重要的标志位如下

RE 接收使能
RXNE:读数据寄存器非空。

RXNEIE:发送完成中断使能。

USART_CR1寄存器:
USART_CR2寄存器:
USART_CR3寄存器:

之后会基于STM32继续介绍怎样配置并使用UART,包括串口轮询/中断/DMA方式发送/接收数据。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 TeX_baitu
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~