串口调试笔记
0赞串口的实现在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字符给滤除掉再显示。
