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

📄 uart.c

📁 硬件: PC机 1台 SeaARM2410教学实验开发平台 1台 软件: Windows 98/2000/XP操作系统 ADS 1.2集成开发环境
💻 C
字号:
/*******************************************************************************************************
**uart.c
********************************************************************************************************/
#define  IN_UART

#include  "config.h"
#define va_end(ap) ((void)(*(ap) = 0))
#define va_start(ap, parmN) (void)(*(ap) = __va_start(parmN))
// 串口选择 (为0时表示串口0,否则为串口1)
static uint8   g_uart_sel = 0;
typedef int *va_list[1];
static int whichUart=0;



/*********************************************************************************************************
** Function name: UART_Select
** Descriptions: 选择要操作的串口。(UART0--0,UART1--1)
**               选择串口后,必需调用一次UART_Init()进行初始化(只需要一次)。
** Input: no    要使用的串口
** Output: 返回上一次选用的串口
********************************************************************************************************/
int  UART_Select(uint8  no)
{	
	int  ret;
	
	ret = g_uart_sel;
	g_uart_sel = no;
	return(ret);
}



/*********************************************************************************************************
** Function name: UART_Init
** Descriptions: 初始化串口。设置为8位数据位,1位停止位,无奇偶校验,波特率为UART_BPS
** Input: 无
** Output: 无
********************************************************************************************************/
void  UART_Init(void)
{  	
	int  i;

	if(g_uart_sel)			// 判断是否为串口1
	{	
		// I/O口设置 (GPH5,GPH4)
		rGPHUP = rGPHUP | (0x03<<4);
		rGPHCON = (rGPHCON & (~0x00000F00)) | (0x00000A00);	
	
		// 串口模式设置
		rUFCON1 = 0x00;   	// 禁止FIFO功能
		rUMCON1 = 0x00;   	// AFC(流控制)禁能
		rULCON1 = 0x03; 	// 禁止IRDA,无奇偶校验,1位停止位,8位数据位
		rUCON1  = 0x245; 	// 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式,
	                    	// 禁止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)	
		// 串口波特率设置
		rUBRDIV1=(int)(PCLK/16.0/UART_BPS + 0.5) -1; 
	}
	else
	{	
		// I/O口设置 (GPH3,GPH2)
		rGPHUP = rGPHUP | (0x03<<2);
		rGPHCON = (rGPHCON & (~0x000000F0)) | (0x000000A0);	
	
		// 串口模式设置
		rUFCON0 = 0x00;   	// 禁止FIFO功能
		rUMCON0 = 0x00;   	// AFC(流控制)禁能
		rULCON0 = 0x03; 	// 禁止IRDA,无奇偶校验,1位停止位,8位数据位
		rUCON0  = 0x245; 	// 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式,
	                    	// 禁止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)	
		// 串口波特率设置
		rUBRDIV0=(int)(PCLK/16.0/UART_BPS + 0.5) -1; 
	}
	
   	for(i=0;i<100;i++);
}


void Uart_Init1(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++);
}


/*********************************************************************************************************
** Function name: UART_SendByte
** Descriptions: 向串口发送字节数据,并等待发送完毕。
** Input: data		要发送的数据
** Output: 无
********************************************************************************************************/
void  UART_SendByte(uint8 data)
{  	
	int  i;
   
    if(g_uart_sel)
    {	
    	while(!(rUTRSTAT1 & 0x02));	// 等待发送器为空
   		for(i=0; i<10; i++);
   		rUTXH1 = data;				// 发送数据
    }
    else
   	{	
   		while(!(rUTRSTAT0 & 0x02));	// 等待发送器为空
   		for(i=0; i<10; i++);
   		rUTXH0 = data;				// 发送数据
   	}   	
}



/*********************************************************************************************************
** Function name: UART_SendStr
** Descriptions: 向串口发送一字符串。
**              对于'\n'字符,发送时会加入'\r'字符。
** Input: str		要发送的字符串的指针
** Output: 无
********************************************************************************************************/
void  UART_SendStr(char const *str)
{ 	
	while(*str != '\0')
   	{ 	
   		if(*str == '\n') UART_SendByte('\r');   	  
     	  UART_SendByte(*str++);	    // 发送数据
   	}
}



/*********************************************************************************************************
** Function name: UART_GetKey
** Descriptions: 从UART口读取一字节按键数据。
**               会一直等待,直到接收到1字节数据。
** Input: 无
** Output: 返回值即是读出值
********************************************************************************************************/
int  UART_GetKey(void)
{  	
	int	 i;

	if(g_uart_sel)
	{	
		while(!(rUTRSTAT1 & 0x1));
		for(i=0; i<10; i++);
		return(rURXH1);
	}
	else	
	{	
		while(!(rUTRSTAT0 & 0x1));
		for(i=0; i<10; i++);
		return(rURXH0);
	}
}

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();
    }
}

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

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    UART_SendStr(string);
    va_end(ap);
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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