我用了三个中断,两个定时器,一个外部中断,定时器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) { |