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