打印
[ZLG-ARM]

请教

[复制链接]
1088|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
davidlee|  楼主 | 2007-2-13 08:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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();
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

0

粉丝