hal_uart.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 128 行

C
128
字号
//-----------------------------------------------------------------------------
// HAL_UART
//-----------------------------------------------------------------------------

#include "hal_uart.h"

//-----------------------------------------------------------------------------
// INIT & CONFIG
//-----------------------------------------------------------------------------
void UART_Init (void)
{
  UART->IER = 0x00;
  UART->CR  = 0x00;
  UART->RBR;
  UART->RRR = 0xFFFF;
  UART->TRR = 0xFFFF;
}

//-----------------------------------------------------------------------------
void UART_BaudRate_Config (u32 BaudRate)
{
  UART->BRR = (vu16)(SYSCLK/(16*BaudRate));
}

//-----------------------------------------------------------------------------
void UART_CR_Config (u16 what, u16 value)
{
  UART->CR = (UART->CR&~what)|(u16)value;
}

//-----------------------------------------------------------------------------
void UART_CR_OnOffConfig (u16 what, FunctionalState NewState)
{
  if (NewState == ENABLE)
    UART->CR |= what;
  else
    UART->CR &= ~what;
}

//-----------------------------------------------------------------------------
void UART_IT_Config (u16 what, FunctionalState NewState)
{
  if (NewState == ENABLE)
    UART->IER |= what;
  else
    UART->IER &= ~what;
}

//-----------------------------------------------------------------------------
void UART_Fifo_Reset (u16 what)
{
  if (what == UART_RxFIFO)
    UART->RRR=0xFFFF;
  else
    UART->TRR=0xFFFF;
}

//-----------------------------------------------------------------------------
// SEND
//-----------------------------------------------------------------------------
void UART_ByteSend (vu8 *Data)
{
  if (UART->CR & UART_FIFO_ENABLE)
    while (UART->SR & UART_TxFull);
  else
    while (!(UART->SR & UART_TxEmpty));

  UART->TBR = *Data;
}

//-----------------------------------------------------------------------------
void UART_DataSend (vu8 *Data, vu8 DataLength)
{
  vu8 *DataToSend;
  DataToSend = Data;

  while(DataLength--)
  {
    UART_ByteSend(DataToSend);
    DataToSend++;
  }
}

//-----------------------------------------------------------------------------
void UART_StringSend (vu8 *String)
{
  vu8 *Data = String;

  while(*Data != '\0')
    UART_ByteSend(Data++);

  *Data='\0';
  UART_ByteSend(Data);
}

//-----------------------------------------------------------------------------
// RECEIVE
//-----------------------------------------------------------------------------
u16 UART_ByteReceive (vu8 *Data, vu8 TimeOut)
{
  u16 wStatus;

  if (TimeOut != 0)
  {
     UART->TOR = TimeOut;
     while (!((wStatus = UART->SR) & (UART_TimeOutIdle|UART_RxHalfFull|UART_RxBufFull)));
  } else {
    UART->TOR = 0xFF;
    while (!((wStatus=UART->SR) & (UART_RxHalfFull|UART_RxBufFull)));
  }

  *Data = (u8)UART->RBR;
  return wStatus;
}

//-----------------------------------------------------------------------------
u16 UART_DataReceive (vu8 *Data, vu8 DataLength, vu8 TimeOut)
{
  u16 wStatus;

  while(DataLength--)
    wStatus = UART_ByteReceive(Data++,TimeOut);

  return wStatus;
}

//-----------------------------------------------------------------------------

⌨️ 快捷键说明

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