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); 
} 
/* 
************************************************************************************************************* 
*-                            				结束文件													   -* 
************************************************************************************************************* 
*/