Lpc1754之UART程序分析

      硬件的连接:PC通过串口0与开发板相连,开发板通过串口2与TFT通讯。

      主要是串口0接收PC发的指令,串口2发送给液晶。

  思路:① 用到串口0和串口2,首先需要使能串口0和串口2的控制管脚,不需要上拉

  1 #define P0_2_FNUC             P0_2_TXD0		//TDX0
  2 #define P0_3_FNUC             P0_3_RXD0		//RXD0
  3 
  4 #define P0_2_MODE             PIN_NO_PULL                   
  5 #define P0_3_MODE             PIN_NO_PULL           //RXD0  
  6 
  7 #define P2_8_FNUC             P2_8_TXD2		
  8 #define P2_9_FNUC             P2_9_RXD2		
  9 
 10 #define P2_8_MODE             PIN_NO_PULL	
 11 #define P2_9_MODE             PIN_NO_PULL	

②串口的初始化。需要注意的是设置1个字节触发点,设置中断入口,需要在启动函数里添加中断的入口地址

  1             	    extern     Uart0Isr
  2                 DCD     Uart0Isr		   		; 21: UART0
  3                         extern     Uart2Isr
  4                 DCD     Uart2Isr			        ; 23: UART2
  5 
  6 //原始的启动文件对比
  7 
  8        		    extern     Uart0Isr
  9                 DCD     Uart0Isr		   		; 21: UART0
 10                 DCD     UART1_IRQHandler		   	; 22: UART1
 11                 DCD     UART2_IRQHandler   		; 23: UART2

程序的核心是串口0的中断接收数据函数和串口2的中断发送函数。

一般对于收发数据需要定义这么几个变量:接收的缓存区,接收数据的计数,成功接收的标志位,对于发送数据也需要这些变量,另外还需定义一个中断标志位。

串口0的接收函数分析:

U0IIR:中断标志寄存器

U0RBR:接收器缓存寄存器

注:if else if 的知识 程序案例是 计算器

if else

由上图分析,同理可得

if else if else

实际情况是接收TFT的指令(0xaa …. 0x33 0xcc 0x3c 0xc3)

  1 /*********************************************************************************************************/
  2 void Uart0Isr (void)
  3 {	uint32  usta;
  4 	uint8	Temp;
  5 
  6 	usta = U0IIR&0x0F; //取中断标志
  7 
  8 	if( usta == 0x04)  //接收中断ID
  9 	{
 10 		Temp=U0RBR; //把接收缓存寄存器的值给Temp
 11 		if(GulNum==0)   //如果统计接收数据的个数的变量为0
 12 		{	if(Temp==0xaa)
 13 			{	rcv_data[0]=0xaa;
 14 				GulNum=1;
 15 			}
 16 		}
 17 		else if(GulNum<5)  //如果小于5
 18 		{	rcv_data[GulNum]=Temp;
 19 			GulNum++;
 20 		}
 21 		else                //大于5的情况
 22 		{	rcv_data[GulNum]=Temp;
 23 			if((rcv_data[GulNum] == 0x3C)&&(rcv_data[GulNum-1] == 0xc3)&&(rcv_data[GulNum-2] == 0x33)&&(rcv_data[GulNum-3]== 0xcc))
 24 			{	GucRcvNew=GulNum+1;//接收指令成功的标志
 25 				GulNum=0;
 26 			}
 27 			else if(GulNum>=127)//超出计数范围
 28 				 GulNum=0;
 29 			else	 GulNum++;
 30 		}
 31 
 32 	}
 33 	else if(usta ==0x02) //发送中断ID
 34 	{
 35 
 36 		U0IER &= 0xfd;  //关发送中断
 37 	}
 38 }

     串口0接收成功,然后在主函数的while循环中处理接收的数据(把接收到的数据给串口2的发送保持寄存器)发送的思路:因为FIFO是16字节,实际处理是达到12就发送了。程序的设计思路是,如果小于12字节,就直接发送,如果大于12字节就先发送12字节数据,12字节之后的数据通过设置中断标志在串口中断函数里继续发送。

  1 while(1)
  2 {
  3 	if(GucRcvNew )//成功接收数据标志
  4 		{
  5 		for(ii=0;ii<GucRcvNew;ii++)
  6 		UR2_T_Buff[ii]=rcv_data[ii];//把接收到的数据放在缓存里
  7 		Uart2_T_Len=GucRcvNew;
  8 		GucRcvNew=0;              //标志置 0 
  9 		if(Uart2_T_Len<=12)     //如果数据长度小于12字节
 10 		{	for(ii=0;ii<Uart2_T_Len;ii++)
 11 			U2THR=UR2_T_Buff[ii]; //直接发送
 12 			Uart2_T_Count=0;Uart2_T_Len=0;
 13 			In_Send2=0;          //中断标志设置0
 14 			}
 15 			else                 //否则
 16 			{	for(ii=0;ii<12;ii++)
 17 					U2THR=UR2_T_Buff[ii];//发送前12字节
 18 				Uart2_T_Count=12;
 19 				In_Send2=1;  //设置中断标志
 20 			}
 21 
 22 			U2IER |=0x02;       //开中断
 23 		}
 24   }
 25 /*********************************************************************************************************/
 26 void Uart2Isr (void)
 27 {	uint32  usta;
 28 	uint8	Temp;
 29 	uint16	ii;
 30 
 31 	usta = U2IIR&0x0F;
 32 	if( usta == 0x04)  //接收数据中断ID      
  	{
 33 		Temp=U2RBR;
 36 	}
 37 	else if(usta ==0x02) //发送中断ID
 38 	{
 39 		if(In_Send2) //发送中断标志1
 40 		{
 41 			for(ii=0;ii<12;ii++)  //发送下一个12字节(假如够12)
 42 			{
 43 			U2THR=UR2_T_Buff[Uart2_T_Count];//从第12个字节开始发
 44 			if(++Uart2_T_Count>=Uart2_T_Len)//判断是否发送完数据
 45 			{
                          In_Send2=0;ii=16; //如果发送完,置0中断标志,退出for循环
		        }
 46 			}
 47 		}
 48 		else    //如果发送中断为0
 49 		{
 50 			U2IER &= 0xfd;	//关闭发送中断
		}
 51 	}
 52 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2018-04-05 20:08  王磊wl  阅读(1075)  评论(0编辑  收藏  举报

导航