打印
[ZLG-ARM]

IRQ中断问题,请大虾指点

[复制链接]
2172|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shixi1021|  楼主 | 2007-1-12 12:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用了三个中断,两个定时器,一个外部中断,定时器0作为时钟读外设状态,外部中断启动PWM,定时器1作计数器,计PWM的脉冲个数,可以每次外部中断以后就跑到了main入口处,不知道是什么原因,请指点一下,

********************************************************************************************************/ 

   void __irq IRQ_Timer0(void)
   
       {  uint32 i;
           io =IO0PIN;
           ioo=IO1PIN;
          for(i=0;i<20;i++) 
            {  if(count!=0)
                count--;
                }
            
       
          T0IR=0x01;
          VICVectAddr=0x00;
          
       }
   
 /********************************************************************************************************
                                       卷取中断函数

**********************************************************************************************************/  
   
 void __irq IRQ_Eint0(void)
   
   {  uint32 i;
       i=0;
       if((io & itqiao)!=0)                   //无停桥时
         { if(pcsd!=0)
             { i++;
               pcjs=(i*100)/weimi;             //匹长
               
               if(pcjs==pcsd)
                 {pjc=1;}                      //匹长到
             }
             
             T1MCR   = (7<<0);                    //    选择MR0匹配寄存器,中断,复位,停止
            //   T1MR0  =(n*pcount)/10;                //PWM脉冲输出个数
             T1MR0=100;
             T1TC  =0x00;
             T1TCR  = 0x01;                           //启动计数器T1 
             
             PWMMR0  = Fpclk/1000;                // 设置PWM周期
             PWMMR4  = PWMMR0/2;
             PWMPCR  = (1<<12);                 //使能PWM4单边沿输出
             PWMLER  =0x11;                             //锁存
             PWMTCR  = 0x02;                   //复位PWMTC 
             PWMTCR  = 0x09;                            //启动
             
            } 
        else{ }                                            //多次脉冲不输出时保护    
       EXTINT=0x01;      
       VICVectAddr=0x00;         
     }         
 /********************************************************************************************************
                                      定时T1中断函数

**********************************************************************************************************/    
  void __irq IRQ_Timer1(void)  
   {  
      
      PWMPCR=0x00;                //停止脉冲输出
      PWMTCR=0x02;                //计数器复位
      
      T1IR  =0x01;
      
      VICVectAddr=0x00; 
   
    }  
/********************************************************************************************************
                                       主函数

********************************************************************************************************/      
 
        int main (void)
{    
                 uint8  run=0;           

                 
                
                
        
      
       PINSEL0=0x000a15c5;
       PINSEL1=0x00000005;
       PINSEL2=PINSEL2&(~0x08);
       IO0DIR =0x00;
       IO1DIR =0x03ff0000;
       
       /*定时器1计数*/                    
       
   
       T1CTCR  = (0x02<<0)|(0x02<<2);      //P0.17 计数器,下降沿计数
      // T1TC    = 0x00;
       T1CCR   = 0x00;
    

       /*PWM*/
       PINSEL0=PINSEL0|(2<<16);
       PWMPR   = 0x00;                   //不分频
       PWMMCR  =(1<<1);          //与MR0匹配时复位TC
       PWMPCR  = (1<<12);                 //使能PWM4单边沿输出
                      
      // PWMTCR  = 0x02;                   //复位PWMTC           
      PWMMR4  = PWMMR0/2;
        
          
       
       IRQEnable();                      //开中断
       
       
       
       /*定时器0初始化*/
       
       T0TC  = 0;
       T0PR  = 0;
       T0MCR = 0x03;                      //匹配后复位TC,并中断
       T0MR0 = Fpclk/500;                 //2ms定时
       T0TCR = 0x01;                      //启动
       
       
       VICIntSelect=0x00;
       VICVectCntl0=0x20|0x04;              //定时器0分配最高优先级
       
       VICVectAddr0=(uint32)IRQ_Timer0;       //中断地址
       VICIntEnable = 1<<0x04;              //使能定时器0
       
      
       EXTMODE = 0x01;                      //边沿触发
       EXTPOLAR= 0x00;                      //下降沿触发
      
       VICVectCntl1=0x20|14;                //外部中断0 P0.16
       VICVectAddr1=(uint32)IRQ_Eint0;
       EXTINT = 0x0f;
       VICIntEnable = 1<<14;
       
       VICVectCntl2=0x20|0x04;              //定时器1分配最2优先级
       
       VICVectAddr2=(uint32)IRQ_Timer1;       //中断地址
       VICIntEnable = 1<<0x05;  
       
       
       
       // IO0SET=0xffffffff;
        IO1SET=0x03ff0000;
        IO1CLR = (gy|dy);
     
     for(i=0;i<20;i++)
      { count=0;
      }
      ptime = count;  
       
    while(1)
    {
    

相关帖子

沙发
shixi1021|  楼主 | 2007-1-12 17:05 | 只看该作者

问题在这里

_zero_loop     [0xe2555004]   subs     r5,r5,#4
000001ac              [0x24847004]   strcs    r7,[r4],#4
000001b0              [0x8afffffc]   bhi      _zero_loop
000001b4              [0xeafffff2]   b        _zero_region
_region_table     [0x00000cc4]   dcd      0x00000cc4  ....
000001bc              [0x00000cf4]   dcd      0x00000cf4  ....
000001c0              [0x00000cf4]   dcd      0x00000cf4  ....
000001c4              [0x00000d04]   dcd      0x00000d04  ....
IRQ_Exception     [0xeafffffe]   b        IRQ_Exception
我的程序在_zero_loop中死掉了,这是系统函数_main中一部分,不知道这个是干什么用的,请大虾指点一下啊.

使用特权

评论回复
板凳
hotpower| | 2007-1-13 09:03 | 只看该作者

估计是SWI搞得鬼

在startup.s内多设置几个断点即可搞清问题的出处.

使用特权

评论回复
地板
stevepeng| | 2007-1-14 16:11 | 只看该作者

上面的程序是不要进行中断嵌套啊?

shixi1021,如果你的程序需要中断嵌套的话,上面的程序是行不通的。CPU相应了一个中断后,就不会响应另一个中断,即使是较高的优先级。ARM硬件是本身不支持中断嵌套的。

使用特权

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

本版积分规则

5

主题

14

帖子

0

粉丝