wuyouwuyou

嵌入式串口功能调试

0
阅读(3069)

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字符给滤除掉再显示。