这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 中断问题,想不通啊!!!是不是中断复位问题啊???

共2条 1/1 1 跳转至

中断问题,想不通啊!!!是不是中断复位问题啊???

院士
2006-09-17 18:14:16     打赏
中断问题,想不通啊!!!是不是中断复位问题啊???



关键词: 中断     问题     想不通     是不是     复位    

院士
2006-12-22 22:43:00     打赏
2楼
问 请教各位大侠,这个中断计数我明明是只让PWM2中断输出,为什么计数的确是PWM4,但是是PWM2输出。按道理说应该是PWM2计数(脉冲个数。)


void __irq PWM_Handler(void)
{
    if(PWMIR&0x01 == 0x01)//判断中断0是否中断
     {
       d++;
       PWMIR |= 0x01;               //复位中断0    
     }
       if(PWMIR&0x04 == 0x04)//判断中断2是否中断
     {
      d2++;
      PWMIR |= 0x04;                //复位中断2
     }
    if(PWMIR&0x100 == 0x100)//判断中断4是否中断
     {
      d4++;
      PWMIR |= 0x100;                  //复位中断4
     }
    if(PWMIR&0x400 == 0x400)//判断中断6是否中断
     {
      d6++;
      PWMIR |= 0x400;                  //复位中断6
     }
          
    VICVectAddr = 0x00;             // 通知VIC中断处理结束
}


int main (void)
{    
       IRQEnable();
    PWMPR=0;
      PINSEL0 = 0x00008000;            //连接到PWM2
    PWMPCR |= 0x0400;               //设置PWM2输出,并为单边沿控制模式
    PWMMR0 = PwmSize;                
    PWMMR2 = PwmStartSize;
    PWMLER = 0x05;
    
    PWMMCR=(1<<0)|(1<<6);  //PWMMR2与PWMTC匹配时产生中断
                           //PWMMR0与PWMTC匹配时产生中断
   
  

// PWMIR=0x03;
  PWMTCR = 0x02;
  PWMTCR = 0x09;

  VICIntSelect =0x00;                  // 所有中断通道设置为IRQ中断
  VICVectCntl0 = (0x20|8);             //PWM优先级最高    
  VICVectAddr0 = (int)PWM_Handler;     //VICDefVectAddr改为VICVectAddr0就可以进入中断
  VICIntEnable = (1<<8);               //使能PWM中断请求
  while(1)
  {
   if(d2 == 20)
     ClosePwm(0)
     ;
  }
  return 0;
}
1: 自已顶!!怎么没有人啊! 2: 老师,我按照你的方法调了一下。结果是这样的:
      首先,我把中断
       PWMMCR=(1<<0)|(1<<6);  //PWMMR2与PWMTC匹配时产生中断
                           //PWMMR0与PWMTC匹配时产生中断
     改为PWMMCR = (1《 6);
程序进入中断了一次,而且PWMIR的值为0x04,但是在程序走到
if(PWMIR&0x04 == 0x04)时,判断结果是假,直接跳过,直到函
中断函数结束,好像是跑飞了。


     3: 中断函数中的条件判断上有语法错误。正确的程序如下:(注意if语句条件判断多了一对()号)

void __irq PWM_Handler(void)
{
   
    
    if((PWMIR&0x01) == 0x01)//判断中断0是否中断
    {
        d++;
       PWMIR = 0x01;               //复位中断0   
        
    }

    if((PWMIR&0x04) == 0x04)//判断中断2是否中断
    {
      d2++;
      PWMIR = 0x04;                //复位中断2
    }

    if((PWMIR&0x100) == 0x100)//判断中断4是否中断
    {
      d4++;
      PWMIR = 0x100;                  //复位中断4
    }

    if((PWMIR&0x400) == 0x400)//判断中断6是否中断
    {
      d6++;
      PWMIR = 0x400;                  //复位中断6
    }

          
    VICVectAddr = 0x00;             // 通知VIC中断处理结束
}


int main (void)
{    
    IRQEnable();
    PWMPR=0;
    PINSEL0 = 0x00008000;            //连接到PWM2
    PWMPCR |= 0x0400;               //设置PWM2输出,并为单边沿控制模式
    PWMMR0 = 10000;                
    PWMMR2 = 1000;
    PWMLER = 0x05;
    
    PWMMCR=(1<<0)|(1<<6);  //PWMMR2与PWMTC匹配时产生中断
                           //PWMMR0与PWMTC匹配时产生中断
   
  

// PWMIR=0x03;
  PWMTCR = 0x02;
  PWMTCR = 0x09;

  VICIntSelect =0x00;                  // 所有中断通道设置为IRQ中断
  VICVectCntl0 = (0x20|8);             //PWM优先级最高    
  VICVectAddr0 = (int)PWM_Handler;     //VICDefVectAddr改为VICVectAddr0就可以进入中断
  VICIntEnable = (1<<8);               //使能PWM中断请求
  while(1)
  {
   if(d2 == 20)
    ClosePwm(0);
  }
  return 0;
  
} 4: 这个东东会不会影响进入中断计数问题??uint32 PwmSize = Fpclk;
uint32 PwmStartSize = Fpclk/2;
uint32 d = 0, d2 = 0, d4 = 0, d6 = 0;
...........

   PWMMR0 = PwmSize;
   PWMMR2 = PwmStartSize;

..........

还有,老师,我用的精振是:11.0592M,那么它的Fpclk=11.0592啊???
            我的主频是44.2368M

那么我的每一条指令为:1/44.2368M=22.6056ns
                     从此推出:11.0592M*22.6056ns = 24.9999ms
                              频率:1/25ms = 40HZ

     我的计算是不是正确啊??????
   

5: re:zlgARM老师,谢谢你的帮助,现在可以正常工作了。老师,你看一下,这个周期与频率计算的正确吗????

因为我现在手上没有示波器,所以不能测量。

再次谢谢您,老师

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]