串口操作,首先是功率,时钟控制打开。然后是管脚选择,设置为串口模式。
本文引用地址:https://www.eepw.com.cn/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);//发送数据}}
评论