我用了三个中断,两个定时器,一个外部中断,定时器0作为时钟读外设状态,外部中断启动PWM,定时器1作计数器,计PWM的脉冲个数,可以每次外部中断以后就跑到了main入口处,不知道是什么原因,请指点一下,<br /><br />********************************************************************************************************/ <br /><br /> void __irq IRQ_Timer0(void)<br /> <br /> { uint32 i;<br /> io =IO0PIN;<br /> ioo=IO1PIN;<br /> for(i=0;i<20;i++) <br /> { if(count!=0)<br /> count--;<br /> }<br /> <br /> <br /> T0IR=0x01;<br /> VICVectAddr=0x00;<br /> <br /> }<br /> <br /> /********************************************************************************************************<br /> 卷取中断函数<br /><br />**********************************************************************************************************/ <br /> <br /> void __irq IRQ_Eint0(void)<br /> <br /> { uint32 i;<br /> i=0;<br /> if((io & itqiao)!=0) //无停桥时<br /> { if(pcsd!=0)<br /> { i++;<br /> pcjs=(i*100)/weimi; //匹长<br /> <br /> if(pcjs==pcsd)<br /> {pjc=1;} //匹长到<br /> }<br /> <br /> T1MCR = (7<<0); // 选择MR0匹配寄存器,中断,复位,停止<br /> // T1MR0 =(n*pcount)/10; //PWM脉冲输出个数<br /> T1MR0=100;<br /> T1TC =0x00;<br /> T1TCR = 0x01; //启动计数器T1 <br /> <br /> PWMMR0 = Fpclk/1000; // 设置PWM周期<br /> PWMMR4 = PWMMR0/2;<br /> PWMPCR = (1<<12); //使能PWM4单边沿输出<br /> PWMLER =0x11; //锁存<br /> PWMTCR = 0x02; //复位PWMTC <br /> PWMTCR = 0x09; //启动<br /> <br /> } <br /> else{ } //多次脉冲不输出时保护 <br /> EXTINT=0x01; <br /> VICVectAddr=0x00; <br /> } <br /> /********************************************************************************************************<br /> 定时T1中断函数<br /><br />**********************************************************************************************************/ <br /> void __irq IRQ_Timer1(void) <br /> { <br /> <br /> PWMPCR=0x00; //停止脉冲输出<br /> PWMTCR=0x02; //计数器复位<br /> <br /> T1IR =0x01;<br /> <br /> VICVectAddr=0x00; <br /> <br /> } <br />/********************************************************************************************************<br /> 主函数<br /><br />********************************************************************************************************/ <br /> <br /> int main (void)<br />{ <br /> uint8 run=0; <br /><br /> <br /> <br /> <br /> <br /> <br /> PINSEL0=0x000a15c5;<br /> PINSEL1=0x00000005;<br /> PINSEL2=PINSEL2&(~0x08);<br /> IO0DIR =0x00;<br /> IO1DIR =0x03ff0000;<br /> <br /> /*定时器1计数*/ <br /> <br /> <br /> T1CTCR = (0x02<<0)|(0x02<<2); //P0.17 计数器,下降沿计数<br /> // T1TC = 0x00;<br /> T1CCR = 0x00;<br /> <br /><br /> /*PWM*/<br /> PINSEL0=PINSEL0|(2<<16);<br /> PWMPR = 0x00; //不分频<br /> PWMMCR =(1<<1); //与MR0匹配时复位TC<br /> PWMPCR = (1<<12); //使能PWM4单边沿输出<br /> <br /> // PWMTCR = 0x02; //复位PWMTC <br /> PWMMR4 = PWMMR0/2;<br /> <br /> <br /> <br /> IRQEnable(); //开中断<br /> <br /> <br /> <br /> /*定时器0初始化*/<br /> <br /> T0TC = 0;<br /> T0PR = 0;<br /> T0MCR = 0x03; //匹配后复位TC,并中断<br /> T0MR0 = Fpclk/500; //2ms定时<br /> T0TCR = 0x01; //启动<br /> <br /> <br /> VICIntSelect=0x00;<br /> VICVectCntl0=0x20|0x04; //定时器0分配最高优先级<br /> <br /> VICVectAddr0=(uint32)IRQ_Timer0; //中断地址<br /> VICIntEnable = 1<<0x04; //使能定时器0<br /> <br /> <br /> EXTMODE = 0x01; //边沿触发<br /> EXTPOLAR= 0x00; //下降沿触发<br /> <br /> VICVectCntl1=0x20|14; //外部中断0 P0.16<br /> VICVectAddr1=(uint32)IRQ_Eint0;<br /> EXTINT = 0x0f;<br /> VICIntEnable = 1<<14;<br /> <br /> VICVectCntl2=0x20|0x04; //定时器1分配最2优先级<br /> <br /> VICVectAddr2=(uint32)IRQ_Timer1; //中断地址<br /> VICIntEnable = 1<<0x05; <br /> <br /> <br /> <br /> // IO0SET=0xffffffff;<br /> IO1SET=0x03ff0000;<br /> IO1CLR = (gy|dy);<br /> <br /> for(i=0;i<20;i++)<br /> { count=0;<br /> }<br /> ptime = count; <br /> <br /> while(1)<br /> {<br /> |
|