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 的知识 程序案例是 计算器
由上图分析,同理可得
实际情况是接收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 }