0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UART是什么?串口工作过程分析

wFVr_Hardware_1 来源:未知 作者:李倩 2018-10-17 15:10 次阅读

一、UART是什么

UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx 和Tx)就可以完成通信过程,因此也称为异步串行通信。

若加入一个合适的电平转换器,如SP3232E、SP3485,UART 还能用于RS-232、RS-485 通信,或与计算机的端口连接。UART 应用非常广泛,手机工业控制、PC 等应用中都要用到UART。

UART使用的是 异步,串行通信。 串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。 异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。 数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。 数据通信格式如下图:

其中各位的意义如下:起始位:先发出一个逻辑”0”信号,表示传输字符的开始。数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)

总结起来,如果我们要配置串口通信,至少要设置一下几个参数:字长(即一次传输数据的长度)、波特率(即每秒传输的数据位数)、奇偶校验位及停止位。

二、串口工作过程分析

USART是通用同步/异步收发器

UART是通用异步收发器

由于常用的是异步模式,所以在此我们都是只需要使用UART。

我们先介绍串口发送的过程,我们先来看一下串口架构图:

可以看出,串口外设的架构图乍一看略微复杂,这里我们分开进行分析:

我们直接从发送(TX)和接收(RX)开始讲起。

RX和TX此处不做过多介绍。

根据下图红色箭头标记可以看出:对于接收来说,它经过编解码模块,然后直接进入到了接收移位寄存器,接收移位寄存器一位一位的接收数据,然后再将接收到的数据一次性写到接收数据寄存器(RDR)中,这样,CPU就可以通过读取接收数据寄存器(RDR)来读到接收的数据。

同样,对于发送来说,CPU将数据写入到发送数据寄存器(TDR),发送数据寄存器(TDR)将数据一次性的发送给发送移位寄存器,然后再根据波特率将数据一位一位的移出。如下图:

我们知道,发送和接收事先要确定好波特率,那么波特率是怎么配置的呢?我们顺着箭头继续往下找:

根据上图所示,我们不难看出:波特率是通过发送控制器和接收控制器分别控制发送器时钟和接收器时钟,然后传输到发送移位寄存器和接收移位寄存器中的。

通过上图我们还可以看出:发送器时钟和接收器时钟来自同一单元。我们现在就来分析一下这两个时钟是怎么产生的。

上文中已经介绍过,波特率实际上就是每秒传输的二进制位数,通过对时钟的控制可以改变波特率。我们向波特比率寄存器(即上图中的USART_BRR)写入参数,修改了串口时钟的分频值USARTDIV。

USART_BRR寄存器包括两个部分:DIV_Mantissa(即USARTDIV的整数部分)和DIV_Fraction(即USARTDIV的小数部分)。计算公式为:USARTDIV=DIV_Mantissa+(DIV_Fraction/16)。

波特率计算公式如下:

我们只要知道了USARTDIV的值,就可以知道串口波特率寄存器的值。

举一个简单的例子:假设我们串口1要设置的波特率为115200,PLCK2的时钟频率为72MHz,根据上面的公式,我们可以得出:

USARTDIV=72000000/(16*115200)=39.0625

由此 我们就可以得到DIV_Fraction=16*0.0625=1=0x01;

DIV_Mantissa=39=0x27。由于USARTDIV是对串口外设的时钟源进行分频,不同的USART挂载的总线并不相同,所以它们的时钟源fPCLK也不相同。USART1挂载在APB2总线上,其时钟源为fPCLK2;USART2、3、4、5挂载在APB1上,其时钟源为fPCLK1。串口的时钟源经过USARTDIV分频后,分别输出作为发送器时钟及接收器时钟,来控制发送和接收的时序。

三、程序分析

首先,我们打开iBox开发板的例程USART_DEMO,在左侧的工程目录中找到USER工程文件夹点击前方的“+”,找到main.c文件并打开。

我们可以看到,在主函数上面有一个fputc(intch, FILE *f)函数。

这个函数的功能是将一个字符写入到文件中。其参数包括:Ch要写入的字符; *f指向FILE结构的指针。

接下来我们来看一下主函数:

上图中的两行代码分别为定义GPIO结构体和定义USART结构体。

上面的函数是使能APB2总线上的串口时钟,同时启动GPIOA端口。

上图中的代码是对GPIO端口的配置。其配置方法在第三讲中有提及到,我们可以看出其配置的是PA9端口。因为PA9端口同时也是USART1_TX,即串口的发送数据端口。

上图中的代码是对PA10端口的配置。因为PA10端口同时也是USART1_RX,即串口的接收数据端口。

我们看一下GPIO的工作模式:GPIO_Pin_9的工作模式为复用推挽输出;GPIO_Pin_10的工作模式为浮空输入。我们可以在STM32参考手册中找到GPIO配置中关于USART的配置,如下表:

我们工作模式为全双工,所以根据表格,配置好相应的GPIO端口工作模式,分别为复用推挽输出和浮空输入。

接下来就是对串口的初始化和配置。如上图所示。我们逐行分析。

在此之前,我们可以在工程目录种先找到stm32f10x_usart.h(可以在main.c下面找到,因为我们的main函数包含了此库函数),即USART库函数。

我们可以在最下面找到许多函数声明。我们可以在用户手册种找到这些函数的描述,大家可以简单了解一下。

我们继续浏览stm32f10x_usart.h库函数,可以找到typedef struct,如下图(为方便截图,在此已将注释隐藏):

我们可以发现 我们程序种需要配置的USART相关参数都在这里有所声明。不仅如此,继续向下翻阅还可以找到所需配置的相关参数(由于代码略多,在此不做截图,读者可自己查阅)。

uint32_t USART_BaudRate:该成员设置了USART传输的波特率。

uint16_t USART_WordLength:提示了在一个帧中传输或者接收到的数据位数。可取值为:USART_WoedLength_8b(8位数据)和USART_WoedLength_9b(9位数据)。

uint16_t USART_StopBits:在帧尾传输的停止位。其定义为USART_StopBits_0.5(0.5个停止位)、USART_StopBits_1(1个停止位)、USART_StopBits_1.5(1.5个停止位)、USART_StopBits_2(2个停止位)。

uint16_t USART_Parity:奇偶校验位。其定义为USART_Parity_No(不使用)、USART_Parity_Even(偶模式)、USART_Parity_Odd(奇模式)。

uint16_t USART_Mode:指定了使能或者失能发送和接收模式。其定义为:USART_Mode_Rx(接收使能)、USART_Mode_Tx(发送使能)。uint16_t USART_HardwareFlowControl:制定了硬件流控制模式是使能还是失能。其定义为:USART_HardwareFlowControl_RTS(发送请求RTS使能)、USART_HardwareFlowControl_CTS(清除发送CTS使能)、USART_HardwareFlowControl_RTS_CTS(RTS和CTS使能)。

USART_Clock、USART_CPOL、USART_CPHA和USART_LastBit在同步模式下才需要配置,在此暂时不做解释。

了解了这些,对串口的初始化和配置分析就非常容易了。我们回到主函数,观察串口初始化和配置的几行代码:

上图代码是将波特率设置为115200。

上图代码定义了数据位数为8位数据。

上图代码设定了在帧尾传输一个停止位。

上图代码设定了不使用奇偶校验。

上图代码设定了不使用硬件流控制模式。

上图代码定义了发送和接收模式:使能发送和使能接收。

上图种两行代码第一行为串口初始化,第二行为使能串口。

最后,我们循环打印“USART Printf Example: retarget the C library printf function to the USART”。

接下来,我们观察实验现象:首先将程序烧录到iBox中,然后我们使用USB转TTL串口工具将iBox与电脑连接,如下图所示:

iBox的J12接口从左到右依次为:TX、RX和GND(注意:我们没有为iBox接电源,iBox需要单独供电)。

接下来,我们打开串口助手。

如上图:首先我们需要根据我们的程序配置串口(不同助手界面可能有所不同)。

设置好参数后,我们将程序烧录到iBox中,观察串口助手。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134380
  • 传输器
    +关注

    关注

    0

    文章

    39

    浏览量

    12782
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99952

原文标题:从原理图PCB到移植RTOS【细说STM32】【四】UART

文章出处:【微信号:Hardware_10W,微信公众号:硬件十万个为什么】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    反激转换器的工作过程讲解

    反激转换器的工作过程讲解;开关器件的工作在反激式转换器的整个工作过程中起着重要的作用。
    的头像 发表于 05-23 09:49 3602次阅读
    反激转换器的<b class='flag-5'>工作过程</b>讲解

    TDD协议的工作过程

    TDD协议的工作过程在TDD协议工作过程中,接收机要经过几个阶段。当正确接收捕获突发帧中的4个特字UW后,接收机的LOCK输出信号有效;当正确接收空闲突发帧后,接收机的RLOCK输出信号有效。随后
    发表于 07-15 14:42

    POE供电的特性参数及工作过程

    POE供电的特性参数POE供电的工作过程瞬态抑制的要求是什么?POE以太网供电工作过程
    发表于 01-27 07:24

    DMA工作过程及功能特性

    写在前面:本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。目录一、DMA介绍二、工作过程三、功能特性四
    发表于 08-20 06:13

    STM32串口通信的工作过程是怎样的?

    STM32串口通信的工作过程是怎样的?
    发表于 12-06 08:03

    DMA工作过程分析

    )文章目录【实验目的】【实验原理】一、DMA功能简介:二、DMA工作过程分析三、DMA库函数分析【实验环境】硬件设备:操作系统:软件环境:【实验步骤】一、 配置工程环境二、 完成DMA配置,并开启时...
    发表于 12-16 08:04

    STM32 PWM工作过程

    目录一、STM32 PWM工作过程二、PWM模式1 & PWM模式2三、STM32 PWM工作过程四、PWM输出库函数概述1、PWM输出库函数2、设置比较值函数3、使能输出比较预装载:4、使
    发表于 01-06 08:26

    无线电广播的工作过程

    无线电广播的工作过程
    发表于 07-18 10:25 2173次阅读
    无线电广播的<b class='flag-5'>工作过程</b>

    IPOA的工作过程是怎样的?

    IPOA的工作过程是怎样的? 整个系统的工作过程如下:首先是Client端的IPOA初始化过程,即Client加入LIS的过程,由Client端的IPOA高层发出初
    发表于 04-07 15:45 501次阅读

    如何通过Multisim仿真分析数据选择器的工作过程

    用Mult isim 仿真软件进行数据选择器工作过程波形仿真分析, 用虚拟仪器中的字组产生器做实验中的信号源产生所需的各个数据输入变量信号, 用逻辑分析仪显示输入变量信号、输出函数信号波形, 可直观描述数据选择器的
    的头像 发表于 10-07 11:19 1.8w次阅读

    西门子的PLC工作过程

    如果我们在程序中写的是||-MOVW VW0 VW10 .||为i0.0的常开点。那么我们来结合PLC的工作过程分析下这个程序。
    发表于 10-28 10:17 835次阅读

    无桥PFC电路的工作过程分析

    无桥PFC在一个工频周期内根据输入电压的极性可分为两个阶段:正半工作周期和负半工作周期。图4所示为输入工频正半周期的无桥PFC的工作过程,当开关管S1和S2开通时,输入AC+、L1、S1、S2、L2
    的头像 发表于 03-22 11:23 2343次阅读
    无桥PFC电路的<b class='flag-5'>工作过程</b><b class='flag-5'>分析</b>

    反离激隔式开关电源的工作过程

    反激隔离式开关电源的工作过程
    的头像 发表于 11-23 17:28 372次阅读
    反离激隔式开关电源的<b class='flag-5'>工作过程</b>

    Zeta拓扑电源原理及工作过程解析

    Zeta拓扑电源原理及工作过程解析
    的头像 发表于 11-24 17:18 1408次阅读
    Zeta拓扑电源原理及<b class='flag-5'>工作过程</b>解析

    Cuk 拓扑电源原理及工作过程解析

    Cuk 拓扑电源原理及工作过程解析
    的头像 发表于 11-24 17:32 467次阅读
    Cuk 拓扑电源原理及<b class='flag-5'>工作过程</b>解析