我希望PWM是这样工作: 假如设定PWM6为单拍脉冲输出,我对其设置是这样的: 假如设置MR0=1000,MR6=600,在MR6=600时,也即MR6匹配时,产生中断,并停止PWMTC和PWMPC,同时复位PWMTCR[0]. 在中断处理程序退出时重新设定MR0,MR6的值,并置位PWMTCR[0]. 在Easy2200上实验时,(我打开了IRQ,在startup.s中),发现要么是根本进入不了中断,要么是只进入一次,也就是说对PWM停止后,重新设值是不成功的。不知道原因。 这样的功能应该是可以的吧?请高工解答啊
附下我的源程序: #include "config.h" /* PWM周期及占空比设置值 */ #define CYCLE_DATA 1100 #define DUTY_CYCLE_DATA 1000 #define BEEPCON 0x00000080 void DelayNS(uint32 dly) { uint32 i; for(;dly>0;dly--) for(i=0;i<5000;i++); } void __irq PWM_IRQ(void) { IO0CLR=BEEPCON; DelayNS(5); IO0SET=BEEPCON; DelayNS(5); PWMMR0=2000;//重新设定PWM PWMMR6=1000; PWMLER=0x41; //PWMTCR=0x02;*/ PWMTCR=0x09; PWMIR=0x400; VICVectAddr=0x0; }
void PWM_Ini(void) { PWMPR = 0x00; // 不分频,计数频率为Fpclk PWMMCR = 0x040006; // MR6匹配时产生中断,MR0匹配时复位PWMTC,且使PWMTC和PWMPC停止,并使PWMTCR[0]为0 PWMMR0 = CYCLE_DATA; // 设置PWM周期 PWMMR6 = DUTY_CYCLE_DATA; // 设置PWM占空比 PWMLER = 0x41; // PWMMR0、PWMMR6锁存 PWMPCR = 0x4000; // 允许PWM6输出,单边PWM PWMTCR = 0x09; // 启动定时器,PWM使能
VICIntSelect=0x00000000; VICVectCntl0=0x20|8; VICVectAddr0=(uint32)PWM_IRQ; VICIntEnable=0x00000100; } int main(void) { PINSEL0 = 0x00080000; // 设置PWM6连接到P0.9管脚 IO0DIR=BEEPCON; IO0SET=BEEPCON; PWM_Ini(); while(1); return(0); } |