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