lld_uart.c
来自「本程序为ST公司开发的源代码」· C语言 代码 · 共 1,337 行 · 第 1/5 页
C
1,337 行
* *
* LLD_UART_vConfigUart *
* *
* DESCRIPTION *
* *
* Config both uarts pins and install interrupt manager *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* None *
* *
* OUTPUTS *
* *
* None *
* *
************************************************************************/
tVoid LLD_UART_vConfigUart(tVoid)
{
LLD_UART_vStopUartRxTx(UART_EN_0);
LLD_UART_vStopUartRxTx(UART_EN_1);
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_vInitUart *
* *
* DESCRIPTION *
* *
* Init uart peripheral *
* *
* CALLS *
* *
* uart reset, LLD macros *
* *
* INPUTS *
* *
* UART_ID id: Uart identificator *
* *
* OUTPUTS *
* *
* None *
* *
************************************************************************/
tVoid LLD_UART_vInitUart(UART_tenId enId,
tS8 *ps8wrBuff,
tU32 u32wrBuffSize,
tS8 *ps8rdBuff,
tU32 u32rdBuffSize,
tS32 baudRate,
UART_tenStopBits stopBits,
UART_tenMode mode,
UART_tenParity parity)
{
if( UART_EN_0 == enId )
{
wr16_reg(Uart0,UART_CR,0x0000); /* Reset control register */
wr16_reg(Uart0,UART_IER,0x0000); /* Reset interrupt enable register */
}
else if( UART_EN_1 == enId )
{
wr16_reg(Uart1,UART_CR,0x0000); /* Reset control register */
wr16_reg(Uart1,UART_IER,0x0000); /* Reset interrupt enable register */
}
if( (enId >= UART_EN_0) && (enId <= UART_EN_1) )
{
/* Init comunication control block */
arUartBuffCtrl[enId].ps8wrBuffer = ps8wrBuff; /* write buffer start address */
arUartBuffCtrl[enId].u32wrBuffSize = u32wrBuffSize; /* Size of write-Buffer */
arUartBuffCtrl[enId].ps8wrBufferISR = ps8wrBuff; /* Pointer to Tx Fifo buffer used by ISR */
arUartBuffCtrl[enId].ps8wrBufferDEV = ps8wrBuff; /* Pointer to Tx Fifo buffer used by DEVICE */
arUartBuffCtrl[enId].u32wrNbytes = (tU32)0x0; /* Number of bytes to be Tx */
arUartBuffCtrl[enId].u32wrNumberOfOverflowBytes = 0;
arUartBuffCtrl[enId].u32wrNumberOfOverflows = 0;
arUartBuffCtrl[enId].ps8rdBuffer = ps8rdBuff; /* Read buffer start address */
arUartBuffCtrl[enId].u32rdBuffSize = u32rdBuffSize; /* Rx fifo buffer max length */
arUartBuffCtrl[enId].ps8rdBufferISR = ps8rdBuff; /* Pointer to Rx fifo buffer */
arUartBuffCtrl[enId].ps8rdBufferDEV = ps8rdBuff; /* Pointer Rx fifo buffer */
arUartBuffCtrl[enId].u32rdNbytes = (tU32)0x0; /* Number of Bytes in Read buffer */
arUartBuffCtrl[enId].u32rdNumberOfOverflowBytes = 0;
arUartBuffCtrl[enId].u32rdNumberOfOverflows = 0;
arUartStatus[enId].enTxState = UART_EN_IDLE;
arUartStatus[enId].enTxFull = FALSE;
arUartStatus[enId].enRxState = UART_EN_IDLE;
arUartStatus[enId].enRxFull = FALSE;
LLD_UART_enSetRun(enId,UART_EN_OFF);
LLD_UART_vSetBaudRate(enId,baudRate);
LLD_UART_SetTimeOut(enId,0);
LLD_UART_vSetStopBits(enId,stopBits);
LLD_UART_vSetMode(enId,mode);
LLD_UART_vSetParity(enId,parity);
}
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_vStopUart *
* *
* DESCRIPTION *
* *
* Stop uart peripheral activity *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_ID id: Uart identificator *
* *
* OUTPUTS *
* *
* None *
* *
************************************************************************/
tVoid LLD_UART_vStopUartRxTx(UART_tenId enId)
{
if( UART_EN_0 == enId )
{
wr16_reg(Uart0,UART_IER,0x0000); /* Reset interrupt enable register */
while( !rd16(Uart0, UART_SR, TxEmpty) ); /* Wait Tx fifo to be empty */
wr16(Uart0,UART_CR,RxEnable,0x0); /* Disable Rx */
/* Empty Rx fifo:
Read data from Rx buffer until RxBuffFull flag is cleared
*/
while( rd16(Uart0, UART_SR, RxBuffFull) )
{
LLD_UART_s8ReadRxBuffer(UART_EN_0);
}
}
else if( UART_EN_1 == enId )
{
wr16_reg(Uart1,UART_IER,0x0000); /* Reset interrupt enable register */
while( !rd16(Uart1, UART_SR, TxEmpty) ); /* Wait Tx fifo to be empty */
wr16(Uart1,UART_CR,RxEnable,0x0); /* Disable Rx */
/* Empty Rx fifo:
Read data from Rx buffer until RxBuffFull flag is cleared
*/
while( rd16(Uart1, UART_SR, RxBuffFull) )
{
LLD_UART_s8ReadRxBuffer(UART_EN_1);
}
}
if( (enId >= UART_EN_0) && (enId <= UART_EN_1) )
{
arUartBuffCtrl[enId].ps8wrBuffer = NULL; /* write buffer start address */
arUartBuffCtrl[enId].u32wrBuffSize = 0; /* Size of write-Buffer */
arUartBuffCtrl[enId].ps8wrBufferISR = NULL; /* Pointer to Tx Fifo buffer used by ISR */
arUartBuffCtrl[enId].ps8wrBufferDEV = NULL; /* Pointer to Tx Fifo buffer used by DEVICE */
arUartBuffCtrl[enId].u32wrNbytes = 0x0; /* Number of bytes to be Tx */
arUartBuffCtrl[enId].u32wrNumberOfOverflowBytes = 0;
arUartBuffCtrl[enId].u32wrNumberOfOverflows = 0;
arUartBuffCtrl[enId].ps8rdBuffer = NULL; /* Read buffer start address */
arUartBuffCtrl[enId].u32rdBuffSize = 0; /* Rx fifo buffer max length */
arUartBuffCtrl[enId].ps8rdBufferISR = NULL; /* Pointer to Rx fifo buffer */
arUartBuffCtrl[enId].ps8rdBufferDEV = NULL; /* Pointer Rx fifo buffer */
arUartBuffCtrl[enId].u32rdNbytes = 0x0; /* Number of Bytes in Read buffer */
arUartBuffCtrl[enId].u32rdNumberOfOverflowBytes = 0;
arUartBuffCtrl[enId].u32rdNumberOfOverflows = 0;
arUartStatus[enId].enTxState = UART_EN_UNKNOWN;
arUartStatus[enId].enTxFull = FALSE;
arUartStatus[enId].enRxState = UART_EN_UNKNOWN;
arUartStatus[enId].enRxFull = FALSE;
}
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_vTxReset *
* *
* DESCRIPTION *
* *
* Clear Tx fifo *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_ID id: Uart identificator *
* *
* OUTPUTS *
* *
* None *
* *
************************************************************************/
tVoid LLD_UART_vTxReset(UART_tenId enId)
{
if( UART_EN_0 == enId )
{
wr16_reg(Uart0,UART_TxRSTR,0xFFFF); /* Reset Tx fifo */
}
else if( UART_EN_1 == enId )
{
wr16_reg(Uart1,UART_TxRSTR,0xFFFF); /* Reset Tx fifo */
}
}
/************************************************************************
* *
* FUNCTIONS *
* *
* LLD_UART_RxReset *
* *
* DESCRIPTION *
* *
* Clear Rx fifo *
* *
* CALLS *
* *
* LLD macros *
* *
* INPUTS *
* *
* UART_ID id: Uart identificator *
* *
* OUTPUTS *
* *
* None *
* *
************************************************************************/
tVoid LLD_UART_vRxReset(UART_tenId enId)
{
if( UART_EN_0 == enId )
{
wr16_reg(Uart0,UART_RxRSTR,0xFFFF); /* Reset Rx fifo */
}
else if( UART_EN_1 == enId )
{
wr16_reg(Uart1,UART_RxRSTR,0xFFFF); /* Reset Rx fifo */
}
/* @@@@ToDo 15.11.2002 Ka: Clear Buffer */
arUartBuffCtrl[enId].ps8rdBufferISR = arUartBuffCtrl[enId].ps8rdBuffer; /* Pointer to Rx fifo buffer */
arUartBuffCtrl[enId].ps8rdBufferDEV = arUartBuffCtrl[enId].ps8rdBuffer; /* Pointer Rx fifo buffer */
arUartBuffCtrl[enId].u32rdNbytes = (tU32)0x0; /* Number of Bytes in Read buffer */
arUartBuffCtrl[enId].u32rdNumberOfOverflowBytes = 0;
arUartBuffCtrl[enId].u32rdNumberOfOverflows = 0;
LLD_UART_s8ReadRxBuffer(enId); /* Clear Overrun bit */
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?