⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 LPC2220的Bootloader自己写的,和 周立功的模版实现完全不一样
💻 C
字号:
//***************************************************************
//  ARM BOOT ROUTE VER1.0@0x0C000000 for 44B0X release
//  bjwork2007@gmail.com
//  chenjun @ 2005-6-10
//***************************************************************


#include <stdarg.h>
#include "..\inc\usart.h"
#include "..\inc\NXP_ARM.h"
#include "..\inc\common.h"
#include "..\inc\sysinit.h"


typedef int *__va_list[1];
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);

void UartSend(unsigned int ch,unsigned char data);
unsigned char UartReceive(unsigned int ch);
unsigned int UartRxState(unsigned int ch);
unsigned char UartGetkey(unsigned int ch);
void UartSendString(unsigned int ch,char *pt);

void printf(char *fmt, ...)
{
	va_list ap;
    char string[256];    

    va_start(ap, fmt);
    vsprintf(string, fmt, ap);
    UartSendString(CONSOLE_UART, string);
    va_end(ap);
}		

void UartInit(unsigned int ch)
{
	char a;
	
	if(ch == 0)
	{	 //if ch=0 then initialize uart0(COM1)
		rU0FCR = 0x6;		//disable uart0 T/R FIFO
		rU0ACR = 0x0;		//disable Auto-baud
    	rU0LCR = 0x83;		//set flow control at none,set uart0 at 8,n,1 format
    	rU0SCR = 0x00;
    	
    	rU0DLM = 0x00;		//set baud rate
    	rU0DLL = PCLK/(EXT_OSC_CLK/4); //set baud rate
    	if(EXT_OSC_CLK == 12000000)
    		rU0FDR = 0x85;	//set baud rate
    	else if(EXT_OSC_CLK == 11059200)
			rU0FDR = 0x21;	//set baud rate
			
		rU0TER = 0x80;		//enable TXD
    	rU0LCR = 0x3;		//set flow control at none,set uart0 at 8,n,1 format
    	rU0IER = 0x0;		//disable UART interrupt
	    a = rU0RBR;			//clear RXD buffer
	}
	else //if ch=1 then initialize uart1(COM2)
	{
		rU1FCR = 0x6;		//disable uart0 T/R FIFO
		rU1ACR = 0x0;		//disable Auto-baud
    	rU1LCR = 0x83;		//set flow control at none,set uart0 at 8,n,1 format
    	rU1SCR = 0x00;
    	
    	rU1DLM = 0x00;		//set baud rate
    	rU1DLL = PCLK/(EXT_OSC_CLK/4); //set baud rate
    	if(EXT_OSC_CLK == 12000000)
    		rU1FDR = 0x85;	//set baud rate
    	else if(EXT_OSC_CLK == 11059200)
			rU1FDR = 0x21;	//set baud rate
			
		rU1TER = 0x80;		//enable TXD
    	rU1LCR = 0x3;		//set flow control at none,set uart0 at 8,n,1 format
    	rU1IER = 0x0;		//disable UART interrupt
    	rU1MCR = 0x0;		//disable cts
	    a = rU1RBR;			//clear RXD buffer
	}	
}

void UartSend(unsigned int ch,unsigned char data)
{
	if(ch == 0)
	{	//if ch=0 then send data use uart0(COM1)
		if(data=='\n')				//if data is '\n' then frist send '\r' to HyperTerminal
		{
			while(!(rU0LSR & 0x20));//waiting for trans buffer empty		
			Delay(10);				//delay for HyperTerminal
			rU0THR = '\r';			//send newline to HyperTerminal
		}
		while(!(rU0LSR & 0x20));	//waiting for trans buffer empty		
		Delay(10);					//delay for HyperTerminal
		rU0THR = data;				//send data to HyperTerminal
   	}
	else
	{	 //if ch=1 then send data use uart1(COM2)
		if(data=='\n')				//if data is '\n' then frist send '\r' to HyperTerminal
		{
			while(!(rU1LSR & 0x20));//waiting for trans buffer empty
			Delay(10);				//delay for HyperTerminal
			rU1THR = '\r';			//send newline to HyperTerminal
		}
		while(!(rU1LSR & 0x20));	//waiting for trans buffer empty
		Delay(10);					//delay for HyperTerminal
		rU1THR = data;				//send data to HyperTerminal
    }	
}

unsigned char UartReceive(unsigned int ch)
{
	if(ch == 0)
    {	//if ch=0 then send data use uart0(COM1)    
		while(!(rU0LSR & 0x1));		//waiting for buffer register has a received data
		return rU0RBR;					//return data
    }
    else
    {   //if ch=0 then send data use uart1(COM2)    
		while(!(rU1LSR & 0x1));		//waiting for buffer register has a received data
		return	rU1RBR;					//return data
    }
}

unsigned int UartRxState(unsigned int ch)
{   //return uart rx state    
	if(ch == 0)    	    
		return (rU0LSR & 0x1);	//uart0(COM1)
    else    
		return (rU1LSR & 0x1);	//uart1(COM2)
}

unsigned char UartGetkey(unsigned int ch)
{
	return (ch == 0) ? rU0RBR : rU1RBR; 	//return rx data 
}

void UartSendString(unsigned int ch,char *pt)
{
    while(*pt > 0)
		UartSend(ch, (unsigned char)(*pt++));
}

void sendbyte(unsigned int ch,char data)
{
	if(ch == 0)
	{
		while(!(rU0LSR & 0x20));		//waiting for trans buffer empty		
		Delay(10);						//delay for HyperTerminal or SSCOM3.0
		rU0THR = (unsigned char)data;	//send data to HyperTerminal or to SSCOM3.0	
	}
	else
	{
		while(!(rU1LSR & 0x20));		//waiting for trans buffer empty		
		Delay(10);						//delay for HyperTerminal or SSCOM3.0
		rU1THR = (unsigned char)data;	//send data to HyperTerminal or to SSCOM3.0	
	}
}
//*****************************************************************************************************************************
void ConsoleInit(void)
{
	UartInit(CONSOLE_UART);
}

void putch(char data)
{
	UartSend(CONSOLE_UART,(unsigned char)data);
}

void puts(char *str)
{
	while(*str)   
		UartSend(CONSOLE_UART,(unsigned char)(*str++));
}

unsigned char getch(void)
{
	return UartReceive(CONSOLE_UART);
}

unsigned char getkey(void)
{
	return UartGetkey(CONSOLE_UART);
}

unsigned int kbhit(void)
{
	return UartRxState(CONSOLE_UART);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -