之前曾经发过一贴,我无法正常的产生PWM,但官方一直没有回音。这个双休不死心,又折腾了折腾。结果发现问题更让我迷惑了。首先我仅仅是将之前的代码中中断配置的语句调整了一下次序,将这些代码移到了PWM配置的前面,并且将输出脚PWM2换成了PWM0,就在PB0脚上测到了正确的脉冲。但除了将输出脚配置成PWM0时以外,配置成PWM1、PWM2、PWM3都无法在相应管脚上得到脉冲。先看之前的代码:
#include "CH563SFR.H"
#include "sysfreq.h"
__irq void IRQ_Handler()
{
if(R8_INT_FLAG_0&RB_IF_TMR0)
{
UINT8 i;
i=R8_TMR0_INT_FLAG;
if(i&RB_TMR_IF_DATA_ACT)
{
R8_TMR0_INT_FLAG |= RB_TMR_IF_DATA_ACT; R8_INT_FLAG_0 |= RB_IF_TMR0;
}
if(i&RB_TMR_IF_CYC_END)
{
R8_TMR0_INT_FLAG|=RB_TMR_IF_CYC_END;
R8_INT_FLAG_0 |= RB_IF_TMR0;
}
}
}
__irq void FIQ_Handler()
{
}
void PWM_Init()
{
R8_PB_DIR_0|=PWM2;
R32_TMR0_FIFO=100000000/2;
R32_TMR0_CNT_END=100000000;
R8_TMR0_CTRL_MOD&=~(RB_TMR_MODE_NRZI|RB_TMR_ALL_CLEAR|RB_TMR_MODE_IN);
R8_TMR0_CTRL_MOD|=(RB_TMR_OUT_EN|RB_TMR_COUNT_EN)
;
R8_TMR0_INTER_EN |=(RB_TMR_IE_CYC_END|RB_TMR_IE_DATA_ACT);
R8_INT_EN_IRQ_0|=RB_IE_IRQ_TMR0;
R8_INT_EN_IRQ_GLOB|=RB_IE_IRQ_GLOB;
}
int main()
{
PWM_Init();
while(1)
{}
}
这个代码无法在PWM2上得到正确的脉冲。但我仅仅将PWM_Init()函数里的语句次序调整了一下,同时将PWM2换成PWM0,就在PB0上得到了正确的脉冲。
void PWM_Init()
{
R8_TMR0_INTER_EN |=(RB_TMR_IE_CYC_END|RB_TMR_IE_DATA_ACT);//仅仅调整了语句次序,先配置了中断,但这与手册里的说明次序是完全相反的。
R8_INT_EN_IRQ_0|=RB_IE_IRQ_TMR0;
R8_INT_EN_IRQ_GLOB|=RB_IE_IRQ_GLOB;
R8_TMR0_CTRL_MOD&=~(RB_TMR_MODE_NRZI|RB_TMR_ALL_CLEAR|RB_TMR_MODE_IN);
R8_TMR0_CTRL_MOD|=(RB_TMR_OUT_EN|RB_TMR_COUNT_EN) ;
R8_PB_DIR_0|=PWM0; //在这里将原来的PWM2换成了PWM0
R32_TMR0_FIFO=100000000/2;
R32_TMR0_CNT_END=100000000;
}
上面的代码就可以正常运行了,本来我以为找到了正确的方法,可是问题又来了。当我将PWM0换成其它输出脚时,比如PWM1。程序就又没有反应了,我不能在任何管脚上测到正确的脉冲。神呀,我彻底不知所措了,官方给个准确、详细的说明吧,不然没法玩下去了。