📄 uart.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 + -