标题：UART
UART
因为计算机内部采用并行数据，不能直接把数据发到Modem，必须经过UART整理才能进行异步传输，其过程为：CPU先把准备写入串行设备的数据放到UART的寄存器（临时内存块）中，再通过FIFO（First Input First Output，先入先出队列）传送到串行设备，若是没有FIFO，信息将变得杂乱无章，不可能传送到Modem。
它是用于控制计算机与串行设备的芯片。有一点要注意的是，它提供了RS-232C数据终端设备接口，这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分，UART还提供以下功能：将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节，供计算机内部并行数据的器件使用。在输出的串行数据流中加入奇偶校验位，并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记，并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号（键盘和鼠标也是串行设备）。可以处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART还提供输入输出数据的缓冲区，现在比较新的UART是16550，它可以在计算机需要处理数据前在其缓冲区内存储16字节数据，而通常的UART是8250。现在如果您购买一个内置的调制解调器，此调制解调器内部通常就会有16550 UART。
定义
UART是一种通用串行数据总线，用于异步通信。该总线双向通信，可以实现全双工传输和接收。在嵌入式设计中，UART用来主机与辅助设备通信，如汽车音响与外接AP之间的通信，与PC机通信包括与监控调试器和其它器件，如EEPROM通信。
通信
UART首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开始，后面是5~8个数据位，一个可用的奇偶位和一个或几个高位停止位。接收器发现开始位时它就知道数据准备发送，并尝试与发送器时钟频率同步。如果选择了奇偶，UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。 
在接收过程中，UART从消息帧中去掉起始位和结束位，对进来的字节进行奇偶校验，并将数据字节从串行转换成并行。UART也产生额外的信号来指示发送和接收的状态。例如，如果产生一个奇偶错误，UART就置位奇偶标志。
通信速度
数据传输可以首先从最低有效位(LSB)开始。然而，有些UART允许灵活选择先发送最低有效位或最高有效位(MSB)。 
微控制器中的UART传送数据的速度范围为每秒几百位到1.5Mb。例如，嵌入在ElanSC520微控制器中的高速UART通信的速度可以高达1.152Mbps。UART波特率还受发送和接收线对距离(线长度)的影响。 
目前，市场上有只支持异步通信和同时支持异步与同步通信的两种硬件可用于UART。前者就是UART名字本身的含义，在摩托罗拉微控制器中被称为串行通信接口(SCI)；Microchip微控制器中的通用同步异步收发器(USART)和在富士通微控制器中的UART是后者的两个典型例子。
计算机
UART是计算机中串行通信端口的关键部分。在计算机中，UART相连于产生兼容RS232规范信号的电路。RS232标准定义逻辑“1”信号相对于地为-3到-15伏，而逻辑“0”相对于地为+3到+15伏。所以，当一个微控制器中的UART相连于PC时，它需要一个RS232驱动器来转换电平。
Uart这里指的是TTL电平的串口；RS232指的是RS232电平的串口。
TTL电平是5V的，而RS232是负逻辑电平，它定义+5~+12V为低电平，而-12~-5V为高电平。
Uart串口的RXD、TXD等一般直接与处理器芯片的引脚相连，而RS232串口的RXD、TXD等一般需要经过电平转换(通常由Max232等芯片进行电平转换)才能接到处理器芯片的引脚上，否则这么高的电压很可能会把芯片烧坏。
我们平时所用的电脑的串口就是RS232的，当我们在做电路工作时，应该注意下外设的串口是Uart类型的还是RS232类型的，如果不匹配，应当找个转换线(通常这根转换线内有块类似于Max232的芯片做电平转换工作的)，可不能盲目地将两串口相连。
Uart协议
UART作为异步串口通信协议的一种，工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下：
起始位：先发出一个逻辑”0”的信号，表示传输字符的开始。
资料位：紧接着起始位之后。资料位的个数可以是4、5、6、7、8等，构成一个字符。通常采用ASCII码。从最低位开始传送，靠时钟定位。
奇偶校验位：资料位加上这一位后，使得“1”的位数应为偶数(偶校验)或奇数(奇校验)，以此来校验资料传送的正确性。
停止位：它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的，并且每一个设备有其自己的时钟，很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束，并且提供计算机校正时钟同步的机会。适用于停止位的位数越多，不同时钟同步的容忍程度越大，但是数据传输率同时也越慢。
空闲位：处于逻辑“1”状态，表示当前线路上没有资料传送。
波特率：是衡量资料传送速率的指针。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒，而每一个字符为10位，则其传送的波特率为10×120=1200位/秒=1200波特。
UART的作用
1． 发送/接收逻辑
发送逻辑对从发送FIFO 读取的数据执行“并→串”转换。控制逻辑输出起始位在先的串行位流，并且根据控制寄存器中已编程的配置，会面紧跟着数据位（注意：最低位 LSB 先输出）、奇偶校验位和停止位。
在检测到一个有效的起始脉冲后，接收逻辑对接收到的位流执行“串→并”转换。此外还会对溢出错误、奇偶校验错误、帧错误和线中止（line-break）错误进行检测，并将检测到的状态附加到被写入接收FIFO 的数据中。
2． 波特率的产生
波特率除数（baud-rate divisor）是一个22 位数，它由16 位整数和6 位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器，在足够高的系统时钟速率下，UART 可以产生所有标准的波特率，而误差很小。
3． 数据收发
发送时，数据被写入发送FIFO。如果UART 被使能，则会按照预先设置好的参数（波特率、数据位、停止位、校验位等）开始发送数据，一直到发送FIFO 中没有数据。一旦向发送FIFO 写数据（如果FIFO 未空），UART 的忙标志位BUSY 就有效，并且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO 为空，且已从移位寄存器发送最后一个字符，包括停止位时才变无效。即 UART 不再使能，它也可以指示忙状态。BUSY 位的相关库函数是UARTBusy( )
在UART 接收器空闲时，如果数据输入变成“低电平”，即接收到了起始位，则接收计数器开始运行，并且数据在Baud16 的第8 个周期被采样。如果Rx 在Baud16 的第8 周期仍然为低电平，则起始位有效，否则会被认为是错误的起始位并将其忽略。
如果起始位有效，则根据数据字符被编程的长度，在 Baud16 的每第 16 个周期对连续的数据位（即一个位周期之后）进行采样。如果奇偶校验模式使能，则还会检测奇偶校验位。
最后，如果Rx 为高电平，则有效的停止位被确认，否则发生帧错误。当接收到一个完整的字符时，将数据存放在接收FIFO 中。
4． 中断控制
出现以下情况时，可使UART 产生中断：
FIFO 溢出错误
线中止错误（line-break，即Rx 信号一直为0 的状态，包括校验位和停止位在内）
奇偶校验错误
帧错误（停止位不为1）
接收超时（接收FIFO 已有数据但未满，而后续数据长时间不来）
发送
接收
由于所有中断事件在发送到中断控制器之前会一起进行“或运算”操作，所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数UARTIntStatus( )，软件可以在同一个中断服务函数里处理多个中断事件（多个并列的if 语句）。
5． FIFO 操作 FIFO 是“First-In First-Out”的缩写，意为“先进先出”，是一种常见的队列操作。 Stellaris 系列ARM 的UART 模块包含有2 个16 字节的FIFO：一个用于发送，另一个用于接收。可以将两个FIFO 分别配置为以不同深度触发中断。可供选择的配置包括：1/8、 1/4、1/2、3/4 和7/8 深度。例如，如果接收FIFO 选择1/4，则在UART 接收到4 个数据时产生接收中断。
发送FIFO的基本工作过程： 只要有数据填充到发送FIFO 里，就会立即启动发送过程。由于发送本身是个相对缓慢的过程，因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了，否则会造成数据丢失，此时只能等待。这个等待并不会很久，以9600 的波特率为例，等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去，直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除，在发送FIFO 里同时会多出一个空位。
接收FIFO的基本工作过程： 当硬件逻辑接收到数据时，就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据，数据被取走也是在接收FIFO 里被自动删除的过程，因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满，则以后再接收到数据时因无空位可以填充而造成数据丢失。
收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART 通信时，中断方式比轮询方式要简便且效率高。但是，如果没有收发 FIFO，则每收发一个数据都要中断处理一次，效率仍然不够高。如果有了收发FIFO，则可以在连续收发若干个数据（可多至14 个）后才产生一次中断然后一并处理，这就大大提高了收发效率。
完全不必要担心FIFO 机制可能带来的数据丢失或得不到及时处理的问题，因为它已经帮你想到了收发过程中存在的任何问题，只要在初始化配置UART 后，就可以放心收发了， FIFO 和中断例程会自动搞定一切。
6． 回环操作
UART 可以进入一个内部回环（Loopback）模式，用于诊断或调试。在回环模式下，从Tx 上发送的数据将被Rx 输入端接收。
7． 串行红外协议
在某些 Stellaris 系列 ARM 芯片里，UART 还包含一个 IrDA 串行红外（SIR）编码器/ 解码器模块。IrDA SIR 模块的作用是在异步UART 数据流和半双工串行SIR 接口之间进行转换。片上不会执行任何模拟处理操作。SIR 模块的任务就是要给UART 提供一个数字编码输出和一个解码输入。UART 信号管脚可以和一个红外收发器连接以实现IrDA SIR 物理层连接。
如图所示，为UART 的IrDA SIR 模块基本应用电路。D1 为红外发射管，Q2 为红外接收管。
UART的基本结构及端口介绍
⑴输出缓冲寄存器，它接收CPU从数据总线上送来的并行数据，并加以保存。
⑵ 输出移位寄存器，它接收从输出缓冲器送来的并行数据，以发送时钟的速率把数据逐位移出，即将并行数据转换为串行数据输出。
⑶ 输入移位寄存器，它以接收时钟的速率把出现在串行数据输入线上的数据逐位移入，当数据装满后，并行送往输入缓冲寄存器，即将串行数据转换成并行数据。
⑷ 输入缓冲寄存器，它从输入移位寄存器中接收并行数据，然后由CPU取走。
⑸ 控制寄存器，它接收CPU送来的控制字，由控制字的内容，决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式，数据字符的位数，有无奇偶校验，是奇校验还是偶校验，停止位的位数等参数。
⑹状态寄存器。状态寄存器中存放着接口的各种状态信息，例如输出缓冲区是否空，输入字符是否准备好等。在通信过程中，当符合某种状态时，接口中的状态检测逻辑将状态寄存器的相应位置“1”，以便让CPU查询。
设计思想
数据发送的思想是，当启动字节发送时，通过TxD先发起始位，然后发数据位和奇偶数效验位，最后再发停止位，发送过程由发送状态机控制，每次中断只发送1个位，经过若干个定时中断完成1个字节帧的发送。
数据接收的思想是，当不在字节帧接收过程时，每次定时中断以3倍的波特率监视RxD的状态，当其连续3次采样电平依次为1、0、0时，就认为检测到了起始位，则开始启动一次字节帧接收，字节帧接收过程由接收状态机控制，每次中断只接收1个位，经过若干个定时中断完成1个字节帧的接收。
为了提高串口的性能，在发送和接收上都实现了FIFO功能，提高通信的实时性。FIFO的长度可以进行自由定义，适应用户的不同需要。
波特率的计算按照计算公式进行，在设置最高波特率时一定要考虑模拟串口程序代码的执行时间，该定时时间必须大于模拟串口的程序的规定时间。单片机的执行速度越快，则可以实现更高的串口通讯速度。[1]​