#include "UART.h"
/****************************************
*函數名稱:UartInit
*輸 入:unFosc 晶振頻率
unBaud 波特率
*輸 出:無
*功 能:串口初始化
******************************************/
VOID UartInit(UINT32 unFosc,UINT32 unBaud)
{
P3_MFP &= ~(P31_TXD0 | P30_RXD0);
P3_MFP |= (TXD0 | RXD0); //P3.0 使能為串口0接收
//P3.1 使能為串口0發送
UART0_Clock_EN; //串口0時鐘使能
UARTClkSource_ex12MHZ; //串口時鐘選擇為外部晶振
CLKDIV &= ~(15<<8); //串口時鐘分頻為0
IPRSTC2 |= UART0_RST; //復位串口0
IPRSTC2 &= ~UART0_RST; //復位結束
UA0_FCR |= TX_RST; //發送FIFO復位
UA0_FCR |= RX_RST; //接收FIFO復位
UA0_LCR &= ~PBE; //校驗位功能取消
UA0_LCR &= ~WLS;
UA0_LCR |= WL_8BIT; //8位數據位
UA0_LCR &= NSB_ONE; //1位停止位
UA0_BAUD |= DIV_X_EN|DIV_X_ONE; //設置波特率分頻
UA0_BAUD |= ((unFosc / unBaud) -2); //波特率設置 UART_CLK/(A+2) = 115200, UART_CLK=12MHz
UA0_IER |= RDA_IEN; //接收數據中斷使能
NVIC_ISER |= UART0_INT; //使能串口0中斷
}
/****************************************
*函數名稱:UartSend
*輸 入:pBuf 發送數據緩沖區
unNumOfBytes 發送字節總數
*輸 出:無
*功 能:串口發送數據
******************************************/
VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
{
UINT32 i;
for(i=0; i<unNumOfBytes; i++)
{
UA0_THR = *(pBuf+i);
while ((UA0_FSR&TX_EMPTY) != 0x00); //檢查發送FIFO是否為空
}
}
/****************************************
*函數名稱:UART0_IRQHandler
*輸 入:無
*輸 出:無
*功 能:串口0中斷服務函數
******************************************/
VOID UART0_IRQHandler(VOID)
{
UINT8 ucData;
if(UA0_ISR & RDA_INT) //檢查是否接收數據中斷
{
while(UA0_ISR & RDA_IF) //獲取所有接收到的數據
{
while (UA0_FSR & RX_EMPTY); //檢查接收FIFO是否為空
ucData = UA0_RBR; //讀取數據
UartSend(&ucData,1); //發送數據
//以下測試接收數據用
if(ucData == 0x11) P2_DOUT &= ~0xff;
if(ucData == 0xff) P2_DOUT |= 0xff;
}
}
}
/****************************************
*函數名稱:main
*輸 入:無
*輸 出:無
*功 能:函數主體
******************************************/
INT32 main(VOID)
{
// unsigned char i,j;
PROTECT_REG
( //ISP下載時保護FLASH存儲器
PWRCON |= XTL12M_EN; //默認時鐘源為外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz時鐘穩定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //設置外部晶振為系統時鐘
//以下測試接收數據
//P2_PMD=0x5555; //GPIO設置為輸出模式
)
UartInit(12000000,9600); //波特率設置為9600bps
while(1)
{
/* j=0;
//發送數據0~255
for(i=0; i<256; i++)
{
UartSend(&j,1);
j++;
Delayms(50);
} */
}
}