<br />这几天我在学习easyarm2100的开发板,在ucos2系统下练习uart0,板子自带的程序我看的有点纳闷,还请大家指点一下.主要是下面两个函数.<br />** 函数名称: UART0Putch<br />** 功能描述: 发送一个字节数据<br />** 输 入: Data:发送的数据数据<br /> void UART0Putch(uint8 Data)<br />{<br /> uint8 temp;<br /> <br /> OS_ENTER_CRITICAL();<br /> QueueWrite((void *)UART0SendBuf, Data); /* 数据入队 */<br /> if ((U0LSR & 0x00000020) != 0)<br /> { /* UART0发送保持寄存器空 */<br /> QueueRead(&temp, UART0SendBuf); /* 发送最初入队的数据 */<br /> U0THR = temp;<br /> U0IER = U0IER | 0x02; /* 允许发送中断,中断的状态可以在U0LSR中看到, */<br /> }<br /> OS_EXIT_CRITICAL();<br />} <br />** 函数名称: UART0_Exception<br />** 功能描述: UART0中断服务程序<br /> void UART0_Exception(void)<br />{<br /> uint8 IIR, temp, i;<br /> <br /> OS_ENTER_CRITICAL();<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 />.......................<br />有个疑问,UART0Putch使能THRE中断,但为什么还要(for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */<br /> {<br /> if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)<br /> {<br /> U0THR = temp;<br /> })<br />向FIFO填充数据,如果UART0SendBuf中有好几个数据,那不是数据被覆盖拉吗?他没判断发送保持寄存器的状态啊,直接接 U0THR = temp.<br />感觉这程序还不如不用THRE中断呢.<br /><br /> |
|