📄 drvuart.c
字号:
/* */
/* Description: */
/* The function is used to initialize UART. It consists of baud-rate, parity, data-bits, */
/* stop-bits, rx-trigger-level and timeout interval settings. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvUART_Open(E_UART_PORT u32Port, STR_UART_T *sParam)
{
UART_T * tUART;
/*-----------------------------------------------------------------------------------------------------*/
/* Check UART port */
/*-----------------------------------------------------------------------------------------------------*/
if ((u32Port != UART_PORT0) &&
(u32Port != UART_PORT1) &&
(u32Port != UART_PORT2))
{
return E_DRVUART_ERR_PORT_INVALID;
}
/*-----------------------------------------------------------------------------------------------------*/
/* Check the supplied parity */
/*-----------------------------------------------------------------------------------------------------*/
if ((sParam->u8cParity != DRVUART_PARITY_NONE) &&
(sParam->u8cParity != DRVUART_PARITY_EVEN) &&
(sParam->u8cParity != DRVUART_PARITY_ODD) &&
(sParam->u8cParity != DRVUART_PARITY_MARK) &&
(sParam->u8cParity != DRVUART_PARITY_SPACE))
{
return E_DRVUART_ERR_PARITY_INVALID;
}
/*-----------------------------------------------------------------------------------------------------*/
/* Check the supplied number of data bits */
/*-----------------------------------------------------------------------------------------------------*/
else if ((sParam->u8cDataBits != DRVUART_DATABITS_5) &&
(sParam->u8cDataBits != DRVUART_DATABITS_6) &&
(sParam->u8cDataBits != DRVUART_DATABITS_7) &&
(sParam->u8cDataBits != DRVUART_DATABITS_8))
{
return E_DRVUART_ERR_DATA_BITS_INVALID;
}
/*-----------------------------------------------------------------------------------------------------*/
/* Check the supplied number of stop bits */
/*-----------------------------------------------------------------------------------------------------*/
else if ((sParam->u8cStopBits != DRVUART_STOPBITS_1) &&
(sParam->u8cStopBits != DRVUART_STOPBITS_2) &&
(sParam->u8cStopBits != DRVUART_STOPBITS_1_5)
)
{
return E_DRVUART_ERR_STOP_BITS_INVALID;
}
/*-----------------------------------------------------------------------------------------------------*/
/* Check the supplied nember of trigger level bytes */
/*-----------------------------------------------------------------------------------------------------*/
else if ((sParam->u8cRxTriggerLevel != DRVUART_FIFO_1BYTES) &&
(sParam->u8cRxTriggerLevel != DRVUART_FIFO_4BYTES) &&
(sParam->u8cRxTriggerLevel != DRVUART_FIFO_8BYTES) &&
(sParam->u8cRxTriggerLevel != DRVUART_FIFO_14BYTES)&&
(sParam->u8cRxTriggerLevel != DRVUART_FIFO_30BYTES)&&
(sParam->u8cRxTriggerLevel != DRVUART_FIFO_46BYTES)&&
(sParam->u8cRxTriggerLevel != DRVUART_FIFO_62BYTES))
{
return E_DRVUART_ERR_TRIGGERLEVEL_INVALID;
}
if(u32Port == UART_PORT0)
{
/* Reset IP */
SYS->IPRSTC2.UART0_RST = 1;
SYS->IPRSTC2.UART0_RST = 0;
/* Enable UART clock */
SYSCLK->APBCLK.UART0_EN = 1;
}
else if(u32Port == UART_PORT1)
{
/* Reset IP */
SYS->IPRSTC2.UART1_RST = 1;
SYS->IPRSTC2.UART1_RST = 0;
/* Enable UART clock */
SYSCLK->APBCLK.UART1_EN = 1;
}
else
{
/* Reset IP */
SYS->IPRSTC2.UART2_RST = 1;
SYS->IPRSTC2.UART2_RST = 0;
/* Enable UART clock */
SYSCLK->APBCLK.UART2_EN = 1;
}
tUART = (UART_T *)((uint32_t)UART0 + u32Port);
/* Tx FIFO Reset & Rx FIFO Reset & FIFO Mode Enable */
tUART->FCR.TFR =1;
tUART->FCR.RFR =1;
/* Set Rx Trigger Level */
tUART->FCR.RFITL = sParam->u8cRxTriggerLevel;
/* Set Parity & Data bits & Stop bits */
tUART->LCR.SPE =((sParam->u8cParity)&0x4)?1:0;
tUART->LCR.EPE =((sParam->u8cParity)&0x2)?1:0;
tUART->LCR.PBE =((sParam->u8cParity)&0x1)?1:0;
tUART->LCR.WLS =sParam->u8cDataBits;
tUART->LCR.NSB =sParam->u8cStopBits;
/* Set Time-Out */
tUART->TOR.TOIC =sParam->u8TimeOut;
/* Check Clock Source */
if(SYSCLK->PWRCON.XTL12M_EN)
SYSCLK->CLKSEL1.UART_S = 0;
else
{
if(SYSCLK->PLLCON.PD==0)
SYSCLK->CLKSEL1.UART_S = 1;
else
if(SYSCLK->PWRCON.OSC22M_EN)
SYSCLK->CLKSEL1.UART_S = 3;
else
return E_DRVUART_ERR_OPEN;
}
/* Set BaudRate */
BaudRateCalculator(GetUartClk(), sParam->u32BaudRate, u32Port);
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvUART_Close */
/* */
/* Parameters: */
/* u32Port -[in] UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2 */
/* RETURN */
/* None */
/* Description: */
/* The function is used to disable UART clock, disable ISR and clear callback */
/* function pointer after checking the TX empty. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvUART_Close(E_UART_PORT u32Port)
{
if(u32Port == UART_PORT1)
{
while(!UART1->FSR.TE_FLAG);
SYSCLK->APBCLK.UART1_EN = 0;
g_pfnUART1callback = NULL;
NVIC_DisableIRQ (UART1_IRQn);
}
else if(u32Port == UART_PORT2)
{
while(!UART2->FSR.TE_FLAG);
SYSCLK->APBCLK.UART2_EN = 0;
g_pfnUART2callback = NULL;
NVIC_DisableIRQ (UART0_IRQn);
}
else
{
while(!UART0->FSR.TE_FLAG);
SYSCLK->APBCLK.UART0_EN = 0;
g_pfnUART0callback = NULL;
NVIC_DisableIRQ(UART0_IRQn);
}
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvUART_EnableInt */
/* */
/* 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 */
/* pfncallback -[in] A function pointer for callback function */
/* Returns: */
/* None */
/* Description: */
/* The function is used to enable specified UART interrupt, install the callback */
/* function and enable NVIC UART IRQ */
/*---------------------------------------------------------------------------------------------------------*/
void
DrvUART_EnableInt(
E_UART_PORT u32Port,
uint32_t u32InterruptFlag,
PFN_DRVUART_CALLBACK pfncallback
)
{
UART_T * tUART;
tUART = (UART_T *)((uint32_t)UART0 + u32Port);
tUART->IER.RDA_IEN =(u32InterruptFlag & DRVUART_RDAINT)?1:0 ;
tUART->IER.THRE_IEN =(u32InterruptFlag & DRVUART_THREINT)?1:0;
tUART->IER.RLS_IEN =(u32InterruptFlag & DRVUART_RLSINT)?1:0;
tUART->IER.MODEM_IEN =(u32InterruptFlag & DRVUART_MOSINT)?1:0;
tUART->IER.TIME_OUT_EN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out count enable */
tUART->IER.RTO_IEN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out INT enable */
tUART->IER.BUF_ERR_IEN =(u32InterruptFlag & DRVUART_BUFERRINT)?1:0;
tUART->IER.WAKE_EN =(u32InterruptFlag & DRVUART_WAKEUPINT)?1:0;
tUART->IER.LIN_RX_BRK_IEN=(u32InterruptFlag & DRVUART_LININT)?1:0;
if(u32Port == UART_PORT0) /* Install Callback function */
{
g_pfnUART0callback = pfncallback;
NVIC_EnableIRQ(UART0_IRQn);
}
else if(u32Port == UART_PORT1) /* Install Callback function */
{
g_pfnUART1callback = pfncallback;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -