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