现在的位置: 首页 > 综合 > 正文

[UART简单驱动介绍] 代码现成的加了注释看的清楚

2013年09月01日 ⁄ 综合 ⁄ 共 3698字 ⁄ 字号 评论关闭

定义通用串口结构
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;
}

抱歉!评论已关闭.