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 + -
显示快捷键?