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