UART

这次主要全面总结一下UART,在学习STM32等开发板的时候,通信是比较常用的,UART是最基本的一种通信方式,后面还有IIC,SPI,DMA等,对于通信,首先要知道具体某种通信方式的特点以及用在什么之间的通信,然后最重要的是了解它的协议,每一种通信都有它自己的协议,在了解协议后,就是软件方面的配置了,最后连接硬件进行验证。
对于我自己,嵌入式学的很差,很模糊,因为我不知道为什么用某一种通信方式,通信原理又是什么,很多时候众人写作完成了,但是自己还是懵懂的,下次遇到的时候或要我自己完成,可能我还需要花费很大的力气。这几种通信方式接触过很多次了,但是每一次看的时候都有不同的理解,觉得自己之前的理解很片面,同时,很不幸的是,我已经忘记了自己之前的理解是如何的,作为告诫,我深深的反省一下自己,作为很渣的一个嵌入式狗,这次非得好好总结一下!
uart:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。
—-百度百科

一、USART功能概述
  接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。
  RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。
  TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。
  串口外设主要由三个部分组成,分别是波特率的控制部分、收发控制部分及数据存储转移部分。
二、处理器与外部设备通信的两种方式:
2.1并行通信
传输原理:数据各个位同时传输。
优点:速度快。
缺点:占用引脚资源多。
2.2串行通信
传输原理:数据按位顺序传输。
优点:占用引脚资源少。
缺点:速度相对较慢。
协议类双方应该遵循的原则:双方协定信号的协议;双方满足时序要求;


2.21、串行通信
按照数据传送方向,分为:
单工:数据传输只支持数据在一个方向上传输
半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数
据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个
单工通信方式的结合,它要求发送设备和接收设备都有独立
的接收和发送能力。
可以通俗的见下图:
串行通信三种传送方式
2.22、串行通信的通信方式
同步通信:带时钟同步信号传输。
-SPI,IIC通信接口
异步通信:不带时钟同步信号。
-UART(通用异步收发器),单总线
同步通信即是在时钟的上升沿或者下降沿发送一个从A到B,速度即根据时钟;而异步通信就是没有时钟,不知道数据什么时候来,那么这个时候UART如何通信呢?
UART根据设定的波特率,波特率即双方的时钟,双方约定相同的波特率,波特率即一秒钟之内传输多少位数据,进行发送和接收,双方甚至可以约定起始位、停止位等,这里应当注意设备之间进行串口通信的时候电平如果相同可以直接连接,若电平种类不同,则需要经过转换器进行转换。
-RXD:数据输入引脚。数据接受。
-TXD:数据发送引脚。数据发送。
异步方式连接方法
2.23、UART异步通信方式特点:
全双工异步通信。
小数波特率发生器系统,提供精确的波特率。
可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。
可编程的数据字长度(8位或者9位);
可配置的停止位(支持1或者2位停止位);
可配置的使用DMA多缓冲器通信。
单独的发送器和接收器使能位。
检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
多个带标志的中断源。触发中断。
其他:校验控制,四个错误检测标志。
三、串口通信过程
串口通信过程
这里写图片描述
一开始没有数据的时候,双方都是高电平(假如3.3V),假如2440想要发送数据,就让自己的串口(RXD0)输出低电平,并保持一定的时间(否则对方反应不过来);如果PC机感觉到 RXD0从高变为低,就知道发送方即将(双方约定的时间T,对应波特率)发送数据;A对应的ASSIC码为 0X41 (0100 0001),假定双方约定好在线上传输的数据都为8位,即(起始位+8位数据),传送完一位数据后,维持时间T后,继续传输一位;在接收端每间隔T检测一下,检测到的状态就为发送过来的数据,一般在0.5T时检测,以此类推,记录下来;发送方发完数据以后,必须至少保持一个T的高电平,即停止位;
串口控制器:只要设置好串口控制器,想发送数据时,将数据放到某个寄存器,串口控制器就会自动产生一个起始位,然后发送数据,发送以后自动插入一个停止位;
因此我们在发送数据 时候,首先要找到芯片手册中串口控制器有哪些设置项。

四、同步与异步的区别:
网上看到一个通俗的解释,特引用:
同步就是你叫我去吃饭,我听到了就和你去吃饭;
如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
同步是阻塞模式,异步是非阻塞模式。

其中SPI IIC为同步通信 UART为异步通信
在串行通信中,由于是一位一位地进行数据传送。为了把每个字节区别开来,需要收发双方在传送数据的串行信息流中,加入一些标记信号位。在数据中根据所添加的标记信号位的不同方式,分成同步通信和异步通信两种。
1.“异步通信”是一种很常用的通信方式(效率较低)异步通信在发送字符时,发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。所传送的数据以字节为单位。每个字节前加上一位起始位,每个字节的后面加上停止位。好处:异步通信的好处是通信设备简单、便宜,但传输效率较低。 2.“同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。同步通信是把所传送的数据以多个字节(100字节以上)为单位,在其前后添加标志。

五、uart参数意义
5.1、波特率控制
  波特率,即每秒传输的二进制位数,用 b/s (bps)表示,通过对时钟的控制可以改变波特率。在配置波特率时,我们向波特比率寄存器 USART_BRR 写入参数,修改了串口时钟的分频值 USARTDIV。USART_BRR 寄存器包括两部分,分别是 DIV_Mantissa(USARTDIV 的整数部分)和 DIVFraction(USARTDIV的小数)部分。
USART_BRR
波特率计算公式:
波特率
串口时钟的分频值计算公式为:
      USARTDIV=DIV_Mantissa+(DIVFraction/16)
USARTDIV,它表示对串口的时钟源fck进行分频。假设我们已知道了波特率和fck时钟频率的大小,那么通过上式便可以计算出USARTDIV的具体大小,然后再通过USART的值大小对波特率寄存器进行设置。
USARTDIV通过上面的表达式得出,是一个带有小数的浮点数(如45.57)。将小数部分和整数部分分开,分别得到一个整数值n(如45)和一个小数值m(如0.57)。有了这两个值我们便可以填写USART_BRR寄存器进而设置我们串口波特率大小了。
将整数部分m(45 = 0x2D)直接写入USART_BRR的后12位部分;将小数部分n乘以16后得到的整数值(如0.57x 16 = 1.12= 0x9),小数部分乘以16之后仍带有小数,则要四舍五入去除小数部分得到一个新的整数,再将其写入USART_BRR的前四位,最后USART_BRR的值为0x2D9。
在一个博客里看到一部分精华内容,当下很多只是我们都是知其然,而不知其所以然,感谢博主分享,我在这里也做了一部分引用,博主链接:http://www.cnblogs.com/cposture/p/4268910.html
博文提到了为什么要在计算波特率的公式中要乘以16,我闻所未闻。紧接着引出了串口在互传数据的时候,会产生一些抖动,从而为了保证数据的准确性,要进行多次采样。
USARTDIV,它表示对串口的时钟源fck进行分频,而这16表示的正是1bit数据的采样次数。还是这个公式:
这里写图片描述
baud = fck/usartdiv*(1/16)
引入倒数T1 = 1/(fck/usartdiv)=1/(baud*16)
其中 T1表示的是分频后的新频率,它的倒数即周期。
baud = 1/(T1*16)即1/baud = T1*16.
波特率的倒数为1bit的传输时间,等于16个新分频的周期。
每一位的传输时间只有1/TX_baud,这个总时间除以16,所以每采样一次的时间正好是T1,即新分频后的周期。而初始的串口时钟信号来自于APBx,APBx时钟信号需要经过分频才会等于T1,所以才需要分频USARTDIV。
引用到此结束。致谢。
5.2收发控制
  围绕着发送器和接收器控制部分,有好多个寄存器:CR1、CR2、CR3、SR,即 USART 的三个控制寄存器(Control Register)及一个状态寄存器(Status Register)。通过向寄存器写入各种控制参数,来控制发送和接收,如奇偶校验位,停止位等,还包括对 USART 中断的控制;串口的状态在任何时候都可以从状态寄存器中查询得到。
5.3数据存储转移部分
  收发控制器根据我们的寄存器配置,对数据存储转移部分的移位寄存器进行控制。
  当我们需要发送数据时,内核或 DMA 外设(一种数据传输方式,在下一章介绍)把数据从内存(变量)写入到发送数据寄存器 TDR 后,发送控制器将适时地自动把数据从 TDR 加载到发送移位寄存器,然后通过串口线 Tx,把数据一位一位地发送出去,在数据从 TDR 转移到移位寄存器时,会产生发送寄存器TDR 已空事件 TXE,当数据从移位寄存器全部发送出去时,会产生数据发送完成事件 TC,这些事件可以在状态寄存器中查询到。
  而接收数据则是一个逆过程,数据从串口线 Rx 一位一位地输入到接收移位寄存器,然后自动地转移到接收数据寄存器 RDR,最后用内核指令或 DMA读取到内存(变量)中。
  

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值