lpc2000系列微控制器具有两个功能强大的uart,其中uart0具有如下的特性:
16字节接收fifo和16字节发送fifo;
寄存器位置符合16c550工业标准;
接收fifo触发点可设置为1、4、8或14字节;
内置波特率发生器。
使用uart0通信
使用uart0通信需要两个引脚,分别为:
uart0内部结构示意图
uart0相关寄存器描述
——接收缓存寄存器
u0rsr移位寄存器从rxd0引脚接收的有效数据将被送到接收fifo中。通过读取u0rbr寄存器可以将接收fifo中最早接收到的字节读出,当fifo中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。
注意: u0rbr只读。访问该寄存器时,u0lcr的除数锁存访问位(dlab)必须为0。
uart0相关寄存器描述
——发送器保持寄存器
写入该寄存器的值将是发送fifo中的最高字节。访问该寄存器时,u0lcr的除数锁存访问位(dlab)必须为0。
注意: u0thr只写。它的地址与u0rbr相同,通过读/写操作予以区分。
uart0相关寄存器描述
——除数锁存寄存器
这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的16倍。波特率计算公式如下:
baudrate = fpclk / ([u0dlm,u0dll]×16)
注意:由于u0dll、u0dlm寄存器与其它寄存器的地址重叠,所以在访问它们时,u0lcr的除数锁存访问位(dlab)必须为1。
uart0相关寄存器描述
——中断使能寄存器
u0ier可以控制uart0的4个中断源。其中rbr中断使能包括两个中断,一个是接收数据可用(rda)中断,一个是接收超时中断(cti)。稍后将对各中断源作详细介绍。
uart0相关寄存器描述
——中断标识寄存器
uart0相关寄存器描述
——中断源说明
rls中断:该中断为最高优先级。它在uart0产生了四个错误条件(溢出错误(oe)、奇偶错误(pe)、帧错误(fe)和间隔中断(bi))中的任意一个时置位。通过查看u0lsr[4:1]可以了解到产生该中断的错误条件。读取u0lsr时清除该中断;
rda中断:该中断与cti中断并列为第二优先级。当接收的有效数据到达接收fifo设置寄存器(u0fcr)中设置的触发点时,rda被激活。当接收fifo中的有效数据少于触发点时,rda复位;
cti中断:该中断为第二优先级。当接收fifo中的有效数据少于预定的触发点数量,但至少有一个字节时,如果超过接收3.5~4.5个字节所需要的时间仍没有接收到数据,那将触发该中断。对接收fifo的任何操作都会清零该中断标志;
thre中断:该中断为第三优先级。当发送fifo为空并且满足一定的条件时,该中断将被触发。这些条件是:
3.如果在发送fifo中有过两个字节以上的数据,但是现在发送fifo为空时,将立即触发thre中断。
当thre中断为当前有效的最高优先级中断时,往u0thr写数据,或者对u0iir的读操作,将使thre中断复位。
uart0相关寄存器描述
——fifo控制寄存器
复位rxfifo:接收fifo复位。当该位置位时,uart0接收fifo中的所有字节被清零并复位指针逻辑。
注意:该位会自动清零。
复位txfifo:发送fifo复位。当该位置位时,uart0发送fifo中的所有字节被清零并复位指针逻辑。
注意:该位会自动清零。
—:这些位保留,用户程序不要向这些位写入1。
rx触发点设置:通过设置这两位可以调整接收fifo中触发rda中断的有效字节数量。
00:触发点0(1字节); 01:触发点1(4字节);
10:触发点2(8字节); 11:触发点3(14字节);
uart0相关寄存器描述
——线状态控制寄存器
停止位:控制每帧数据包含的停止位个数。
0:1个停止位; 1:2个停止位;
奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
0:禁止奇偶产生和校验; 1:使能奇偶产生和校验;
奇偶选择:设置奇偶校验类型。
00:奇数(数据位+校验位=奇数);
01:偶数(数据位+校验位=偶数);
10:校验位强制为1; 11:校验位强制为0;
间隔:当该位为1时,输出引脚(txd0)强制为逻辑0,可以引起通信对方(lpc2000)产生间隔中断。在某些通信方式中,使用间隔中断作为通信的起始信号(如:lin bus)。
0:禁止间隔发送; 1:使能间隔发送;
除数锁存:因为u0dll和u0rbr/u0thr的地址重叠,通过设置该位可以指定其中某个寄存器操作。
0:禁止访问除数锁存寄存器; 1:使能访问除数锁存寄存器;
rdr:接收数据就绪。判断该位是否置一,决定能否从fifo中读取数据。
0:u0rbr为空;
1:u0rbr中包含有效数据。从接收fifo中读走所有数据后,恢复为0。
oe:溢出错误标志。当u0rbr寄存器中已经有新的字符就绪,而接收fifo已满时,该位置位。
0:接收缓存区没有溢出;
1:接收缓存区发生溢出错误。
pe:奇偶校验错误。在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与u0lcr中的设置不符,将引起奇偶校验错误。
0:没有发生奇偶校验错误;
1:发生奇偶校验错误。读操作使该位恢复为0。
fe:帧错误标志。当接收字符的停止位为0时,产生帧错误。
0:没有发生帧错误;
1:发生帧错误。读取该位时恢复为0。
bi:间隔中断标志。在发送数据时,如果rxd0引脚保持低电平,将产生间隔中断。发生间隔中断后,接收模块停止数据接收。
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错误。
使用uart0注意要点
u0rbr与u0thr在同一地址上,但实际上是两个独立的寄存器,读操作时选择u0rbr,写操作时选择u0thr;
u0dll与u0rbr/u0thr、u0dlm与u0ier在同一地址上,通过除数访问位dlab选择。当该位为1时,选择u0dll和u0dlm。为0时,选择u0rbr/u0thr和u0ier;
无论在u0fcr中是否使能fifo,接收fifo不能被禁止。关闭fifo后,接收fifo只有一个字节缓冲;
波特率计算公式:u0dlm、u0dll = fpclk/(16×baud);
uart0应用示例——操作流程
uart0应用示例——初始化代码
uart0应用示例——收发数据
