目录
本文以LPC2000系列微控制器的UART作为介绍
一、串口的介绍
1、特性
具有16字节接收FIFO和16字节发送FIFO
寄存器位置符合16C550工业标准
接收FIFO触发点可设置为1、4、8或14字节
内置波特率发生器
2、通信
使用UART通信需要两个引脚分别为:RxD0和TxD0,RxD0作为串行输入(接收数据),TxD0作为串行输出(发送数据)
当我们把下位机和PC机用串口连接起来时,有一个重要的东西就起到了关键性作用——232电平转换器,因为与PC机相连时,由于PC机串口是RS232电平,所以连接时需要使用RS232转换器。
一是起到电平转换作用,还有一个作用就是交叉电路(即下位机串口的TxD0引脚发送的数据要给到PC机串口的RxD0引脚,下位机串口的RxD0同理)
3、组成
二、串口中相关寄存器
1、发送和接收相关寄存器
这里的U0THR和U0RBR就是影子寄存器(上一篇中有介绍),它们是通过读/写操作予以区分的。
U0DLL是除数锁存器低字节、U0DLM是除数锁存器高字节;这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的16倍。所以波特率计算公式:
BaudRate = FPCLK / ([U0DLM,U0DLL]×16)
PS:由于U0DLL、U0DLM寄存器与U0THR和U0RBR的地址重叠,所以在访问它们时,U0LCR的除数锁存访问位(DLAB)必须为1,如果需要读或者写,则需要把除数锁存位置0
2、中断相关寄存器
(1)U0IER
U0IER是中断使能寄存器,它可以控制UART的4个中断源。其中RBR中断使能包含2个中断,一个是接收数据可用中断(RAD),一个是接收超时中断(CTI);THRE中断使能对应发送中断(THRE);Rx线状态中断使能对应接收线状态中断(RLS)。
(2)U0IIR
U0IIR是中断标志寄存器,用于指示一个挂起中断的中断源和优先级(即知道有没有中断触发)
中断优先级由高到低:RLS中断->RDA中断->CTI中断->THRE中断
RLS中断:读取U0RLS时清除该中断
RAD中断:当接收的有效数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复位
CTI中断:当接收FIFO中的有效数据少于设置的触发点且至少有一个字节时,如果超过接收3.5~4.5个字节所需要的时间(注意是接收这么多字节的时间)仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志;
PS:RAD就是FIFO满了就触发中断(即串口知道有东西来了需要接收),而CTI是接收FIFO没满
THRE中断当发送FIFO为空并且满足一定的条件时,该中断将被触发。在上一次发生THRE中断后,向发送FIFO中写入1个字节数据,将在延时一个字节加上一个停止位后发生THRE中断。(为了不影响后面写入FIFO的数据);如果在发送FIFO中有过两个字节以上的数据,但是现在发送FIFO为空时,将立即触发THRE中断。
3、设置FIFO相关寄存器
U0FCR 设置FIFO寄存器
第0位:使能FIFO。
该位为1时,使能UART0的接收和发送FIFO,并且允许访问U0FCR。
该位为0时,禁止接收FIFO,此时接收缓存只有1个字节而且发送FIFO不会被关闭。
第1位:复位RxFIFO;接收FIFO复位;当该位置位时,UART0接收FIFO中的所有字节被清零并复位指针逻辑,该位会自动清零。
第2位:复位TxFIFO;发送FIFO复位。
[5:3]位:保留
[7:6]位:Rx触发点设置 00:1字节 01:4字节 10:8字节 11:14字节
4、线状态相关寄存器
(1)U0LCR
又称线状态控制寄存器:控制发送和接收数据帧格式
字长: 控制数据长度
00:5位字符长度 01:6位字符长度 10:7位字符长度 11:8位字符长度
停止位:控制数据包包含的停止位个数
0:1个停止位 1:2个停止位
奇偶设置就是奇偶使能:控制是否进行奇偶校验
0:禁止奇偶产生和校验 1:使能奇偶产生和校验
奇偶选择:设置奇偶校验类型
00:奇数(数据位+校验位=奇数) 01:偶数 10:校验位强制为1 11:校验位强制为0
间隔:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。
0:禁止间隔发送 1:使能间隔发送
除数锁存:因为U0DLL/U0DLM和U0RBR/U0THR的地址重叠,通过设置该位可以指定其中某个寄存器操作。
0:禁止访问除数锁存寄存器 1:使能访问除数锁存寄存器
(2)U0LSR
又称线状态寄存器,只读寄存器,反映了UART0接收和发送模块的状态信息
RDR:决定能否从FIFO中读取数据;
0:U0RBR为空 1:U0RBR中包含有效数据,从接收FIFO中读走所有数据后,恢复为0。
OE:溢出错误标志。即当U0RBR中有新的字符来了但接收FIFO满了该位置位
0:接收缓存区没有溢出 1:接收缓存区发生溢出错误
PE:奇偶校验错误,在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。
0:没有发生奇偶校验 1:发生奇偶校验错误。在读操作时使该位恢复为0
FE:帧错误标志。当接收字符的停止位为0时,产生帧错误。
0:没有发生帧错误 1:发生帧错误。读取该位时恢复为0。
BI:间隔中断标志。 0:没有发生间隔中断 1:发生间隔中断
THRE:反映U0THR(发送缓存寄存器)是否为空,也可以认为发送FIFO是否为空。
0:不为空 1:为空;对U0THR进行写操作时,该位变为0
TEMT:当发送移位寄存器和U0THR均为空时,该位置位。
0:不为空 1:为空;对U0THR写操作时,该位变为0
RXFE:如果一个带有接收错误(如帧错误、奇偶错误)的字符装入U0RBR时,该位置位
0:U0RBR中没有接收错误或U0FCR[0]为0 1:U0RBR中包含至少一个UART0 Rx错误。
举两个简单的例子
1、串口初始化
2、收发数据
void UART0_SendByte(uint8 data)
{
U0THR = data; //将要发送的数据写入发送缓存寄存器中
while((U0LSR & 0x40) == 0); //等待数据发送完毕
}
uint8 UART0_RcvByte(void)
{
uint8 rcv_data;
while((U0LSR & 0x01) == 0); //等待接收数据
rcv_data = U0RBR; //读出U0RBR中的数据
return(rcv_data); //返回读到的数据
}