⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 C
📖 第 1 页 / 共 2 页
字号:
  UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_8;
  UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_4;
  UART_InitStructure.UART_Parity = UART_Parity_No;
  SCU_BRCLKDivisorConfig(SCU_BRCLK_Div2);

  switch(Uart)
  {
  case UART_0:
    pUart0RxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
    if(pUart0RxFifo == NULL)
    {
      return(FALSE);
    }
    pUart0TxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
    if(pUart0TxFifo == NULL)
    {
      free(pUart0RxFifo);
      return(FALSE);
    }
    // Init receive and transmit FIFOs
    pUart0RxFifo->PopIndx = pUart0RxFifo->PushIndx = \
    pUart0TxFifo->PopIndx = pUart0TxFifo->PushIndx = 0;

    // Release reset and enable clock
    UART_DeInit(UART0);
    // Enable UART0 and PORTs clocks
    SCU_APBPeriphClockConfig(__UART0 | __GPIO3 | __GPIO5, ENABLE);
    // Release UART0 and PORTs reset
    SCU_APBPeriphReset(__UART0 | __GPIO3 | __GPIO5,DISABLE);

    // Assign GPIO 3.4 to UART0 (Tx)
    GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
    GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
    GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
    GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_Init(GPIO3, &GPIO_InitStructure);

    // Assign GPIO 5.1 to UART0 (Rx)
    GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
    GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
    GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
    GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_Init (GPIO5, &GPIO_InitStructure);

    // Init UART0
    UART_Init(UART0,&UART_InitStructure);
    UART_DMACmd(UART0,UART_DMAReq_Tx | UART_DMAReq_Rx, DISABLE);

    // Enable and configure the priority of the UART0 Update IRQ Channel
    VIC_Config(UART0_ITLine, VIC_IRQ, IntrPriority);
    VIC_ITCmd(UART0_ITLine, ENABLE);

    // Enable UART0 interrupts
    UART_ITConfig(UART0, UART_IT_OverrunError   |
                         UART_IT_BreakError     |
                         UART_IT_ParityError    |
                         UART_IT_FrameError     |
                         UART_IT_ReceiveTimeOut |
                         UART_IT_Transmit       |
                         UART_IT_Receive        , ENABLE);

    // Enable the UART0
    UART_Cmd(UART0, ENABLE);
    break;
  case UART_1:
    pUart1RxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
    if(pUart1RxFifo == NULL)
    {
      return(FALSE);
    }
    pUart1TxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
    if(pUart1TxFifo == NULL)
    {
      free(pUart1RxFifo);
      return(FALSE);
    }
    // Init receive and transmit FIFOs
    pUart1RxFifo->PopIndx = pUart1RxFifo->PushIndx = \
    pUart1TxFifo->PopIndx = pUart1TxFifo->PushIndx = 0;

    // Enable UART1 and PORTs clocks
    SCU_APBPeriphClockConfig(__UART1 | __GPIO3, ENABLE);
    // Release UART1 and PORTs reset
    SCU_APBPeriphReset(__UART1 | __GPIO3,DISABLE);

    // Assign GPIO 3.3 to UART1 (Tx)
    GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
    GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
    GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
    GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIO3, &GPIO_InitStructure);

    // Assign GPIO 3.2 to UART1 (Rx)
    GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
    GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
    GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIO3, &GPIO_InitStructure);

    // Init UART1
    UART_Init(UART1,&UART_InitStructure);
    UART_DMACmd(UART1,UART_DMAReq_Tx | UART_DMAReq_Rx, DISABLE);

    // Enable and configure the priority of the UART1 Update IRQ Channel
    VIC_Config(UART1_ITLine, VIC_IRQ, IntrPriority);
    VIC_ITCmd(UART1_ITLine, ENABLE);

    // Enable UART1 interrupts
    UART_ITConfig(UART1, UART_IT_OverrunError   |
                         UART_IT_BreakError     |
                         UART_IT_ParityError    |
                         UART_IT_FrameError     |
                         UART_IT_ReceiveTimeOut |
                         UART_IT_Transmit       |
                         UART_IT_Receive        , ENABLE);

    // Enable the UART1
    UART_Cmd(UART1, ENABLE);
    break;
  case UART_2:
    pUart2RxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
    if(pUart2RxFifo == NULL)
    {
      return(FALSE);
    }
    pUart2TxFifo = (pUartFifo_t)malloc(sizeof(UartFifo_t));
    if(pUart2TxFifo == NULL)
    {
      free(pUart2RxFifo);
      return(FALSE);
    }
    // Init receive and transmit FIFOs
    pUart2RxFifo->PopIndx = pUart2RxFifo->PushIndx = \
    pUart2TxFifo->PopIndx = pUart2TxFifo->PushIndx = 0;

    // Enable UART2 and PORTs clocks
    SCU_APBPeriphClockConfig(__UART2 | __GPIO3, ENABLE);
    // Release UART2 and PORTs reset
    SCU_APBPeriphReset(__UART2 | __GPIO3,DISABLE);

    // Assign GPIO 3.0 to UART2 (Tx)
    GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
    GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
    GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
    GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIO3, &GPIO_InitStructure);

    // Assign GPIO 3.1 to UART2 (Rx)
    GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
    GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
    GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_Init(GPIO3, &GPIO_InitStructure);

    // Init UART2
    UART_Init(UART2,&UART_InitStructure);
    UART_DMACmd(UART2,UART_DMAReq_Tx | UART_DMAReq_Rx, DISABLE);

    // Enable and configure the priority of the UART2 Update IRQ Channel
    VIC_Config(UART2_ITLine, VIC_IRQ, IntrPriority);
    VIC_ITCmd(UART2_ITLine, ENABLE);

    // Enable UART2 interrupts
    UART_ITConfig(UART2, UART_IT_OverrunError   |
                         UART_IT_BreakError     |
                         UART_IT_ParityError    |
                         UART_IT_FrameError     |
                         UART_IT_ReceiveTimeOut |
                         UART_IT_Transmit       |
                         UART_IT_Receive        , ENABLE);

    // Enable the UART2/
    UART_Cmd(UART2, ENABLE);
  default:
    return(FALSE);
  }
  return(TRUE);
}

/*************************************************************************
 * Function Name: UartSetLineCoding
 * Parameters:  UartNum_t Uart,UART_InitTypeDef pUartCoding
 *
 * Return: None
 *
 * Description: Init UART Baud rate, Word width, Stop bits, Parity type
 *
 *************************************************************************/
void UartSetLineCoding(UartNum_t Uart,UART_InitTypeDef UartCoding)
{
UART_InitTypeDef  UART_InitStructure;
UART_TypeDef * pUart;

  UART_StructInit(&UART_InitStructure);

  switch(Uart)
  {
  case UART_0:
    pUart = UART0;
    break;
  case UART_1:
    pUart = UART1;
    break;
  case UART_2:
    pUart = UART2;
    break;
  default:
    return;
  }

  UART_InitStructure.UART_WordLength = UartCoding.UART_WordLength;
  UART_InitStructure.UART_StopBits   = UartCoding.UART_StopBits;
  UART_InitStructure.UART_Parity     = UartCoding.UART_Parity;
  UART_InitStructure.UART_BaudRate   = UartCoding.UART_BaudRate;

  UART_Init(pUart,&UART_InitStructure);

}

/*************************************************************************
 * Function Name: UartRead
 * Parameters:  UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize
 *
 * Return: Int32U
 *
 * Description: Read received data from UART.
 *              Return number of readied characters
 *
 *************************************************************************/
Int32U UartRead(UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize)
{
Int32U Count;
pUartFifo_t pUartFifo;

  switch(Uart)
  {
  case UART_0:
    pUartFifo = pUart0RxFifo;
    break;
  case UART_1:
    pUartFifo = pUart1RxFifo;
    break;
  case UART_2:
    pUartFifo = pUart2RxFifo;
    break;
  default:
    return(0);
  }

  for (Count = 0; Count < BufferSize; ++Count)
  {
    if(!FifoPop(pUartFifo,pBuffer+Count))
    {
      break;
    }
  }
  return(Count);
}

/*************************************************************************
 * Function Name: UartWrite
 * Parameters:  UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize
 *
 * Return: Int32U
 *
 * Description: Write a data to UART. Return number of successful
 *  transmitted bytes
 *
 *************************************************************************/
Int32U UartWrite(UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize)
{
Int32U Count = 0;
Int8U Data;
pUartFifo_t pUartFifo;
UART_TypeDef * pUart;
Int32U Save;

  switch(Uart)
  {
  case UART_0:
    pUart = UART0;
    pUartFifo = pUart0TxFifo;
    break;
  case UART_1:
    pUart = UART1;
    pUartFifo = pUart1TxFifo;
    break;
  case UART_2:
    pUart = UART2;
    pUartFifo = pUart2TxFifo;
    break;
  default:
    return(0);
  }

  if(BufferSize != 0)
  {
    for ( ; Count < BufferSize; ++Count)
    {
      if(!FifoPush(pUartFifo,*(pBuffer+Count)))
      {
        break;
      }
    }

    if(UART_GetFlagStatus(UART0,UART_FLAG_TxFIFOFull) != SET)
    {
      do
      {
        Save = __get_interrupt_state();
        __disable_interrupt();
        if(!FifoPop(pUart0TxFifo,&Data))
        {
          __set_interrupt_state(Save);
          // The tx software FIFO is empty
          break;
        }
        UART_SendData(pUart,Data);
        __set_interrupt_state(Save);
      }
      while(UART_GetFlagStatus(UART0,UART_FLAG_TxFIFOFull) != SET);
    }

  }
  return(Count);
}

/*************************************************************************
 * Function Name: UartGetUartEvents
 * Parameters:  UartNum_t Uart
 *
 * Return: UartLineEvents_t
 *
 * Description: Get Uart Line events (PE,OE, FE, BI)
 *
 *************************************************************************/
UartLineEvents_t UartGetUartLineEvents (UartNum_t Uart)

{
UartLineEvents_t  LineEvents;
  LineEvents.Data = 0;
  switch(Uart)
  {
  case UART_0:
    LineEvents.Data = AtomicExchange(LineEvents.Data,
                                     &Uart0LineEvents.Data);
    break;
  case UART_1:
    LineEvents.Data = AtomicExchange(LineEvents.Data,
                                     &Uart1LineEvents.Data);
    break;
  case UART_2:
    LineEvents.Data = AtomicExchange(LineEvents.Data,
                                     &Uart2LineEvents.Data);
    break;
  }
  return(LineEvents);
}

/*************************************************************************
 * Function Name: UartSetUartLineState
 * Parameters:  UartNum_t Uart UartNum_t Uart, Boolean Break
 *
 * Return: none
 *
 * Description: Set Uart Break Event
 *
 *************************************************************************/
void UartSetUartLineState (UartNum_t Uart, Boolean Break)
{
UART_TypeDef * pUart;

  if(Break == FALSE)
  {
    return;
  }

  switch(Uart)
  {
  case UART_0:
    pUart = UART0;
    break;
  case UART_1:
    pUart = UART1;
    break;
  case UART_2:
    pUart = UART2;
    break;
  default:
    return;
  }
  UART_SendBreak(pUart);
}

⌨️ 快捷键说明

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