嵌入式串口功能调试
0赞LPC2292包含了两个UART,提供了串口的寄存器,使得程序员不必再去考虑复杂的串口协议,实现方法。只需要对串口了解,向相应的寄存器中写值即可,具体的实现由硬件来解决。
LPC2292提供的串口寄存器有接收缓存寄存器U0RBR,发送保持寄存器U0THR,中断使能寄存器U0IER,中断ID寄存器U0IIR,FIFO控制寄存器U0FCR,线控制寄存器U0LCR,线状态寄存器U0LSR,高速缓存寄存器U0SCR,除数锁存寄存器U0DLL,U0DLM。
下面只具体介绍四个寄存器
接收缓存寄存器U0RB是UART0 Rx FIFO的最高字节。它包含了最早接收到的字符,可通过总线接口读出。如果要访问U0RBR,U0LCR的除数锁存访问位(DLAB)必须为0。U0RBR为只读寄存器。
发送保持寄存器U0THR是UART0 Tx FIFO的最高字节。它包含了Tx FIFO中最新的字符,可通过总线接口写入。如果要访问U0THR,U0LCR的除数锁存访问位(DLAB)必须为0。U0THR为只写寄存器。
线控制寄存器U0LCR决定发送和接收数据字符的格式,如字长度,停止位长度,奇偶选择及控制等。
线状态寄存器U0LSR为只读寄存器,它提供UART0 Tx和Rx模块的状态信息。线控制寄存器有八位,每位表示接收数据就绪位,溢出错误位,奇偶错误位,帧错误位,中断间隔位,发送保持寄存器空位,发生器空位和Rx FIFO错误位。
串口的实现在uart.c源程序中,主要为系统提供串口的接口函数,有串口的初始化UART0Init();UART0ReadChar();UART0WriteChar();UART0WriteStr(uint8 const *str)等;
void UART0Init(void){
uint16 divisor;
PINSEL0=0x05;
U0IER = 0x07;//允许所有中断
//U0FCR可以暂时不写,即不使用FIFO功能
U0LCR |=0x80;
divisor = Fpclk/(16*9600);
U0DLL = divisor & 0xFF;
U0DLM = (divisor >> 8) & 0xFF;
//DLL和DLM除数锁存是波特率发生器的一部分,它们决定发送端的波特率 //这里DLAB=0即不使用除数锁存,所以不写U0DLL和U0DLM
U0LCR &= ~0x80;
U0LCR=0x03; //8位数据位,1位停止位,禁止奇偶校验
}
初始化函数首先选择相应管脚为串口功能。然后写入中断使能寄存器U0IER,允许所有中断。然后写入线控制寄存器U0LCR,控制发送和接收字符的格式。然后计算出除数锁存寄存器的值,由VPB时钟在分频得到串口时钟。
串口功能函数有UART0ReadChar();UART0WriteChar();UART0WriteStr(uint8 const *str)等;
这里只分析一下读取字符的函数UART0ReadChar();
unsigned char UART0ReadChar(void){
uint8 temp;
while((!U0LSR&0x01)); //0x01位是RDR
temp = U0RBR; //这两行是读取字符
while(temp==0x00) {
while((!U0LSR&0x01));
temp = U0RBR;
}
return temp;
}
首先读取线状态寄存器中RDR位即接收数据就绪位的值,0表示U0RBR为空,1表示U0RBR包含有效数据。若为0,接收数据为空,就一直等待,直至收到有效数据;等到接收到数据后将数据赋给变量temp作为返回值。程序中有段测试temp是否为0x00的while语句,这是因为串口在空闲的时候会发送0x00字符,所以将0x00字符给滤除掉再显示。
