www.pudn.com > ucosv2(GUI).rar > uart0.c


#define IN_UART0 
#include "config.h" 
 
/********************************************************************************************************* 
** 函数名称: UART0Init 
** 功能描述: 初始化UART0  
** 输 入: bps:波特率 
** 
** 输 出:TRUE  :成功 
**        FALSE:失败 
** 全局变量: Uart0Sem 
** 调用模块: QueueCreate,OSSemCreate 
********************************************************************************************************/ 
        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 */ 
    return TRUE; 
}  
 
/********************************************************************************************************* 
** 函数名称: UART0_Exception 
** 功能描述: UART0中断服务程序 
** 输 入: 无 
** 
** 输 出: 无 
**          
** 全局变量: 无 
** 调用模块: QueueRead,OSSemPost 
********************************************************************************************************/ 
        void UART0_Exception(void) 
{ 
    char 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 (getRingLst(pRing_lst,&temp) ==TRUE) 
                    { 
                        U0THR = temp; 
                    } 
                    else 
                    { 
                        U0IER = U0IER & (~0x02);        /* 队列空,则禁止发送中断 */ 
                    } 
                } 
                break; 
            case 0x04:                                  /* 接收数据可用 */ 
                OSSemPost(pRing_lst->semSync);                    /* 通知接收任务 */ 
                U0IER = U0IER & (~0x01);                /* 清除接收及字符超时中断 */ 
                break; 
            case 0x06:                                  /* 接收线状态   */ 
                temp = U0LSR; 
                break; 
            case 0x0c:                                  /* 字符超时指示 */ 
                OSSemPost(pRing_lst->semSync);                    /* 通知接收任务 */ 
                U0IER = U0IER & (~0x01);                /* 清除接收及字符超时中断 */ 
                break; 
            default : 
                break; 
        } 
    }  
    VICVectAddr = 0;            // 通知中断控制器中断结束 
    OS_EXIT_CRITICAL(); 
} 
 
/********************************************************************************************************* 
**                            End Of File 
********************************************************************************************************/