打印
[ZLG-ARM]

为什么中断标志自动清除了

[复制链接]
1315|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
云痕|  楼主 | 2008-4-24 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在写中断模式的串口驱动
主程序:
UART0_IRQ_init(9600);
    VICIntSelect = 0 ;
    VICVectCntl5 = 0x20|6;                    // UART0中断通道分5
    VICVectAddr5 = (int)UART0_Handler;           // 设置UART0向量地址
   VICIntEnable = 1<<6;               // 使能UART0中断
    Uart0_SendString_IRQ(" 12345678012345678 ");
    

void UART0_IRQ_init(int UART0_BPS)
{
    unsigned short Fdiv0;
    
    PINSEL0 &= ~(0xF << 4);
    PINSEL0 |=  (0x5 << 4);          
   U0LCR = 0x83;        // 设置除数锁存位,DLAB = 1   
    Fdiv0 = (Fpclk / 16) / UART0_BPS;// 设置波特率
    U0DLM = Fdiv0 / 256;                    
    U0DLL = Fdiv0 % 256;    
    U0LCR = 0x03;    //清除锁存,并设置工作模式      
  //U0FCR = 0x87;// 使能FIFO,并设置触发点为8字节,复位T0FIFO,R0FIFO 
    U0FCR = 0x81;
    UART0_FIFO_LENGTH = 8 ;    
    U0IER = 0x03;  //RBR,THRE中断使能
    Fdiv0 = U0IIR; //清除 
}
void Uart0_SendString_IRQ(char *pt)
{
    int i;
    char * pUART0;
    pUART0 = pt
U0TER = 0x0;//停止发送
    while (!(U0LSR & 0x40))
          ;                      //等待发送缓冲为空
   
    for (i=FIFO_SIZE;i>0;i--)
        {
            if(*pUART0)
              U0THR = *pUART0++;
        }     
      U0TER = 0x80; //开始发送
    i++;   //标号1
    i++;   //标号2   
}

void  UART0_Handler (void)  __irq
{
}

箭头位于标号1行首时,VICIRQStatus=0x40,VICRawIntr=0x00021048,VICIntEnable=0x40,

VICSWPrioMask=0xffff,0xfffff030=0xf;U0IIR=0xc2,U0LSR=0x60
箭头位于标号2行首时,U0相关寄存器中,U0IIR=0xc1,别的没变,发送中断消失了;

VICIRQStatus=0x00,VICRawIntr=0x00021008 其余没变,中断标志也消失了,之后返回主程序顺序执行。
主程序后面是外部中断,外部中断正常能响应的

弄了2天了,还是搞不定

相关帖子

沙发
云痕|  楼主 | 2008-4-24 22:55 | 只看该作者

就没有人肯指点下么?

使用特权

评论回复
板凳
zlgarm| | 2008-4-25 15:31 | 只看该作者

回复

云痕 您好:
发生“THRE”发送中断后,有两种情况可以清除中断:
1、读取UART中断标志寄存器,可以清除发送中断标志;
2、对UART发送器保持寄存器UnTHR执行写操作也可以清除发送中断。
根据以上两种情况,您可以仔细分析代码执行了哪一个操作。
预祝早日解决问题!
on duty: LBH

使用特权

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

本版积分规则

28

主题

75

帖子

0

粉丝