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