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

📄 uart.c

📁 著名的嵌入式操作系统Nucleus的源代码
💻 C
字号:
#include "uart.h"
#include "wtx.h"
NU_HISR URT_HISR0, URT_HISR1;
unsigned char command[100],command1[100];
unsigned char Txbuff0[BUFFSIZE], Txbuff1[BUFFSIZE],Rxbuff0[BUFFSIZE],Rxbuff1[BUFFSIZE],Frame0[BUFFSIZE],Frame1[BUFFSIZE];
unsigned char *TxBuff0_Head;
unsigned char *TxBuff0_Tail;
unsigned char *TxBuff0Wt_Point;
unsigned char *TxBuff0Rd_Point;
unsigned char *TxBuff1_Head;
unsigned char *TxBuff1_Tail;
unsigned char *TxBuff1Wt_Point;
unsigned char *TxBuff1Rd_Point;
unsigned char *RxBuff0_Head;
unsigned char *RxBuff0_Tail;
unsigned char *RxBuff0Wt_Point;
unsigned char *RxBuff0Rd_Point;
unsigned char *RxBuff1_Head;
unsigned char *RxBuff1_Tail;
unsigned char *RxBuff1Wt_Point;
unsigned char *RxBuff1Rd_Point;
STATUS URT_Flag0=0;	//to indicate if the send data string is the first one.
			// 0=first 
			// 1=not first 
STATUS URT_Flag1=0;	//to indicate if the send data string is the first one.
			// 0=first 
			// 1=not first 
STATUS URT_Mode;	//0=String;
			// 1=Modem
			// 2=NET
STATUS URT_Mode1;	//0=String;
			// 1=Modem
			// 2=NET
STATUS URT_Init( URT_Struct uart);
void SendCharURT1(unsigned char c);
unsigned char  RecvCharURT1(void);
void URT0_Tx_LISR(INT vect);
void URT1_Tx_LISR(INT vect);
void URT0_Rx_LISR(INT vect);
void URT1_Rx_LISR(INT vect);
void URT0_hisr(void);
void URT1_hisr(void);
STATUS SendChar(unsigned char uartno, unsigned char *s, INT number);
//void response(unsigned char *s);
extern NU_MEMORY_POOL  System_Memory;
extern NU_PIPE		URT_Pipe;		//It is used to send frames from UART

STATUS URT_Init(URT_Struct uart)
{
	STATUS status;
	void (*old_lisr)(INT);
	void *pointer;
	status=NU_SUCCESS;
	if(uart.uartno)		//if we use UART1 then Init UART1
	{
		*(volatile unsigned long*)ULCON1 = (unsigned long)
			((uart.DataLenth|uart.StopBit|uart.ParityMode|uart.ClkSel|uart.URTMode)&0x000000ff);
		*(volatile unsigned long*)UBRDIV1 = uart.BAUDRate;
		*(volatile unsigned long*)UCON1 = (unsigned long)0x29;
	//register the Tx lisr;
		status=NU_Register_LISR(6, URT1_Tx_LISR, &old_lisr);
		if(status!=NU_SUCCESS)return(status);

	//register the Rx lisr
		status=NU_Register_LISR(7, URT1_Rx_LISR, &old_lisr);
		if(status!=NU_SUCCESS)return(status);
		
	//Allocate memory for HISR
		status=NU_Allocate_Memory(&System_Memory, &pointer, 1024, NU_NO_SUSPEND);
		if(status!=NU_SUCCESS)return(status);
		
		status=NU_Create_HISR(&URT_HISR1, "URT0_Handler", URT1_hisr, 2, pointer, 1024);
		if(status!=NU_SUCCESS)return(status);
		*(volatile unsigned long*)INTMSK&=0x3fff7f;	//Enable UART0 Rx Interrupt
		*(volatile unsigned long*)INTMSK|=0x40;		//Disable UART 1 Tx Interrupt
		TxBuff1_Head = &Txbuff1[0];
		TxBuff1_Tail = &Txbuff1[BUFFSIZE-1];
		TxBuff1Rd_Point=TxBuff1Wt_Point=Txbuff1;
		RxBuff1_Head = Rxbuff1;
		RxBuff1_Tail = &Rxbuff1[BUFFSIZE-1];
		RxBuff1Rd_Point=RxBuff1Wt_Point=Rxbuff1;
	}
	else				//Use UART 0
	{
		*(volatile unsigned long*)ULCON0 = (unsigned long)
			((uart.DataLenth|uart.StopBit|uart.ParityMode|uart.ClkSel|uart.URTMode)&0x000000ff);
		*(volatile unsigned long*)UBRDIV0 = uart.BAUDRate;
		*(volatile unsigned long*)UCON0 = (unsigned long)0x29;
			
	//register the Tx lisr;
		status=NU_Register_LISR(4, URT0_Tx_LISR, &old_lisr);
		if(status!=NU_SUCCESS)return(status);

	//register the Rx lisr
		status=NU_Register_LISR(5, URT0_Rx_LISR, &old_lisr);
		if(status!=NU_SUCCESS)return(status);
		
	//Allocate memory for HISR
		status=NU_Allocate_Memory(&System_Memory, &pointer, 1024, NU_NO_SUSPEND);
		if(status!=NU_SUCCESS)return(status);
		
		status=NU_Create_HISR(&URT_HISR0, "URT0_Handler", URT0_hisr, 2, pointer, 1024);
		if(status!=NU_SUCCESS)return(status);
		*(volatile unsigned long*)INTMSK&=0x3fffdf;	//Enable UART0 Rx Interrupt
		*(volatile unsigned long*)INTMSK|=0x10;		//Disable UART 0 Tx Interrupt
	//Initialize the pointers of the COM0 buffer
		TxBuff0_Head = Txbuff0;
		TxBuff0_Tail = &Txbuff0[BUFFSIZE-1];
		TxBuff0Rd_Point=TxBuff0Wt_Point=Txbuff0;
		RxBuff0_Head = Rxbuff0;
		RxBuff0_Tail = &Rxbuff0[BUFFSIZE-1];
		RxBuff0Rd_Point=RxBuff0Wt_Point=Rxbuff0;
		
	}
	URT_Flag0=URT_Flag1=0;
	for(status=0;status<100;status++)command[status]=command1[status]=0xff;
	return (status);		
}

STATUS SendChar(unsigned char uartno, unsigned char *s, INT number)
{
	INT i=0;
	STATUS status;
	status=0;
	
	
	if(uartno)	//if use COM1
	{
		if(number<=0)
		{
			URT_Flag0= 0;
			return(0);
		}
		
		//copy the string to Txbuff1 at current TxBuff1Wt_Point
		do{
			if((TxBuff1Wt_Point==TxBuff1Rd_Point)&&(URT_Flag1)) return( -1);
			*TxBuff1Wt_Point=*(s+i);
			i++;
			if(TxBuff1Wt_Point==TxBuff1_Tail)TxBuff1Wt_Point=TxBuff1_Head;
			else TxBuff1Wt_Point++;
			}while(i<number);

		 
		
		//wait till UART1 is available for senting data
		do{
			}while(URT_Flag1==1);
		
		*(volatile unsigned long*)UTXBUF1 = (unsigned long)*TxBuff1Rd_Point;
		TxBuff1Rd_Point++;	
		*(volatile unsigned long*)INTMSK&=0x3fffbf;		//Enable Tx interrupt of UART1	
		URT_Flag1=1;
	}
	else			//use COM0
	{
		if(number<=0)
		{
			URT_Flag1 = 0;
			return(0);
		}
		//copy the string to Txbuff0 at current TxBuff0Wt_Point
		do{
			if((TxBuff0Wt_Point==TxBuff0Rd_Point)&&(URT_Flag0)) return( -1);
			*TxBuff0Wt_Point=*(s+i);
			i++;
			if(TxBuff0Wt_Point==TxBuff0_Tail)TxBuff0Wt_Point=TxBuff0_Head;
			else TxBuff0Wt_Point++;
			}while(i<number);
		 
		//wait till UART1 is available for senting data
		do{
			}while(URT_Flag0==1);
		
		*(volatile unsigned long*)UTXBUF0 = (unsigned long)*TxBuff0Rd_Point;
		TxBuff0Rd_Point++;	
		*(volatile unsigned long*)INTMSK&=0x3fffef;		//Enable Tx interrupt of UART0
		URT_Flag0=1;
	}
	
	return(0);
}

void URT0_Tx_LISR(INT vect)
{
	//Check to see if we have sent all data
	//If Not then copy the current char pointed by TxBuff0Rd_Point to UTXBUF0
	if(TxBuff0Rd_Point!=TxBuff0Wt_Point)
		{
			//send the char i Txbuff0 to TxBuff egister 
			*(volatile unsigned long*)UTXBUF0 = (unsigned long)(*TxBuff0Rd_Point&0x0ff);
			//Update the TxBuff0Rd_Point to point to next char
			TxBuff0Rd_Point++;	
			if(TxBuff0Rd_Point>TxBuff0_Tail)TxBuff0Rd_Point = TxBuff0_Head;		
		}
	//If we have sent all data
	//Then reset URT_Flag0=0;
	//And disable UART TX Interrupt
	else 
		{
		URT_Flag0= 0;
		*(volatile unsigned long*)INTMSK|=0x10;		//Disable UART 0 Tx Interrupt
		}
}

void URT1_Tx_LISR(INT vect)
{
	//Check to see if we have sent all data
	//If Not then copy the current char pointed by TxBuff1Rd_Point to UTXBUF1
	if(TxBuff1Rd_Point!=TxBuff1Wt_Point)
		{
			//send the char i Txbuff0 to TxBuff egister 
			*(volatile unsigned long*)UTXBUF1 = (unsigned long)(*TxBuff1Rd_Point&0x0ff);
			TxBuff1Rd_Point++;
			if(TxBuff1Rd_Point>TxBuff1_Tail)TxBuff1Rd_Point = TxBuff1_Head;
		}
	else 
		{
		URT_Flag1 = 0;
		*(volatile unsigned long*)INTMSK|=0x40;		//Disable UART 1 Tx Interrupt
		}
}

void URT0_Rx_LISR(INT vect)
{
	//if( (*(volatile unsigned long*)USTAT0)&0x20)	//There ia a valid char in the RXbuff Register
	//	{
			*RxBuff0Wt_Point++ = (unsigned char)(*(volatile unsigned long*)URXBUF0&0x0ff);
			if(URT_Mode==0)//Received string is stoped by NU_NULL
				{
					if(*(RxBuff0Wt_Point-1)==0x0) NU_Activate_HISR(&URT_HISR0);
				}
  			
 			if(URT_Mode==1)//Received String is stoped by 0x0d,0x0a
 				{
					if(*(RxBuff0Wt_Point-1)==0xa) NU_Activate_HISR(&URT_HISR0); 
 				}

 			if(URT_Mode==2)
 				{
				if(RxBuff0Wt_Point>RxBuff0_Tail)NU_Activate_HISR(&URT_HISR0);
 				}
	//	}
}
void URT1_Rx_LISR(INT vect)
{
	//if( (*(volatile unsigned long*)USTAT1)&0x20)	//There ia a valid char in the RXbuff Register
	//	{
			*RxBuff1Wt_Point++ = (unsigned char)(*(volatile unsigned long*)URXBUF1&0x0ff);
			 if(URT_Mode1==0)//Received string is stoped by NU_NULL
				{
					if(*(RxBuff1Wt_Point-1)==0x0) NU_Activate_HISR(&URT_HISR1);
				}
  			
 			if(URT_Mode1==1)//Received String is stoped by 0x0d,0x0a
 				{
					if(*(RxBuff1Wt_Point-1)==0xa) NU_Activate_HISR(&URT_HISR1); 
 				}

			if(URT_Mode1==2)
 				{
				if(RxBuff1Wt_Point>RxBuff1_Tail)NU_Activate_HISR(&URT_HISR1);
				}
			
	//	}
}

void URT0_hisr(void)
{
	
	unsigned char i=0;
	UNSIGNED  dd;
	
	if(URT_Mode==0)//Received string is stoped by NU_NULL
		{
			for(RxBuff0Rd_Point=RxBuff0_Head;RxBuff0Rd_Point<RxBuff0Wt_Point;RxBuff0Rd_Point++)
				{
					command[i]=*RxBuff0Rd_Point;
					i++;
				}
			RxBuff0Rd_Point=RxBuff0Wt_Point=RxBuff0_Head;
			dd=(UNSIGNED)command;
			NU_Send_To_Pipe(&URT_Pipe, (VOID *)&dd,4, NU_NO_SUSPEND);	
		}
	i=0;
	if(URT_Mode==1)//Received String is stoped by 0x0d,0x0a	
		{
			for(RxBuff0Rd_Point=RxBuff0_Head;RxBuff0Rd_Point<RxBuff0Wt_Point-2;RxBuff0Rd_Point++)
				{
					command[i]=*RxBuff0Rd_Point;
					i++;
				}
			
			RxBuff0Rd_Point=RxBuff0Wt_Point=RxBuff0_Head;
			command[i]=0;
			dd=(UNSIGNED)command;
			NU_Send_To_Pipe(&URT_Pipe, (VOID *)&dd, 4, NU_NO_SUSPEND);	
		}
	if(URT_Mode==2)//Received String is stoped by 0x0d,0x0a	
		{
		for(i=0;i<BUFFSIZE;i++)Frame0[i]=Rxbuff0[i];
		dd=(UNSIGNED)Frame0;
		//send the pointer of Frame0 to pipe
		NU_Send_To_Pipe(&URT_Pipe, (VOID *)&dd, 4, NU_NO_SUSPEND);
		RxBuff0Wt_Point=RxBuff0_Head;
		}
}
void URT1_hisr(void)
{
	UNSIGNED  dd;
	unsigned char i=0;
	if(URT_Mode1==0)//Received string is stoped by NU_NULL
		{
			for(RxBuff1Rd_Point=RxBuff1_Head;RxBuff1Rd_Point<RxBuff1Wt_Point;RxBuff1Rd_Point++)
				{
					command1[i]=*RxBuff1Rd_Point;
					i++;
				}
			RxBuff1Rd_Point=RxBuff1Wt_Point=RxBuff1_Head;
			dd=(UNSIGNED)command1;
			NU_Send_To_Pipe(&URT_Pipe, (VOID *)&dd, 4, NU_NO_SUSPEND);
		}
	i=0;
	if(URT_Mode1==1)//Received String is stoped by 0x0d,0x0a	
		{
			for(RxBuff1Rd_Point=RxBuff1_Head;RxBuff1Rd_Point<RxBuff1Wt_Point-2;RxBuff1Rd_Point++)
				{
					command1[i]=*RxBuff1Rd_Point;
					i++;
				}
			
			RxBuff1Rd_Point=RxBuff1Wt_Point=RxBuff1_Head;
			command1[i]=0;
			dd=(UNSIGNED)command1;
			NU_Send_To_Pipe(&URT_Pipe, (VOID *)&dd, 4, NU_NO_SUSPEND);	
		}
	if(URT_Mode1==2)//Received String is stoped by 0x0d,0x0a	
		{
		for(i=0;i<BUFFSIZE;i++)Frame1[i]=Rxbuff1[i];
		dd=(UNSIGNED)Frame1;	
		//send the pointer of RxBuff0 to pipe
		NU_Send_To_Pipe(&URT_Pipe, (VOID *)&dd, 4, NU_NO_SUSPEND);
		RxBuff1Wt_Point=RxBuff1_Head;
		}
}

//void response(unsigned char *s)
//{
//	unsigned char n=0;
//	unsigned char s1[5];
//	unsigned char sX[20]="You input is: "; 
//	s1[0]=' ';
//	s1[1]='O';
//	s1[2]='K';
//	s1[3]=0x0d;
//	s1[4]=0x0a;
//	if(s)
//		{
			//*(volatile unsigned long*)UTXBUF0 = (unsigned long)s1[0];
//			do{
//			}while(URT_Flag0==1);
//			SendChar(0,(unsigned char *)sX, 14);
//			do{
//			}while(URT_Flag0==1);
//			do{
//				n++;
//			}while((*(s+n))!=0);
//			SendChar(0,(unsigned char *)s, n);
//			do{
//			}while(URT_Flag0==1);
//			SendChar(0,s1, 5);
//		}
//}




⌨️ 快捷键说明

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