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

📄 drvuart.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 4 页
字号:
		NVIC_EnableIRQ(UART1_IRQn); 
	}
	else															    	/* Install Callback function */
    {
		g_pfnUART2callback = pfncallback;
		NVIC_EnableIRQ(UART0_IRQn); 
    }

}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvUART_DisableInt                                                                   	   */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*				 u32Port	   	  -[in] UART Channel:  UART_PORT0 / UART_PORT1  /  UART_PORT2              */
/*               u32InterruptFlag -[in]	DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSINT  */
/*										DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT      */
/* Returns:                                                                                                */
/*               None                                                                                      */
/* Description:                                                                                            */
/*               The function is used to disable UART specified interrupt, uninstall the call back         */
/*               function and disable NVIC UART IRQ                                                        */
/*---------------------------------------------------------------------------------------------------------*/
void DrvUART_DisableInt(E_UART_PORT u32Port,uint32_t u32InterruptFlag)
{
	if(u32Port == UART_PORT0)			   
	{
		outpw(&UART0->IER + u32Port,inpw(&UART0->IER + u32Port) &~u32InterruptFlag);	   /* Disable INT  */
	}
	
	if(u32InterruptFlag & DRVUART_TOUTINT)			  							 /* Disable Counter Enable */
	{
		if(u32Port == UART_PORT0)
			UART0->IER.RTO_IEN = 0;
		else if(u32Port == UART_PORT1)
			UART1->IER.RTO_IEN = 0;
		else
			UART2->IER.RTO_IEN = 0;
			
	}
	
	switch (u32Port)									   			 /* Disable Callback function and NVIC */
    {
        case UART_PORT0:
			g_pfnUART0callback = NULL;
            NVIC_DisableIRQ(UART0_IRQn);   
            break;

        case UART_PORT1:
			g_pfnUART1callback = NULL;
           	NVIC_DisableIRQ(UART1_IRQn);    
            break;
        
		case UART_PORT2:
			g_pfnUART2callback = NULL;
           	NVIC_DisableIRQ(UART0_IRQn);    
            break;

        default:
            break;
    }

}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvUART_ClearIntFlag                                                                  	   */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*				 u32Port	   		  -[in]   UART Channel:  UART_PORT0 / UART_PORT1  /UART_PORT2          */
/*               u32InterruptFlag     -[in]   DRVUART_MOSINT/DRVUART_RLSINT/DRVUART_THREINT 		  	   */
/*											  DRVUART_RDAINT/DRVUART_TOUTINT                               */
/* Returns:                                                                                                */
/*               E_SUCCESS      Successful                                                                 */
/* Description:                                                                                            */
/*               The function is used to clear UART specified interrupt flag                        	   */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvUART_ClearIntFlag(E_UART_PORT	u32Port,uint32_t u32InterruptFlag)
{
	UART_T * tUART;

	tUART = (UART_T *)((uint32_t)UART0 + u32Port); 

	if((u32InterruptFlag & DRVUART_RDAINT) == DRVUART_RDAINT)    			/* clear Rx read Interrupt */	   
		tUART->DATA;

	if((u32InterruptFlag & DRVUART_THREINT) == DRVUART_THREINT)    			/* clear Tx empty Interrupt */	   
	{
		tUART->DATA =0;														/* Write Data to TX FIFO to clear INT Flag */
	}	

	if((u32InterruptFlag & DRVUART_RLSINT)  == DRVUART_RLSINT)				/* clear Receive Line Status Interrupt */	   
	{
		tUART->FSR.BIF = 1;
		tUART->FSR.FEF = 1;
		tUART->FSR.PEF = 1;
	}

	if((u32InterruptFlag & DRVUART_MOSINT)  == DRVUART_MOSINT)				/* clear Modem Interrupt */	   
		tUART->MSR.DCTSF = 1;

  	if((u32InterruptFlag & DRVUART_TOUTINT) == DRVUART_TOUTINT)				/* clear Time-out Interrupt */	   
		tUART->DATA;

  	if((u32InterruptFlag & DRVUART_LININT)  == DRVUART_LININT)				/* clear LIN break Interrupt */	   
		tUART->ISR.LIN_RX_BREAK_IF = 1;

	if((u32InterruptFlag & DRVUART_BUFERRINT)  == DRVUART_BUFERRINT)		/* clear Buffer ErrorInterrupt */	   
	{
		tUART->FSR.TX_OVER_IF = 1;
		tUART->FSR.RX_OVER_IF = 1;
	}
	return E_SUCCESS;
}



/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvUART_GetIntStatus                                                                 	   */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*				 u32Port	   	  	  -[in]   UART Channel:  UART_PORT0 / UART_PORT1 / UART_PORT2          */
/*               u32InterruptFlag     -[in]   DRVUART_MOSINT / DRVUART_RLSINT / DRVUART_THREINT 		   */
/*											  DRVUART_RDAINT/DRVUART_TOUTINT                               */
/* Returns:                                                                                                */
/*               0: The specified interrupt is not happened.                                               */
/*               1: The specified interrupt is happened.                                                   */
/*               E_DRVUART_ARGUMENT: Error Parameter                                                       */
/* Description:                                                                                            */
/*               The function is used to get the interrupt status										   */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvUART_GetIntStatus(E_UART_PORT u32Port,uint32_t u32InterruptFlag)
{

	UART_T * tUART;

	tUART = (UART_T *)((uint32_t)UART0 + u32Port); 

	
	switch(u32InterruptFlag)
	{
		case DRVUART_MOSINT:				  		/* MODEM Status Interrupt */
				return tUART->ISR.MODEM_INT;
		
		case DRVUART_RLSINT:						/* Receive Line Status Interrupt */
				return tUART->ISR.RLS_INT;

		case DRVUART_THREINT:						/* Transmit Holding Register Empty Interrupt */
				return tUART->ISR.THRE_INT;

		case DRVUART_RDAINT:						/* Receive Data Available Interrupt */
				return tUART->ISR.RDA_INT;

		case DRVUART_TOUTINT:						/* Time-out Interrupt */
				return tUART->ISR.TOUT_INT;

		case DRVUART_LININT:						/* LIN Break Interrupt */
				return tUART->ISR.LIN_RX_BREAK_INT;

		case DRVUART_BUFERRINT:						/* Buffer Error Interrupt */
				return tUART->ISR.BUF_ERR_INT;

		default:
			return E_DRVUART_ARGUMENT;
	}
	
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvUART_GetCTSInfo				                                                           */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 u32Port	  	      -[in]   UART Channel:  UART_PORT0 / UART_PORT1                       */
/*               pu8CTSValue   		  -[out]   Buffer to store the CTS Value           	         		   */
/*                                             return current CTS pin state                                */
/*				 pu8CTSChangeState	  -[out]   Buffer to store the CTS Change State                        */
/*                                             return CTS pin status is changed or not 1:Changed 0:Not yet */
/* Returns:                                                                                                */
/*               None                                                                                      */
/* Description:                                                                                            */
/*               The function is used to get CTS pin value and detect CTS change state                     */
/*---------------------------------------------------------------------------------------------------------*/
void DrvUART_GetCTSInfo(E_UART_PORT u32Port,uint8_t *pu8CTSValue,	uint8_t	*pu8CTSChangeState)
{
	UART_T * tUART;

	tUART = (UART_T *)((uint32_t)UART0 + u32Port);  

 	*pu8CTSValue 		= tUART->MSR.CTS_ST;
	*pu8CTSChangeState 	= tUART->MSR.DCTSF;
}	

 
/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvUART_Read                                                                              */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*				 u32Port   	   	  	  -[in]   UART Channel:  UART_PORT0 / UART_PORT1  / UART_PORT2         */
/*               pu8RxBuf   		  -[in]   Specify the buffer to receive the data of receive FIFO       */
/*               u32ReadBytes  		  -[in]   Specify the bytes number of data.     		               */
/* Returns:                                                                                                */
/*               E_SUCCESS                                                                          	   */
/* Description:                                                                                            */
/*               The function is used to read Rx data from RX FIFO and the data will be stored in pu8RxBuf */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvUART_Read(E_UART_PORT	u32Port,uint8_t	*pu8RxBuf, uint32_t	u32ReadBytes)
{
    uint32_t  u32Count, u32delayno;

	UART_T * tUART;

	tUART = (UART_T *)((uint32_t)UART0 + u32Port);  

    for (u32Count=0; u32Count < u32ReadBytes; u32Count++)
    {
		 u32delayno = 0;
	     while (tUART->FSR.RX_EMPTY ==1)					    /* Check RX empty => failed */	   
	     {
	     	u32delayno++;        
	        if ( u32delayno >= 0x40000000 )        
	        	return E_DRVUART_ERR_TIMEOUT;               
         }
         pu8RxBuf[u32Count] = tUART->DATA;					    /* Get Data from UART RX  */
    }

⌨️ 快捷键说明

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