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