📄 drvuart.c
字号:
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 + -