[UART簡單驅動介紹] 代碼現成的加了注釋看的清楚

來源:互聯網
上載者:User

定義通用串口結構
typedef volatile struct
{
  vu16 BR;  //baudrate register, 16bit valid, 裝入時鐘
  vu16 EMPTY1; //保留16位 ARM是32位寄存器只用到16位
  vu16 TxBUFR;  //傳輸寄存器
  vu16 EMPTY2;
  vu16 RxBUFR;  //接收寄存器
  vu16 EMPTY3; 
  vu16 CR;  //控制寄存器
  vu16 EMPTY4;
  vu16 IER;  //中斷寄存器
  vu16 EMPTY5;
  vu16 SR;  //狀態寄存器
  vu16 EMPTY6;
  vu16 GTR;  //時間保護寄存器
  vu16 EMPTY7;
  vu16 TOR;  //逾時寄存器
  vu16 EMPTY8;
  vu16 TxRSTR; //傳輸隊列重設寄存器
  vu16 EMPTY9;
  vu16 RxRSTR; //接收隊列重設寄存器
} UART_TypeDef;

串口使用結構
typedef enum
{
  UART_RxFIFO, //串口接收隊列
  UART_TxFIFO   //串口發送隊列
} UARTFIFO_TypeDef;  //隊列結構

typedef enum
{
  UART_EVEN_PARITY = 0x0000, //奇數同位
  UART_ODD_PARITY  = 0x0020, //偶校正
  UART_NO_PARITY    //無校正
} UARTParity_TypeDef;     //校正結構

typedef enum
{
  UART_0_5_StopBits  = 0x00,  //結束位05方式
  UART_1_StopBits    = 0x08,  //結束位1方式
  UART_1_5_StopBits  = 0x10,  //結束位15方式
  UART_2_StopBits    = 0x18   //結束位2方式
} UARTStopBits_TypeDef;      //結束位方式結構體

typedef enum
{
  UARTM_8D   = 0x01,  //資料轉送方式8data
  UARTM_7D_P = 0x03,  //資料轉送方式7data
  UARTM_9D   = 0x04,  //資料轉送方式9data
  UARTM_8D_W = 0x05,  //資料轉送方式8data+wakeup模式
  UARTM_8D_P = 0x07   //資料轉送方式8data+校正模式 
} UARTMode_TypeDef;     //資料轉送方式結構

//----使用一些定義量
// SR flags definition,與UARTn_SR&操作後得到相應的位
#define UART_TxFull          0x0200  //9bit
#define UART_RxHalfFull      0x0100  //8bit
#define UART_TimeOutIdle     0x0080  //7bit
#define UART_TimeOutNotEmpty 0x0040  //6bit
#define UART_OverrunError    0x0020  //5bit
#define UART_FrameError      0x0010  //4bit
#define UART_ParityError     0x0008  //3bit
#define UART_TxHalfEmpty     0x0004  //2bit
#define UART_TxEmpty         0x0002  //1bit
#define UART_RxBufFull       0x0001  //0bit

// CR regiter bit definition
#define UART_FIFOEnableBit 10   //
#define UART_RxEnableBit   8
#define UART_RunBit        7
#define UART_LoopBackBit   6
#define UART_ParityOddBit  5
#define UART_StopBits      3

// Stop bits definition
#define UART_05StopBits     0x00
#define UART_1StopBit       (0x01<<3)
#define UART_15StopBits     (0x02<<3)
#define UART_2StopBits      (0x03<<3)

// Modes definition
#define UART_8BitsData       0x01  //模式資料CR[2:0] 001
#define UART_7BitsData       0x03  //模式資料CR[2:0] 011
#define UART_9BitsData       0x04  //模式資料CR[2:0] 100
#define UART_8BitsDataWakeUp 0x05  //模式資料CR[2:0] 101
#define UART_8BitsDataParity 0x07  //模式資料CR[2:0] 111

//---實現功能
//配置UART的工作模式
inline void UART_ModeConfig(UART_TypeDef *UARTx, UARTMode_TypeDef UART_Mode)
{
 //傳入UARTx的結構,用結構中的CR寄存器[2:0]&UART_MODE再回寫給CR
  UARTx->CR = (UARTx->CR&0xFFF8)|(u16)UART_Mode;
}

//配置UART的停止位檢測模式
inline void UART_StopBitsConfig(UART_TypeDef *UARTx, UARTStopBits_TypeDef StopBits)

 //CR[4:3]&停止狀態回寫寄存器
  UARTx->CR = (UARTx->CR&0xFFE7)|(u16)StopBits;
}

//UART的保護時間設定
inline void UART_GuardTimeConfig(UART_TypeDef *UARTx, u16 GuardTime)
{
  UARTx->GTR = GuardTime;
}

//返回當前UART的狀態寄存器
inline u16 UART_FlagStatus(UART_TypeDef *UARTx)
{
  return UARTx->SR;
}

//初始話UART工作
void UART_Init(UART_TypeDef *UARTx)
{
  UARTx->IER = 0x00; //初始化串口中斷寄存器
  UARTx->CR = 0x00;  //初始化控制寄存器
  (void)UARTx->RxBUFR; 
  UARTx->RxRSTR = 0xFFFF; //清除RxFIFO移位寄存器內容
  UARTx->TxRSTR = 0xFFFF; //清除TxFIFO移位寄存器內容
}

//配置傳輸速率寄存器 
void UART_BaudRateConfig(UART_TypeDef *UARTx, u32 BaudRate)
{
  UARTx->BR = (u16)(RCCU_FrequencyValue(RCCU_FCLK)/(16*BaudRate));
}

//傳送一個位元組資料
void UART_ByteSend(UART_TypeDef *UARTx, u8 *Data)
{
 //CR中的FIFO允許則需要檢測TxFIFO中是否滿16位,如果滿16位則裝入發送資料
  if (UARTx->CR & (0x0001<<UART_FIFOEnableBit))// if FIFO ENABLED
    while((UARTx->SR & UART_TxFull)); // while the UART_TxFIFO contain 16 characters.
    //不允許FIFO關閉 則只能檢測傳輸TxFIFO為空白則裝入發送資料
  else                  // if FIFO DISABLED
    while (!(UARTx->SR & UART_TxEmpty)); // while the transmit shift register not empty
  UARTx->TxBUFR = *Data;
}

//接收一個位元組
u16 UART_ByteReceive(UART_TypeDef *UARTx, u8 *Data, u8 TimeOut)
{
   u16 wStatus;
   //傳入逾時大小
   UARTx->TOR=TimeOut;// reload the Timeout counter
   //檢測UART的逾時是否沒有逾時表示在接資料, 並且RXFIFO把資料彈進接收寄存器
   while (!((wStatus=UARTx->SR) & (UART_TimeOutIdle|UART_RxHalfFull|UART_RxBufFull)));
   *Data = (u8)UARTx->RxBUFR; // then read the Receive Buffer Register
   return wStatus;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.