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