定義通用串口結構
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;
}