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