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

📄 uart.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 4 页
字号:
		if(*uartRxStr == '\0') break;
		uartRxStr++;
		}

	Uart_TxEmpty(0);
	Uart_Port_Return();						// Restore GPIO port state
	Uart_TxEmpty(1);
	Delay(1000);
}

void Uart0_Rx_Interrupt_Fifo(void)
{
	Uart_Port_Init();							// GPIO port init.

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS

	uartRxStr=RxBUFFER;
	RxBufferClear();

	IsRxDone=FALSE;

	Uart_FunctionSet(CH0,DISABLE,INTORPOL);	// Tx -> Disable, Rx -> Interrupt
	Uart_FifoLvSet(0,TX48BYTE,RX16BYTE);		// Tx Trigger Level is not necessary
//	Uart_FifoLvSet(0,TX48BYTE,RX32BYTE);		// Tx Trigger Level is not necessary	

//	rUMCON0 = (1<<4);						// AFC Enable
	
	pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;

	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);

	while(IsRxDone==FALSE);

	rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
	rINTMSK |= (BIT_UART0);
	
	uartRxStr=RxBUFFER;
	
	while(1) {
		printf("%c",*uartRxStr);
		if(*uartRxStr == '\0') break;
		uartRxStr++;
		}

	Uart_TxEmpty(0);
	Uart_Port_Return();						// Restore GPIO port state
	Uart_TxEmpty(1);
	Delay(1000);
}

void Uart0_Rx_DMA3(void)
{
	int i;
	
	Uart_Port_Init();							// GPIO port init.

	printf("Only DMA Tx must be used !!!\n");
	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS
	Uart_FifoDisable(0);

	uartRxStr=RxBUFFER;
	RxBufferClear();

	Uart_Rx_DMA3_Set();
	Uart_FunctionSet(CH0,DISABLE,DMAREQ0);	// Rx -> DMA Request, Tx -> Disable

	while(IsRxDone==FALSE);

	rINTMSK|=(BIT_DMA3);
	
//	for(i=0;i<96;i++)
	for(i=0;i<96;i++)
		printf("%c",*(uartRxStr+i));
	
	Uart_TxEmpty(0);
	Uart_Port_Return();						// Restore GPIO port state
	Uart_TxEmpty(1);
	Delay(1000);
}

void Uart0_Rx_DMA3_Fifo(void)
{
	int i;
	
	Uart_Port_Init();							// GPIO port init.

	printf("Only DMA Tx must be used !!!\n");
	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS

	uartRxStr=RxBUFFER;
	RxBufferClear();

	Uart_Rx_DMA3_Set();
	Uart_FunctionSet(CH0,DISABLE,DMAREQ0);	// Rx -> DMA Request, Tx -> Disable
	rUCON0 |= (3<<8);						// Tx, Rx => Interrupt Type is Level
	Uart_FifoLvSet(0,TX48BYTE,RX16BYTE);		// Rx Trigger Level is not necessary
	
	while(IsRxDone==FALSE);

	rINTMSK|=(BIT_DMA3);
	
	for(i=0;i<96;i++)
		printf("%c",*(uartRxStr+i));
	
	Uart_TxEmpty(0);
	Uart_Port_Return();						// Restore GPIO port state
	Uart_TxEmpty(1);
	Delay(1000);
}

void Uart0_Tx_Fifo_TrigLv(void)
{
	U32 in;
	
	printf("This Test Item is Tx FIFO Trigger Level Test !!!\n");
	printf("The Rx Trriger Buffer is 1Byte!\n");
	printf("The String Size is 236Byte\n");
	do {
		printf("Select FIFO Trigger Level : [0] Empty  [1] 16-byte	[2] 32-byte  [3] 48-byte =>");
		in=GetIntNum();
		} while(in>3);

	switch(in) {
		case 0:
			printf("Tx FIFO Trigger Level [Empty]\n");
			break;
		case 1:
			printf("Tx FIFO Trigger Level [16-byte]\n");
			break;
		case 2:
			printf("Tx FIFO Trigger Level [32-byte]\n");
			break;
		case 3:
			printf("Tx FIFO Trigger Level [48-byte]\n");
			break;
		}
	
	Uart_Port_Init();							// GPIO port init.

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_FunctionSet(CH0,INTORPOL,DISABLE);	// Tx -> Polling, Rx -> Disable
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS
//	Uart_BaudRateSet(CH0,96000);			// Channel 0, 115200BPS
	Uart_FifoLvSet(0,in,RX1BYTE);		// Rx Trigger Level is not necessary

	uartTxStr=TestString3;
	RxBufferClear();
	IsTxDone=FALSE;
	
	pISR_UART0 = (U32)UART0_Tx_Fifo_ISR;
	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_TXD0);

	while(IsTxDone==FALSE);

	rINTSUBMSK |= (BIT_SUB_TXD0);
	rINTMSK |= (BIT_UART0);
	
//	printf ("Interrupt Number = %d",iIRQ_TX);
//	iIRQ_TX = 0;
	
	Uart_Port_Return();						// Restore GPIO port state
}

void Uart0_Tx_Fifo_TrigLv_Jung(void)
{
	U32 in;
	U32 iIndex;
	char cIndex = 0;

	Uart_Port_Init();
	
	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_FunctionSet(CH0,INTORPOL,DISABLE);	
	Uart_BaudRateSet(CH0,115200);			
	Uart_FifoDisable(0);
		
	//UART1 Setting
	Uart_DataFormatSet(1,NP,1,8);				// Channel 1, No Parity, One Stop Bit, 8-Bit Data
	Uart_FunctionSet(CH1,DISABLE,INTORPOL);	
	Uart_BaudRateSet(CH1,115200);			
	Uart_FifoEnable(1);
	rUCON1 &= ~(1<<7); //Time Interrupt Disable
	Uart_FifoLvSet(1,0,2);		// Rx Trigger Level is 16Byte
	RxBufferClear();

	IsRxDone=FALSE;

	pISR_UART1 = (U32)UART1_Rx_Fifo_ISR_Jung;
	rINTMSK &= ~(BIT_UART1);
	rINTSUBMSK &= ~(BIT_SUB_RXD1);

	uartRxStr=RxBUFFER;
		
	while(1)
	{
		while(!(rUTRSTAT1 & 0x1)); //Receive data ready
		*uartRxStr = RdURXH1();
		uartRxStr++;
		if (IsRxDone == TRUE) break;
	}
	
	rINTSUBMSK |= (BIT_SUB_RXD1);
	rINTMSK |= (BIT_UART1);

	printf("IRQ      == %d\n",iIRQ);
	printf("Addreas  == %x\n", uartRxStr );
	
	uartTxStr = RxBUFFER;
	
	printf("Check Memory\n");	
	getchar();
	
	while(1)
	{
		WrUTXH0(*uartTxStr);
		if ( *uartTxStr == '\0' )
		{
			break;
		}
		uartTxStr++;
	}
	
	Uart_Port_Return();						// Restore GPIO port state
}


void Uart0_Rx_Fifo_TrigLv(void)
{
	U32 in,i;
	
	printf("This Test Item is Rx FIFO Trigger Level Test !!!\n");
	printf("The Tx Trigger Buffer is 48Byte!\n");
	printf("The String Size is 236Byte\n");
	do {
		printf("Select FIFO Trigger Level : [0] 1-byte  [1] 8-byte	[2] 16-byte  [3] 32-byte =>");
		in=GetIntNum();
		} while(in>3);

	switch(in) {
		case 0:
			printf("Rx FIFO Trigger Level [1-byte]\n");
			break;
		case 1:
			printf("Rx FIFO Trigger Level [8-byte]\n");
			break;
		case 2:
			printf("Rx FIFO Trigger Level [16-byte]\n");
			break;
		case 3:
			printf("Rx FIFO Trigger Level [32-byte]\n");
			break;
		}

	Uart_Port_Init();							// GPIO port init.

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS
//	Uart_BaudRateSet(CH0,96000);			// Channel 0, 96000BPS

	uartRxStr=RxBUFFER;
	RxBufferClear();

	IsRxDone=FALSE;

	Uart_FunctionSet(CH0,DISABLE,INTORPOL);	// Tx -> Disable, Rx -> INT or POLL
	rUCON0 &= ~(1<<7); //Time Interrupt Disable
	Uart_FifoLvSet(0,TX48BYTE,in);		// Rx Trigger Level is not necessary
	
	pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);

	while(1) {
		if(Uart_GetKey()) {
			*uartRxStr='\0';
//			printf("IRQ Number = %d\n", iIRQ);
			break;
				}
		}

	rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
	rINTMSK |= (BIT_UART0);
	
	uartRxStr=RxBUFFER;
	
	while(1) {
		printf("%c",*uartRxStr);
		if(*uartRxStr == '\0') break;
		uartRxStr++;
		}

	Uart_Port_Return();						// Restore GPIO port state
	Uart_TxEmpty(1);
	Delay(1000);
	iIRQ = 0;
}

void Uart0_TxRx_LoopBack_Test(void)
{
	U32 TxDone, RxDone;
	Uart_Port_Init();							// GPIO port init.

//	SelectUartClockSource(0,USYSCLK);
//	SelectUartClockSource(0,UPCLK);

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_FunctionSet(CH0,INTORPOL,INTORPOL);	// Tx -> Polling, Rx -> Disable
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS
	Uart_FifoDisable(0);
	rUCON0 |= (1<<5);						// Loopback mode
	
	uartTxStr=TestString1;
	uartRxStr=RxBUFFER;
	RxBufferClear();

	TxDone=1;
	RxDone=1;
	while(TxDone||RxDone) {
		if(TxDone) {
			if(rUTRSTAT0&0x4) {
				WrUTXH0(*uartTxStr);
				if(*uartTxStr == '\0') TxDone=0;
				uartTxStr++;
				}
			}
		if(RxDone) {
			if(rUTRSTAT0&0x1) {
				*uartRxStr=RdURXH0();
				if(*uartRxStr == '\0') RxDone=0;
				uartRxStr++;
				}
			}
		}

	uartRxStr=RxBUFFER;
	
//	SelectUartClockSource(0,UPCLK);
	Uart_Port_Return();						// Restore GPIO port state

	while(1) {
		printf("%c",*uartRxStr);
		if(*uartRxStr == '\0') break;
		uartRxStr++;
		}
}

void Uart0_Afc_nRTS_TrigLv(void)
{
	Uart_Port_Init();							// GPIO port init.

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_BaudRateSet(CH0,115200);			// Channel 0, 115200BPS

	uartRxStr=RxBUFFER;
	RxBufferClear();

	IsRxDone=FALSE;

	Uart_FunctionSet(CH0,DISABLE,INTORPOL);	// Tx -> Disable, Rx -> Interrupt
	Uart_FifoLvSet(0,TX48BYTE,RX16BYTE);		// Tx Trigger Level is not necessary
	rUMCON0 = (0<<5)|(1<<4);				// AFC Enable

	
	pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);

	while(IsRxDone==FALSE) {
		if(Uart_GetKey()) break;
		}

	rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
	rINTMSK |= (BIT_UART0);
	
	uartRxStr=RxBUFFER;
	
	while(1) {
		printf("%c",*uartRxStr);
		if(*uartRxStr == '\0') break;
		uartRxStr++;
		}

	Uart_Port_Return();						// Restore GPIO port state

	Delay(200);
}

void Uart0_Tx_MaxSpeed(void)
{
	Uart_Port_Init();							// GPIO port init.

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_FunctionSet(CH0,INTORPOL,DISABLE);	// Tx -> Polling, Rx -> Disable
	Uart_BaudRateSet(CH0,921600);			// Channel 0, 460800BPS
	Uart_FifoLvSet(0,TX48BYTE,RX1BYTE);		// Rx Trigger Level is not necessary
//	rUMCON0 = (1<<4);						// AFC Enable

//	uartTxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx int with fifo test is First!!!!\r\n1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ->UART Tx int with fifo test is Second!!!!\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx int with fifo test is Third!!!!\r\n";
	uartTxStr=TestString3;

	IsTxDone=FALSE;
	
	pISR_UART0 = (U32)UART0_Tx_Fifo_ISR;
	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_TXD0);

	while(IsTxDone==FALSE);

	rINTSUBMSK |= (BIT_SUB_TXD0);
	rINTMSK |= (BIT_UART0);
	
	Uart_Port_Return();						// Restore GPIO port state
}

void Uart0_Rx_MaxSpeed(void)
{
	Uart_Port_Init();							// GPIO port init.

	Uart_DataFormatSet(0,NP,1,8);				// Channel 0, No Parity, One Stop Bit, 8-Bit Data
	Uart_BaudRateSet(CH0,921600);			// Channel 0, 115200BPS

	uartRxStr=RxBUFFER;
	RxBufferClear();

	IsRxDone=FALSE;

	Uart_FunctionSet(CH0,DISABLE,INTORPOL);	// Tx -> Disable, Rx -> Interrupt
	Uart_FifoLvSet(0,TX48BYTE,RX16BYTE);		// Tx Trigger Level is not necessary
//	rUMCON0 = (1<<4);						// AFC Enable

	
	pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);

	while(IsRxDone==FALSE);

	rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
	rINTMSK |= (BIT_UART0);
	
	uartRxStr=RxBUFFER;
	
	while(1) {
		printf("%c",*uartRxStr);
		if(*uartRxStr == '\0') break;
		uartRxStr++;
		}

	Uart_TxEmpty(0);
	Uart_Port_Return();						// Restore GPIO port state
	Uart_TxEmpty(1);	

	Delay(1000);
}

//=============================================================================================//

void Uart_Tx_DMA1_Set(void)
{
	IsTxDone=FALSE;							// DMA is not done

	pISR_DMA1 = (unsigned)Uart_Dma1Tx_Int;	// DMA1 ISR Address Mapping
	rINTMSK&=~(BIT_DMA1);    					// Interrupt Mask Disable, Interrupt Enable

	rDISRC1=(unsigned)uartTxStr;				//Source Address of Memory
	rDISRCC1=(0<<1)|(0);						//AHB(Memory), inc
	rDIDST1=(unsigned)0x50000020;				//Destination Address of UTXH0 Register
	rDIDSTC1=(1<<1)|(1);						//APB(SPI), fix
	rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(96);//96
	rDMAREQSEL1=(19<<1)|(1<<0);				// HWSRC SPI0 TX
	rDMASKTRIG1=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
}

void Uart_Rx_DMA3_Set(void)
{
	IsRxDone=FALSE;							// DMA is not done
	
	pISR_DMA3 = (unsigned)Uart_Dma3Rx_Int;
	rINTMSK&=~(BIT_DMA3);	

	rDISRC3=(unsigned)0x50000024;				//Address of URXH0 Register
	rDISRCC3=(1<<1)|(1);						//APB(SPI), fix
	rDIDST3=(unsigned)uartRxStr;				//Address of Memory
	rDIDSTC3=(0<<1)|(0);						//AHB(Memory), inc
	rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(96);
	rDMAREQSEL3=(19<<1)|(1<<0);
	rDMASKTRIG3=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
}

//=============================================================================================//
void __irq UART0_Tx_ISR(void)
{
	rINTSUBMSK |= (BIT_SUB_TXD0);
	rINTMSK |= (BIT_UART0);
	
	rSUBSRCPND=BIT_SUB_TXD0;	// Clear Sub int pending        
	ClearPending(BIT_UART0);		// Clear source pending

	if(*uartTxStr == '\0') {
		WrUTXH0(*uartTxStr);
	       IsTxDone=TRUE;	
		}
	else {
		WrUTXH0(*uartTxStr);
		uartTxStr++;
		}

	rINTMSK &= ~(BIT_UART0);
	rINTSUBMSK &= ~(BIT_SUB_TXD0);
}

#if 0
void __irq UART0_Tx_ISR(void)
{
	rINTSUBMSK |= (BIT_SUB_TXD0);
	rINTMSK |= (BIT_UART0);
	
	rSUBSRCPND=BIT_SUB_TXD0;	// Clear Sub int pending        
	ClearPending(BIT_UART0);		// Clear source pending
	
	WrUTXH0(*uartTxStr);

	if(*uartTxStr == '\0')
		IsTxDone=TRUE;		
	else {
		uartTxStr++;
		rINTMSK &= ~(BIT_UART0);
		rINTSUBMSK &= ~(BIT_SUB_TXD0);
		}
}
#endif

void __irq UART0_Tx_Fifo_ISR(void)
{
	rINTSUBMSK |= (BIT_SUB_TXD0);
	rINTMSK |= (BIT_UART0);
	
	rSUBSRCPND=BIT_SUB_TXD0;	// Clear Sub int pending        
	ClearPending(BIT_UART0);		// Clear source pending

	while(!(rUFSTAT0&(1<<14)))
	{
		WrUTXH0(*uartTxStr);

		if(*uartTxStr == '\0')

⌨️ 快捷键说明

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