串口操作,首先是功率,時(shí)鐘控制打開(kāi)。然后是管腳選擇,設(shè)置為串口模式。
本文引用地址:http://cafeforensic.com/article/201611/319422.htm然后設(shè)定串口傳輸數(shù)據(jù)格式。
波特率設(shè)置,(主意有小數(shù)位和沒(méi)小數(shù)位時(shí)候不一樣,有小數(shù)位需要設(shè)置DIVADDL和MULVAL)。
然后鎖存波特率。
設(shè)定控制UARTn RX和TX FIFO的操作。
最后打開(kāi)系統(tǒng)中UART0的中斷,使能接收中斷。
詳見(jiàn)代碼,代碼中有詳細(xì)注釋。
- #include<
LPC17XX.h>
#defineFOSC12000000 #defineFCCLK(FOSC*8) #defineFCCO(FCCLK*3) #defineFPCLK(FCCLK/4) intUart0RecvBuf;//UART0RXDATAvoidUart0Init(uint32_tbps){LPC_SC->PCONP|=(1<<3); //打開(kāi)UART0功率、時(shí)鐘控制位LPC_PINCON->PINSEL0=0X00000050;//P0.2P0.3設(shè)置為串口LPC_UART0->LCR=0x83; //設(shè)置串口數(shù)據(jù)格式,8位字符長(zhǎng)度,1個(gè)停止位,無(wú)校驗(yàn), //使能訪問(wèn)除數(shù)鎖存器,設(shè)定波特率LPC_UART0->DLM=((FPCLK/16)/bps)/256;//除數(shù)高八位,沒(méi)有小數(shù)情況LPC_UART0->DLL=((FPCLK/16)/bps)%256; //除數(shù)第八位LPC_UART0->LCR=0x03; //禁止訪問(wèn)除數(shù)鎖存器,鎖定波特率LPC_UART0->FCR=0x07; //控制UARTnRX和TXFIFO的操作。接收數(shù)據(jù)一個(gè)字節(jié)觸發(fā)中斷NVIC_EnableIRQ(UART0_IRQn); LPC_UART0->IER=0x01; //使能接收中斷}intUart0RecvByte(void)//查詢法{//當(dāng)UnRBR包含未讀字符時(shí),UnLSR[0]就會(huì)被置位;當(dāng)UARTnRBRFIFO為空時(shí),UnLSR[0]就會(huì)被清零//0-UnRBR為空//1-UnRBR包含有效數(shù)據(jù)while(!((LPC_UART0->LSR)&0x01));//等待判斷LSR[0]是否是1,1時(shí)表示RBR中接收到數(shù)據(jù)return(LPC_UART0->RBR); //讀取接收數(shù)據(jù)}intUart0SendByte(intbuf){//當(dāng)檢測(cè)到UARTnTHR已空時(shí),THRE就會(huì)立即被設(shè)置。寫UnTHR會(huì)清零THRE//0-UnTHR包含有效字符//1-UnTHR為空while(!((LPC_UART0->LSR)&0x01));//等待判斷LSR[5](即THRE)是否是1,1時(shí)表示THR中為空LPC_UART0->THR=buf; //發(fā)送數(shù)據(jù)return0;}voidUART0_IRQHandler(void){Uart0RecvBuf=LPC_UART0->RBR;//讀取接收數(shù)據(jù)Uart0SendByte(Uart0RecvBuf); //發(fā)送接收到的數(shù)據(jù)}intmain(void){inttemp;SystemInit();Uart0Init(115200);while(1){//temp=Uart0RecvByte();//查詢接收數(shù)據(jù)//Uart0SendByte(temp);//發(fā)送數(shù)據(jù)}}
評(píng)論