www.pudn.com > DMAjian.rar > Uart_driver.c
/* ;************************************************************************************************************ ;* 北京精仪达盛科技有限公司 ;* 研 发 部 ;* ;* http://www.techshine.com ;* ;*--------------------------------------------- 文件信息 ---------------------------------------------------- ;* ;* 文件名称 : Uart_driver.c ;* 文件功能 : 该文件为串口的驱动。 ;* 补充说明 : ;*-------------------------------------------- 最新版本信息 ------------------------------------------------- ;* 修改作者 : ARM开发小组 ;* 修改日期 : 2004/08/30 ;* 版本声明 : V1.0.1 ;*-------------------------------------------- 历史版本信息 ------------------------------------------------- ;* 文件作者 : XXX(samsung) ;* 创建日期 : 2002/00/00 ;* 版本声明 : v1.0.0 ;*----------------------------------------------------------------------------------------------------------- ;*----------------------------------------------------------------------------------------------------------- ;************************************************************************************************************ ;*/ #include "..\..\Startup2410\inc\2410addr.h" #include "..\..\Startup2410\inc\2410lib.h" #include "..\..\Startup2410\inc\option.h" #include "..\inc\Uart_driver.h" #include "..\..\Startup2410\inc\def.h" #include#include #include #include #include /* ************************************************************************************************************* - 函数名称 : Uart_Init(int mclk,int baud,char port) - 函数说明 : 串口初始化 - 输入参数 : mclk,baud - 输出参数 : 无 ************************************************************************************************************* */ static int whichUart=0; void Uart_Init(int pclk,int baud) { int i; if(pclk == 0) pclk = PCLK; rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable rUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable //UART0 rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits // [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0] // Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode // 0 1 0 , 0 1 0 0 , 01 01 // PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling rUCON0 = 0x245; // Control register // rUBRDIV0=( (int)(pclk/16./baud) -1 ); //Baud rate divisior register 0 rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //Baud rate divisior register 0 //UART1 rULCON1 = 0x3; rUCON1 = 0x245; rUBRDIV1=( (int)(pclk/16./baud) -1 ); //UART2 rULCON2 = 0x3; rUCON2 = 0x245; rUBRDIV2=( (int)(pclk/16./baud) -1 ); for(i=0;i<100;i++); } /* ************************************************************************************************************* - 函数名称 : void Uart_Select(int ch) - 函数说明 : 选择串口通道 - 输入参数 : port - 输出参数 : 无 ************************************************************************************************************* */ void Uart_Select(int ch) { whichUart = ch; } /* ************************************************************************************************************* - 函数名称 : Uart_TxEmpty(int port) - 函数说明 : 等待发送转换寄存器空 - 输入参数 : port - 输出参数 : 无 ************************************************************************************************************* */ void Uart_TxEmpty(int ch) { if(ch==0) while(!(rUTRSTAT0 & 0x4)); //Wait until tx shifter is empty. else if(ch==1) while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty. else if(ch==2) while(!(rUTRSTAT2 & 0x4)); //Wait until tx shifter is empty. } /* ************************************************************************************************************* - 函数名称 : Uart_Getch - 函数说明 : 选择接收数据就绪的串口 - 输入参数 : port - 输出参数 : RdURXH0(),RdURXH1(),RdURXH2() ************************************************************************************************************* */ char Uart_Getch(void) { if(whichUart==0) { while(!(rUTRSTAT0 & 0x1)); //Receive data ready return RdURXH0(); } else if(whichUart==1) { while(!(rUTRSTAT1 & 0x1)); //Receive data ready return RdURXH1(); } else if(whichUart==2) { while(!(rUTRSTAT2 & 0x1)); //Receive data ready return RdURXH2(); } else return 0; } /* ************************************************************************************************************* - 函数名称 : Uart_GetKey - 函数说明 : 得到串口的键值 - 输入参数 : port - 输出参数 : RdURXH0()或0,rURXH1或0 ************************************************************************************************************* */ char Uart_GetKey(void) { if(whichUart==0) { if(rUTRSTAT0 & 0x1) //Receive data ready return RdURXH0(); else return 0; } else if(whichUart==1) { if(rUTRSTAT1 & 0x1) //Receive data ready return RdURXH1(); else return 0; } else if(whichUart==2) { if(rUTRSTAT2 & 0x1) //Receive data ready return RdURXH2(); else return 0; }else return 0; } /* ************************************************************************************************************* - 函数名称 : Uart_GetString(char *string) - 函数说明 : 串口得到字符串 - 输入参数 : string - 输出参数 : 无 ************************************************************************************************************* */ void Uart_GetString(char *string) { char *string2 = string; char c; while((c = Uart_Getch())!='\r') { if(c=='\b') { if( (int)string2 < (int)string ) { Uart_Printf("\b \b"); string--; } } else { *string++ = c; Uart_SendByte(c); } } *string='\0'; Uart_SendByte('\n'); } /* ************************************************************************************************************* - 函数名称 : Uart_GetIntNum(void) - 函数说明 : 得到串口初始号 - 输入参数 : 无 - 输出参数 : 无 ************************************************************************************************************* */ int Uart_GetIntNum(void) { char str[30]; char *string = str; int base = 10; int minus = 0; int result = 0; int lastIndex; int i; Uart_GetString(string); if(string[0]=='-') { minus = 1; string++; } if(string[0]=='0' && (string[1]=='x' || string[1]=='X')) { base = 16; string += 2; } lastIndex = strlen(string) - 1; if(lastIndex<0) return -1; if(string[lastIndex]=='h' || string[lastIndex]=='H' ) { base = 16; string[lastIndex] = 0; lastIndex--; } if(base==10) { result = atoi(string); result = minus ? (-1*result):result; } else { for(i=0;i<=lastIndex;i++) { if(isalpha(string[i])) { if(isupper(string[i])) result = (result<<4) + string[i] - 'A' + 10; else result = (result<<4) + string[i] - 'a' + 10; } else result = (result<<4) + string[i] - '0'; } result = minus ? (-1*result):result; } return result; } /* ************************************************************************************************************* - 函数名称 : Uart_SendByte(int data) - 函数说明 : 串口发送字节 - 输入参数 : data - 输出参数 : 无 ************************************************************************************************************* */ void Uart_SendByte(int data) { if(whichUart==0) { if(data=='\n') { while(!(rUTRSTAT0 & 0x2)); Delay(10); //because the slow response of hyper_terminal WrUTXH0('\r'); } while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty. Delay(10); WrUTXH0(data); } else if(whichUart==1) { if(data=='\n') { while(!(rUTRSTAT1 & 0x2)); Delay(10); //because the slow response of hyper_terminal rUTXH1 = '\r'; } while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty. Delay(10); rUTXH1 = data; } else if(whichUart==2) { if(data=='\n') { while(!(rUTRSTAT2 & 0x2)); Delay(10); //because the slow response of hyper_terminal rUTXH2 = '\r'; } while(!(rUTRSTAT2 & 0x2)); //Wait until THR is empty. Delay(10); rUTXH2 = data; } } /* ************************************************************************************************************* - 函数名称 : Uart_SendString(char *pt) - 函数说明 : 串口发送字符串 - 输入参数 : pt - 输出参数 : 无 ************************************************************************************************************* */ void Uart_SendString(char *pt) { while(*pt) Uart_SendByte(*pt++); } /* ************************************************************************************************************* - 函数名称 : Uart_Printf(char *fmt,...) - 函数说明 : 串口打印字符 - 输入参数 : fmt ... - 输出参数 : 无 ************************************************************************************************************* */ //If you don't use vsprintf(), the code size is reduced very much. void Uart_Printf(char *fmt,...) { va_list ap; char string[256]; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(string); va_end(ap); } /* ************************************************************************************************************* *- 结束文件 -* ************************************************************************************************************* */