使用ARM2200开发板,工程是周立功开发板光盘自带的程序。程序运行在uCOS-II操作系统下。串口有16字节的FIFO。 为何我的程序只能接受小于等于16个字节的数据,怎样修改寄存器才能接受大于16字节的数据呢?请高手指教! 串口初始化如下: uint8 UART0Init(uint32 bps) { uint16 Fdiv; PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; /* 选择管脚为UART0 */
U0LCR = 0x80; /* 允许访问分频因子寄存器 */ Fdiv = (Fpclk / 16) / bps; /* 设置波特率 */ U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; /* 禁止访问分频因子寄存器 */ /* 且设置为8,1,n */ U0IER = 0x05; /* 允许接收和发送中断 */ U0FCR = 0x87; /* 初始化FIFO */ if (QueueCreate((void *)UART0SendBuf, sizeof(UART0SendBuf), NULL, (uint8 (*)())Uart0WriteFull) == NOT_OK) { return FALSE; } Uart0Sem = OSSemCreate(0); if (Uart0Sem != NULL) { return TRUE; } else { return FALSE; }
} 串口中断程序如下: void UART0_Exception(void) { uint8 IIR, temp, i; OS_ENTER_CRITICAL();
while(((IIR = U0IIR) & 0x01) == 0) { /* 有中断未处理完 */ switch (IIR & 0x0e) { case 0x02: /* THRE中断 */ for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */ { if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK) { U0THR = temp; } else { U0IER = U0IER & (~0x02);/* 队列空,则禁止发送中断 */ } } break; case 0x04: /* 接收数据可用 */ OSSemPost(Uart0Sem); /* 通知接收任务 */ U0IER = U0IER & (~0x01); /* 禁止接收及字符超时中断 */ break; case 0x06: /* 接收线状态 */ temp = U0LSR; break; case 0x0c: /* 字符超时指示 */ OSSemPost(Uart0Sem); /* 通知接收任务 */ U0IER = U0IER & (~0x01); /* 禁止接收及字符超时中断 */ break; default : break; } } VICVectAddr = 0; // 通知中断控制器中断结束 OS_EXIT_CRITICAL(); }
|