之前曾經(jīng)發(fā)過一貼,我無法正常的產(chǎn)生PWM,但官方一直沒有回音。這個(gè)雙休不死心,又折騰了折騰。結(jié)果發(fā)現(xiàn)問題更讓我迷惑了。首先我僅僅是將之前的代碼中中斷配置的語句調(diào)整了一下次序,將這些代碼移到了PWM配置的前面,并且將輸出腳PWM2換成了PWM0,就在PB0腳上測(cè)到了正確的脈沖。但除了將輸出腳配置成PWM0時(shí)以外,配置成PWM1、PWM2、PWM3都無法在相應(yīng)管腳上得到脈沖。先看之前的代碼:
#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)
{}
}
這個(gè)代碼無法在PWM2上得到正確的脈沖。但我僅僅將PWM_Init()函數(shù)里的語句次序調(diào)整了一下,同時(shí)將PWM2換成PWM0,就在PB0上得到了正確的脈沖。
void PWM_Init()
{
R8_TMR0_INTER_EN |=(RB_TMR_IE_CYC_END|RB_TMR_IE_DATA_ACT);//僅僅調(diào)整了語句次序,先配置了中斷,但這與手冊(cè)里的說明次序是完全相反的。
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;
}
上面的代碼就可以正常運(yùn)行了,本來我以為找到了正確的方法,可是問題又來了。當(dāng)我將PWM0換成其它輸出腳時(shí),比如PWM1。程序就又沒有反應(yīng)了,我不能在任何管腳上測(cè)到正確的脈沖。神呀,我徹底不知所措了,官方給個(gè)準(zhǔn)確、詳細(xì)的說明吧,不然沒法玩下去了。