📄 uarttest.c
字号:
//Description : The description of Function Pointer sholud be under 15 characters
#include "system.h"
#include "Uart.h"
#include "UartExterns.h"
#include "SfrReadWriten.h"
//SFR test
REGINFOn sRegInfoUART0[] =
{
//01234567890123 ..63 address reset uPrivateBitMask(1:do check)
// value
{"ULCON0 ", 0x50000000, 7-1 , RW, 0x0 , DPDB, 0 ,0},
{"UCON0 ", 0x50000004, 12-1, RW, 0x0 , DPDB, 0 ,0},
{"UFCON0[1/2]fifo reset, autoclear ", 0x50000008, 8-1 , RW, 0x0 , DPPB, 0xf7 ,0},
{"UMCON0 ", 0x5000000C, 8-1 , RW, 0x0 , DPPB, 0xf1 ,0},
{"UTRSTAT0 ", 0x50000010, 3-1 , RO, 0x6 , DPDB, 0 ,0},
{"UERSTAT0 ", 0x50000014, 4-1 , RO, 0x0 , DPDB, 0 ,0},
{"UFSTAT0 ", 0x50000018, 15-1, RO, 0x0 , DPPB, 0x7f7f ,0},
{"UMSTAT0 ", 0x5000001C, 5-1 , RO, 0x0 , DPPB, 0x11 ,0},
{"UTXH0(reset undet.) ", 0x50000020, 8-1 , WO, 0x0 , DPDB, 0 ,0},//reset undet.
{"URXH0(reset undet.) ", 0x50000024, 8-1 , RO, 0x0 , DPDB, 0 ,0},//reset undet.
{"UBRDIV0(reset undet.) ", 0x50000028, 16-1, RW, 0x0 , DPDB, 0 ,0},//reset undet.
{"UDIVSLOT0 ", 0x5000002C, 16-1, RW, 0x0 , DPDB, 0 ,0},
};
REGINFOn sRegInfoUART1[] =
{
//01234567890123 ..63 address reset uPrivateBitMask(1:do check)
//
{"ULCON1 ", 0x50004000, 7-1 , RW, 0x0 , DPDB, 0 ,0},
{"UCON1 ", 0x50004004, 12-1, RW, 0x0 , DPDB, 0 ,0},
{"UFCON0[1/2]fifo reset, autoclear ", 0x50004008, 8-1 , RW, 0x0 , DPPB, 0xf7 ,0},
{"UMCON1 ", 0x5000400C, 8-1 , RW, 0x0 , DPPB, 0xf1 ,0},
{"UTRSTAT1 ", 0x50004010, 3-1 , RO, 0x6 , DPDB, 0 ,0},
{"UERSTAT1 ", 0x50004014, 4-1 , RO, 0x0 , DPDB, 0 ,0},
{"UFSTAT1 ", 0x50004018, 15-1, RO, 0x0 , DPPB, 0x7f7f ,0},
{"UMSTAT1 ", 0x5000401C, 5-1 , RO, 0x0 , DPPB, 0x11 ,0},
{"UTXH1(reset undet.) ", 0x50004020, 8-1 , WO, 0x0 , DPDB, 0 ,0},//reset undet.
{"URXH1(reset undet.) ", 0x50004024, 8-1 , RO, 0x0 , DPDB, 0 ,0},//reset undet.
{"UBRDIV1(reset undet.) ", 0x50004028, 16-1, RW, 0x0 , DPDB, 0 ,0},//reset undet.
{"UDIVSLOT1 ", 0x5000402C, 16-1, RW, 0x0 , DPDB, 0 ,0},
};
REGINFOn sRegInfoUART2[] =
{
//01234567890123 ..63 address reset uPrivateBitMask(1:do check)
//
{"ULCON2 ", 0x50008000, 7-1 , RW, 0x0 , DPDB, 0 ,0},
{"UCON2 ", 0x50008004, 12-1, RW, 0x0 , DPDB, 0 ,0},
{"UFCON0[1/2]fifo reset, autoclear", 0x50008008, 8-1 , RW, 0x0 , DPPB, 0xf7 ,0},
{"UMCON2 ", 0x5000800C, 8-1 , RW, 0x0 , DPPB, 0xf1 ,0},
{"UTRSTAT2 ", 0x50008010, 3-1 , RO, 0x6 , DPDB, 0 ,0},
{"UERSTAT2 ", 0x50008014, 4-1 , RO, 0x0 , DPDB, 0 ,0},
{"UFSTAT2 ", 0x50008018, 15-1, RO, 0x0 , DPPB, 0x7f7f ,0},
{"UMSTAT2 ", 0x5000801C, 5-1 , RO, 0x0 , DPPB, 0x11 ,0},
{"UTXH2(reset undet.) ", 0x50008020, 8-1 , WO, 0x0 , DPDB, 0 ,0},//reset undet.
{"URXH2(reset undet.) ", 0x50008024, 8-1 , RO, 0x0 , DPDB, 0 ,0},//reset undet.
{"UBRDIV2(reset undet.) ", 0x50008028, 16-1, RW, 0x0 , DPDB, 0 ,0},//reset undet.
{"UDIVSLOT2 ", 0x5000802C, 16-1, RW, 0x0 , DPDB, 0 ,0},
};
REGINFOn sRegInfoUART3[] =
{
//01234567890123 ..63 address reset uPrivateBitMask(1:do check)
//
{"ULCON3 ", 0x5000C000, 7-1 , RW, 0x0 , DPDB, 0 ,0},
{"UCON3 ", 0x5000C004, 12-1, RW, 0x0 , DPDB, 0 ,0},
{"UFCON0[1/2]fifo reset, autoclear", 0x5000C008, 8-1 , RW, 0x0 , DPPB, 0xf7 ,0},
{"UTRSTAT3 ", 0x5000C010, 3-1 , RO, 0x6 , DPDB, 0 ,0},
{"UERSTAT3 ", 0x5000C014, 4-1 , RO, 0x0 , DPDB, 0 ,0},
{"UFSTAT3 ", 0x5000C018, 15-1, RO, 0x0 , DPPB, 0x7f7f ,0},
{"UTXH3(reset undet.) ", 0x5000C020, 8-1 , WO, 0x0 , DPDB, 0 ,0},//reset undet.
{"URXH3(reset undet.) ", 0x5000C024, 8-1 , RO, 0x0 , DPDB, 0 ,0},//reset undet.
{"UBRDIV3(reset undet.) ", 0x5000C028, 16-1, RW, 0x0 , DPDB, 0 ,0},//reset undet.
{"UDIVSLOT3 ", 0x5000C02C, 16-1, RW, 0x0 , DPDB, 0 ,0},
};
//Externs
extern bool TestSFRn(const REGINFOn* psRegInfo, int count);//sfrreadwriten.c
//Test Functions
bool UART_SFR_test();
void TestUart(void);
void Uart_LoopBack(void);
void TestUartbyMode(void);
void UART_ChangeConsole(void);
void UART_Selectport(void);
void UART_Selecttransfermode(void);
void UART_Configure(void);
// buffer for test
//char TestString[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx interrupt test is good!!!!\r";
char TestString[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx interrupt test is good!!!! ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx interrupt test is good!!!!\r";
//local
char *g_pTxString;
char *g_pRxString;
//char TestString[]="UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!!!!\r"; //Test string for Toggling Value on the oscilloscope
extern unsigned char g_UART_portTx;
extern unsigned char g_UART_portRx;
extern bool g_UART_bTXtest;
extern bool g_UART_bRXtest;
extern unsigned int g_UART_TXdatasize;
extern unsigned int g_UART_TXdatacnt;
extern unsigned int g_UART_RXdatasize;
extern unsigned int g_UART_RXdatacnt;
extern unsigned int g_UART_baudrate;
extern bool g_UART_EnableFifo;
extern unsigned char g_UART_TxTrig;
extern unsigned char g_UART_RxTrig;
extern bool g_UART_RXTimeOuten;
extern unsigned char g_UART_DmaRxDMD_HS;
extern unsigned char g_UART_DmaRxTSZ;
extern unsigned char g_UART_DmaTxDMD_HS;
extern unsigned char g_UART_DmaTxTSZ;
bool TestUartbyModePingpongtestDMA(void);
bool TestUartbyModePingpongtestInt(void);
bool TestUartbyModePingpongtestPolling(void);
void * func_uart_test[][2]=
{
(void *)UART_SFR_test , "UART SFR reset value, r/w test ",
(void *)TestUart , "UART Test ",
(void *)TestUartbyMode , "UART Test by Mode",
(void *)Uart_LoopBack, "loop back\n",
(void *)TestUartbyModePingpongtestPolling, "ping pong test Polling",
(void *)TestUartbyModePingpongtestInt, "ping pong test Interrup",
(void *)TestUartbyModePingpongtestDMA, "ping pong test DMA\n",
(void *)UART_Selecttransfermode,"Select transfer mode ",
(void *)UART_Configure , "Set for test",
(void *)UART_Selectport , "Select port ",
(void *)UART_ChangeConsole, "Change Console ",
0,0
};
void Test_UART(void)
{
int i;
printf("\n====== UART Test program start ======\n");
while(1)
{
i=0;
printf("\n\n");
while(1)
{ //display menu
printf("%2d:%s",i,func_uart_test[i][1]);
i++;
if((int)(func_uart_test[i][0])==0)
{
printf("\n");
break;
}
printf("\n");
}
printf("\nPress Enter key to exit : ");
i = GetIntNum();
if(i==-1) break; // return.
if(i>=0 && (i<((sizeof(func_uart_test)-1)/8)) ) // select and execute...
( (void (*)(void)) (func_uart_test[i][0]) )();
}
printf("\n====== UART Test program end ======\n");
}
//should execute at first
bool UART_SFR_test()
{
bool bret;
switch(g_UART_portTx)
{
case 0:
printf("test UART0\n");
bret=TestSFRn(sRegInfoUART0, sizeof(sRegInfoUART0)/sizeof(REGINFOn));
break;
case 1:
printf("test UART1\n");
bret=TestSFRn(sRegInfoUART1, sizeof(sRegInfoUART1)/sizeof(REGINFOn));
break;
case 2:
printf("test UART2\n");
bret=TestSFRn(sRegInfoUART2, sizeof(sRegInfoUART2)/sizeof(REGINFOn));
break;
case 3:
printf("test UART3\n");
bret=TestSFRn(sRegInfoUART3, sizeof(sRegInfoUART3)/sizeof(REGINFOn));
break;
}
return bret;
}
void TestUart(void)
{
unsigned char ch;
bool bret, bAFC2;
int strsize;
ch = UartConfig(&bAFC2);
UART_userguide(ch);
if( UartOpen(ch,1,bAFC2) == SENDBREAK )
{
printf("\n\nSend Break Signal has been transfered");
return;
}
// UART Tx test with interrupt
printf("\n[Uart channel %d Tx Test]\n",ch);
g_pTxString= (char* )UART_TXBUF;
UART_TxstrMake(g_pTxString, g_UART_TXdatasize);
TxString(ch, g_pTxString, g_UART_TXdatasize,0,0);
printf("\nTx Done~ \n");
printf("0x%x : rxfifo 0 \n", rUFSTAT0 );
// UART Rx test with interrupt
printf("\n[Uart channel %d Rx Test]\n",ch);
printf("Case 1 : Interrupt mode. After typing characters and pressing ENTER key.\n");
printf("Case 2 : Interrupt FIFO mode & DMA mode. After typing characters and pressing ENTER key until FIFO level trigger.\n");
printf(" Then, you will see those characters.\n");
// printf("\nRx : %s \n",RxString(ch));
g_pRxString=RxString(ch, (char *)UART_RXBUF, &bret, 0,0);
if(g_pRxString!=0)
{
bret = UART_RxstrVerify(g_pRxString, g_UART_RXdatasize);
printf("RX test result : %d, including return : %d\n", bret, g_UART_RXdatasize);
UART_RxstrPrint(g_pRxString, 100);
}
printf("\nRx Done~ \n");
// Test End
printf("\nComplete UART test!!! \n");
UartClose(ch, UART_DUPLEX0);
SetDbgUart(1); // change channel setting for debug port set
// Console(1);
}
//UART_TxstrMake(g_pTxString, g_UART_TXdatasize);
//UART_RxBufferClear(g_pRxString, g_UART_RXdatasize+2);//1mbyte
bool TestUartbyModePingpongUnit(unsigned char ch, UART_CON* pUartCon,
void (*func_start)(void), bool (*func_test)(void))
{
int strsize;
bool bret=1;
UART_assignUartCon(ch, pUartCon);
// UART_userguide(ch);
UART_SelectOpClock(pUartCon->cOpClock);
if( UartOpen(ch,1,(bool)pUartCon->fAfc) == SENDBREAK )
{
printf("\n\nSend Break Signal has been transfered");
return 1;
}
printf("\npress enter to start test\n");
//getchar();
// UART Tx test with interrupt
printf("\n[Uart channel %d Tx Test]\n",ch);
g_pTxString= (char* )UART_TXBUF;
TxString(ch, g_pTxString, g_UART_TXdatasize, func_start, func_test);
printf("\nTx Done~ \n");
printf("press enter to rx\n");
printf("0x%x : rxfifo 0 \n", rUFSTAT0 );
// UART Rx test with interrupt
g_pRxString= (char* )UART_RXBUF;
printf("\n[Uart channel %d Rx Test]\n",ch);
printf("Case 1 : Interrupt mode. After typing characters and pressing ENTER key.\n");
printf("Case 2 : Interrupt FIFO mode & DMA mode. After typing characters and pressing ENTER key until FIFO level trigger.\n");
printf(" Then, you will see those characters.\n");
//printf("\nRx : %s \n",RxString(ch));
g_pRxString=RxString(ch, (char *)UART_RXBUF, &bret, 0, 0);
if(g_pRxString!=0)
{
bret = UART_RxstrVerify(g_pRxString, g_UART_RXdatasize);
printf("RX test result : %d, including return : %d\n", bret, g_UART_RXdatasize);
UART_RxstrPrint(g_pRxString, 100);
}
printf("\nRx Done~ \n");
// Test End
printf("\nComplete UART test!!! \n");
UartClose(ch, UART_DUPLEX0);
SetDbgUart(1); // change channel setting for debug port set
return bret;
}
// /-- 0 : non fifo 1 : fifo
// / /- tx interrupt (1)
//interrupt test / / /-tx trigger level(1:16)
// | | | /-rx interrput (1)
// | | | | /- rx trigger level(3:32)
// | | | | | /- 0 : tx pulse
// | | | | | | /- 0 : rx pulse
// | | | | | | | /- 0 : tx interrupt
// | | | | | | | | /- 0 : rx interrupt
// | | | | | | | | | /- 1: rx error interrupt
static UART_CON UartConINTTxP[] ={{4000000 ,0,0,0,0, 3,3,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}//non fifo-ok[1/5]
,{4000000 ,0,0,0,1, 3,3,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}//fifo
,{4000000 ,0,0,0,1, 3,3,0,0,1, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}//fifo
,{4000000 ,0,0,0,1, 3,3,0,0,1, 2,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}//fifo
,{4000000 ,0,0,0,1, 3,3,0,0,1, 3,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}//fifo
};
static UART_CON UartConINTRxP[]={{4000000 ,0,0,0,0, 3,3,0,0,0, 0,1,0,0,0, 0,0,0,0,1, 0,0,0,0,0}//non fifo-[1/5]]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,0,0,0, 0,0,0,0,1, 0,0,0,0,0}//fifo-[2/5]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,1,0,0, 0,0,0,0,1, 0,0,0,0,0}//fifo[3/5]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,2,0,0, 0,0,0,0,1, 0,0,0,0,0}//fifo[4/5]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,3,0,0, 0,0,0,0,1, 0,0,0,0,0}//fifo[5/5]
};
static UART_CON UartConPollingTxP[] ={{4000000 ,0,0,0,0, 3,3,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0}//non fifo-ok[1/5]
,{4000000 ,0,0,0,1, 3,3,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0}//fifo
,{4000000 ,0,0,0,1, 3,3,0,0,1, 1,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0}//fifo
,{4000000 ,0,0,0,1, 3,3,0,0,1, 2,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0}//fifo
,{4000000 ,0,0,0,1, 3,3,0,0,1, 3,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0}//fifo
};
static UART_CON UartConPollingRxP[]={{4000000 ,0,0,0,0, 3,3,0,0,0, 0,1,0,0,0, 0,0,0,1,0, 0,0,0,0,0}//non fifo-[1/5]]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,0,0,0, 0,0,0,1,0, 0,0,0,0,0}//fifo-[2/5]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,1,0,0, 0,0,0,1,0, 0,0,0,0,0}//fifo[3/5]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,2,0,0, 0,0,0,1,0, 0,0,0,0,0}//fifo[4/5]
,{4000000 ,0,0,0,1, 3,3,0,0,0, 0,1,3,0,0, 0,0,0,1,0, 0,0,0,0,0}//fifo[5/5]
};
static UART_CON UartConDMATxP[] ={{4000000 ,0,0,0,0, 3,3,0,0,2, 0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0}
};
static UART_CON UartConDMARxP[]={{4000000 ,0,0,0,0, 3,3,0,0,0, 0,3,0,0,0, 0,0,0,0,0, 0,0,0,1,0}
};
//DMA
bool TestUartbyModePingpongtestDMA()
{
bool bret =0;
int failnum=0;
int i=0;
int j=0;
int jstart=0;
//g_UART_TXdatasize=1024;
g_UART_TXdatasize=1048574;//for dma
//g_UART_TXdatasize=10485760;
g_UART_RXdatasize=g_UART_TXdatasize;
g_UART_portTx=3;
g_UART_portRx=3;
g_pTxString= (char* )UART_TXBUF;
g_pRxString= (char* )UART_RXBUF;
UART_TxstrMake(g_pTxString, g_UART_TXdatasize);
if(g_UART_bTXtest)//tx
{
for(i=0;i<300;i++)
//for(i=0;i<5;i++)
{
//for(j=2;j<5;j++)
{
//Delay(100000);//100us order 1sec
Delay(30000);//100us order 1sec
bret=TestUartbyModePingpongUnit(g_UART_portTx, &UartConDMATxP[j], 0,0);//with out afc
if(!bret) failnum++;
printf("fail num : %d\n", failnum);
if(i==100) g_UART_portTx =2;
else if(i==200) g_UART_portTx =0;
}
//jstart=(jstart==2)?0:jstart+1;
}
}
else//rx
{
for(i=0;i<300;i++)
//for(i=0;i<5;i++)
{
//for(j=2;j<5;j++)
{
UART_RxBufferClear(g_pRxString, g_UART_RXdatasize+2);
bret=TestUartbyModePingpongUnit(g_UART_portRx, &UartConDMARxP[j], 0,0);//with out afc
if(!bret) failnum++;
printf("fail num : %d\n", failnum);
if(i==100) g_UART_portRx =2;
else if(i==200) g_UART_portRx =0;
}
}
}
if(!failnum) return 1;
else return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -