lld_uart.c

来自「本程序为ST公司开发的源代码」· C语言 代码 · 共 1,337 行 · 第 1/5 页

C
1,337
字号
UART_tenSwitch LLD_UART_enSetRxEnable(UART_tenId enId, UART_tenSwitch enVal)
{
   UART_tenSwitch enTemp;

   if( UART_EN_0 == enId )
   {
      enTemp = rd16(Uart0,UART_CR,RxEnable);

      /* Return current value */
      if( UART_EN_CURRENT == enVal )
      {
         return(enTemp);
      }

      if( enTemp != enVal )
      {
         wr16(Uart0,UART_CR,RxEnable,enVal);
      }
   }
   else if( UART_EN_1 == enId )
   {
      enTemp = rd16(Uart1,UART_CR,RxEnable);

      /* Return current value */
      if( UART_EN_CURRENT == enVal )
      {
         return(enTemp);
      }

      if( enTemp != enVal )
      {
         wr16(Uart1,UART_CR,RxEnable,enVal);
      }
   }

   return(enVal);
}

/************************************************************************
*                                                                       *
* FUNCTIONS                                                             *
*                                                                       *
*      LLD_UART_enSetRun                                                *
*                                                                       *
* DESCRIPTION                                                           *
*                                                                       *
*      set/reset Run enable bit on UART_CR register		                *
*                                                                       *
*                                                                       *
* CALLS                                                                 *
*                                                                       *
*      LLD macros                                                       *
*                                                                       *
* INPUTS                                                                *
*                                                                       *
*      UART_tenId enId: Uart identificator                              *
*      UART_tenSwitch enVal: switch value                               *
*                                                                       *
* OUTPUTS                                                               *
*                                                                       *
*      UART_SWITCH val                                                  *
*                                                                       *
************************************************************************/
UART_tenSwitch LLD_UART_enSetRun(UART_tenId enId, UART_tenSwitch enVal)
{
   UART_tenSwitch enTemp;

   if( UART_EN_0 == enId )
   {
      enTemp = rd16(Uart0,UART_CR,Run);

      /* Return current value */
      if( UART_EN_CURRENT == enVal )
      {
         return(enTemp);
      }

      if( enTemp != enVal )
      {
         wr16(Uart0,UART_CR,Run,enVal);
      }
   }
   else if( UART_EN_1 == enId )
   {
      enTemp = rd16(Uart1,UART_CR,Run);

      /* Return current value */
      if( UART_EN_CURRENT == enVal )
      {
         return(enTemp);
      }

      if( enTemp != enVal )
      {
         wr16(Uart1,UART_CR,Run,enVal);
      }
   }

   return(enVal);
}


/************************************************************************
*                                                                       *
* FUNCTIONS                                                             *
*                                                                       *
*      LLD_UART_vSetParity                                              *
*                                                                       *
* DESCRIPTION                                                           *
*                                                                       *
*      set/reset Parity bit on UART_CR register                         *
*                                                                       *
*                                                                       *
* CALLS                                                                 *
*                                                                       *
*      LLD macros                                                       *
*                                                                       *
* INPUTS                                                                *
*                                                                       *
*      UART_tenId enId: Uart identificator                              *
*      UART_tenParity enVal: switch value                               *
*                                                                       *
* OUTPUTS                                                               *
*                                                                       *
*      UART_SWITCH val                                                  *
*                                                                       *
************************************************************************/
tVoid LLD_UART_vSetParity(UART_tenId enId, UART_tenParity enVal)
{
   if( (enId >= UART_EN_0 ) || ( enId <= UART_EN_1) )
   {
      if( UART_EN_NONE == enVal )
      {
         if( (arUARTSetting[enId].tMode == UART_EN_EIGHT_BITS_PA) )
         {
            LLD_UART_vSetMode(enId, UART_EN_EIGHT_BITS);
         }
         if( (arUARTSetting[enId].tMode == UART_EN_SEVEN_BITS_PA) )
         {
            /* No 7 Bit transmission without parity supported by HW */
            LLD_UART_vSetMode(enId, UART_EN_EIGHT_BITS);
         }
      }
      else
      {
         UART_tenParity enTemp, enParityVal, enRunStat;

         /* Bit value to be set */
         enParityVal = (UART_EN_EVEN == enVal) ? UART_EN_OFF : UART_EN_ON;

         if( UART_EN_0 == enId )
         {
            enRunStat = rd16(Uart0,UART_CR,Run);    /* Read current status */
            wr16(Uart0,UART_CR,Run,UART_EN_OFF);    /* Stop UART before set register */

            enTemp = rd16(Uart0,UART_CR,ParityOdd);
            if( enTemp != enParityVal )
            {
               wr16(Uart0,UART_CR,ParityOdd,enParityVal);
            }

            wr16(Uart0,UART_CR,Run,enRunStat);     /* Restore status */
         }
         else if( UART_EN_1 == enId )
         {
            enRunStat = rd16(Uart1,UART_CR,Run);    /* Read current status */
            wr16(Uart1,UART_CR,Run,UART_EN_OFF);    /* Stop UART before set register */

            enTemp = rd16(Uart1,UART_CR,ParityOdd);
            if( enTemp != enParityVal )
            {
               wr16(Uart1,UART_CR,ParityOdd,enParityVal);
            }

            wr16(Uart1,UART_CR,Run,enRunStat);     /* Restore status */
         }

         /* @@@@ToDo 18.11.2002 Ka:  */
         /* switch the mode to enable parity */
         if( arUARTSetting[enId].tMode == UART_EN_EIGHT_BITS )
         {
            LLD_UART_vSetMode(enId, UART_EN_EIGHT_BITS_PA);
         }
         if( arUARTSetting[enId].tMode == UART_EN_SEVEN_BITS_PA )
         {
            LLD_UART_vSetMode(enId, UART_EN_SEVEN_BITS_PA);
         }
      }
      arUARTSetting[enId].tParity = enVal;
   }
}

/************************************************************************
*                                                                       *
* FUNCTIONS                                                             *
*                                                                       *
*      LLD_UART_vSetStopBits                                            *
*                                                                       *
* DESCRIPTION                                                           *
*                                                                       *
*      set stop bit filed on UART_CR register                           *
*                                                                       *
*                                                                       *
* CALLS                                                                 *
*                                                                       *
*      LLD macros                                                       *
*                                                                       *
* INPUTS                                                                *
*                                                                       *
*      UART_tenId enId: Uart identificator                              *
*      UART_tenStopBits enStopBits: Stop bit number                     *
*                                                                       *
* OUTPUTS                                                               *
*                                                                       *
*      None                                                             *
*                                                                       *
************************************************************************/
tVoid LLD_UART_vSetStopBits(UART_tenId enId, UART_tenStopBits enStopBits)
{
   UART_tenParity enRunStat;

   if( UART_EN_0 == enId )
   {
      enRunStat = rd16(Uart0,UART_CR,Run);    /* Read current status */
      wr16(Uart0,UART_CR,Run,UART_EN_OFF);    /* Stop UART before set register */

      /* read to mem comp to avoid other bits to be overwrite */
      wr16(Uart0,UART_CR,StopBits,enStopBits);

      wr16(Uart0,UART_CR,Run,enRunStat);     /* Restore status */
      arUARTSetting[enId].tStopBits = enStopBits;
   }
   else if( UART_EN_1 == enId )
   {
      enRunStat = rd16(Uart1,UART_CR,Run);    /* Read current status */
      wr16(Uart1,UART_CR,Run,UART_EN_OFF);    /* Stop UART before set register */

      /* read to mem comp to avoid other bits to be overwrite */
      wr16(Uart1,UART_CR,StopBits,enStopBits);

      wr16(Uart1,UART_CR,Run,enRunStat);     /* Restore status */
      arUARTSetting[enId].tStopBits = enStopBits;
   }
}

/************************************************************************
*                                                                       *
* FUNCTIONS                                                             *
*                                                                       *
*      LLD_UART_vSetMode                                                *
*                                                                       *
* DESCRIPTION                                                           *
*                                                                       *
*      set mode bit filed on UART_CR register                           *
*                                                                       *
*                                                                       *
* CALLS                                                                 *
*                                                                       *
*      LLD macros                                                       *
*                                                                       *
* INPUTS                                                                *
*                                                                       *
*      UART_tenId enId: Uart identificator                              *
*      UART_tenMode enMode: Mode identificator                          *
*            

⌨️ 快捷键说明

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