以下是我试验的串口程序,我已经搞了好几天了,始终无法搞定,这两个程序我在SMART2200学习板(LPC2210)上试过,UART0及UART1都运行正常,但是,在我自己的用户板(LPC2132)上UART0运行正常,UART1运行不正常,如果传送多于14个字符就出现乱码。<br /><br />//串口0通信-中断方式实验<br />#include "config.h"<br /><br />#define UART_BPS 115200 /* 串口通信波特率 */<br />#define RTS1_LO IO1CLR = 0x00400000; // RTS1 =P1 bit 22<br />#define RTS1_HI IO1SET = 0x00400000;<br /><br />volatile uint8 uiGRcvNew; /* 串口接收新数据的标志 */<br />uint8 uiGRcvBuf[30] = {0}; /* 串口接收数据缓冲区 */<br />uint32 uiGNum; /* 串口接收数据的个数 */<br /><br />/*********************************************************************************************************<br />** Function name: DelayNS<br />** Descriptions: 延时函数<br />** input parameters: uiDly 值越大,延时时间越长<br />** output parameters: 无<br />** Returned value: 无<br />*********************************************************************************************************/<br />void DelayNS (uint32 uiDly)<br />{<br /> uint32 i;<br /> <br /> for (; uiDly > 0; uiDly--){<br /> for(i = 0; i < 50000; i++);<br /> }<br />}<br /><br />/*********************************************************************************************************<br />** Function name: UART0_IRQ<br />** Descriptions: 串口中断服务函数<br />** input parameters: 无<br />** output parameters: 无<br />** Returned value: 无<br />*********************************************************************************************************/<br />void __irq UART0_IRQ (void)<br />{<br /> uiGNum = 0;<br /> <br /> while ((U0IIR & 0x01) == 0){ /* 判断是否有中断挂起 */<br /> switch (U0IIR & 0x0E){ /* 判断中断标志 */<br /> <br /> case 0x04: /* 接收数据中断 */<br /> uiGRcvNew = 1; /* 置接收新数据标志 */<br /> for (uiGNum = 0; uiGNum < 14; uiGNum++){ /* 连续接收8个字节 */<br /> uiGRcvBuf[uiGNum] = U0RBR;<br /> }<br /> break;<br /> <br /> case 0x0C: /* 字符超时中断 */<br /> uiGRcvNew = 1;<br /> while ((U0LSR & 0x01) == 0x01){ /* 判断数据是否接收完毕 */ <br /> uiGRcvBuf[uiGNum] = U0RBR;<br /> uiGNum++;<br /> }<br /> break;<br /> <br /> default:<br /> break;<br /> }<br /> }<br /> <br /> VICVectAddr = 0x00;<br /> <br />}<br /><br />/*********************************************************************************************************<br />** Function name: UARTInit<br />** Descriptions: 串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200<br />** input parameters: uiDly 值越大,延时时间越长<br />** output parameters: 无<br />** Returned value: 无<br />*********************************************************************************************************/<br />void UARTInit (void)<br />{<br /> uint16 uiFdiv;<br /> <br /> U0LCR = 0x83; /* 允许设置波特率 */<br /> uiFdiv = (Fpclk / 16) / UART_BPS; /* 设置波特率*/<br /> U0DLM = uiFdiv / 256;<br /> U0DLL = uiFdiv % 256; <br /> U0LCR = 0x03; /* 锁定波特率 */<br />}<br /><br />/*********************************************************************************************************<br />** Function name: UART0SendByte<br />** Descriptions: 向串口发送子节数据,并等待数据发送完成,使用查询方式<br />** input parameters: uiDat 要发送的数据<br />** output parameters: 无<br />** Returned value: 无<br />*********************************************************************************************************/<br />void UART0SendByte (uint8 uiDat)<br />{<br /> U0THR = uiDat; /* 写入数据 */<br /> while ((U0LSR & 0x20) == 0); /* 等待数据发送完毕 */<br />}<br /><br />/*********************************************************************************************************<br />** Function name: UART0SendStr<br />** Descriptions: 向串口发送字符串<br />** input parameters: uiStr 要发送的字符串指针<br />** uiNum 要发送的数据个数<br />** output parameters: 无<br />** Returned value: 无<br />*********************************************************************************************************/<br />void UART0SendStr(uint8 const *uiStr, uint32 uiNum)<br />{<br /> uint32 i;<br /> <br /> for (i = 0; i < uiNum; i++){ /* 发送指定个字节数据 */<br /> UART0SendByte (*uiStr++);<br /> }<br /> <br />}<br /><br />/*********************************************************************************************************<br />** Function name: main<br />** Descriptions: 跳线JP6短接,打开串口调试软件,串口0中断方式通信<br />** input parameters: 无<br />** output parameters: 无<br />** Returned value: 无<br />*********************************************************************************************************/<br />int main (void)<br />{<br /> <br /> PINSEL0 = PINSEL0 & (~0x0F); <br /> PINSEL0 = PINSEL0 | 0x05; /* 设置I/O连接到UART */<br /> IO1DIR = 0x00400000;<br /> <br /> uiGRcvNew = 0;<br /> RTS1_HI<br /> UARTInit (); /* 串口初始化 */<br /> U0FCR = 0xc1; /* 使能FIFO,设置8个字节触发点 */<br /> U0IER = 0x01; /* 使能接收中断 */<br /> <br /> //IRQEnable ();<br /> <br /> VICIntSelect = 0x00000000; /* 设置所有中断为向量中断 */<br /> VICVectCntl0 = 0x20 | 0x06; /* 设置串口中断为最高优先级 */<br /> VICVectAddr0 = (uint32)UART0_IRQ; /* 设置向量地址 */<br /> VICIntEnable = 1 << 0x06; /* 使能串口中断 */<br /> <br /> while (1){<br /> if (uiGRcvNew == 1){ /* 判断是否有新数据 */<br /> uiGRcvNew = 0;<br /> RTS1_HI /* 清除标志 */<br /> UART0SendStr (uiGRcvBuf, uiGNum); /* 向串口发送数据 */<br /> }<br /> if(U0LSR&0x40){<br /> //DelayNS(10);<br /> RTS1_LO<br /> }<br /> }<br /><br /> return 0;<br />} |
|