關(guān)鍵代碼:
uint16_t cont = 0;//計數(shù)
uint8_t pwm_H[6]={5,8,11,14,17,20};//上次比較值
uint8_t pwm_L[6]={5,8,11,14,17,20};//此次比較值
//主時鐘
SetSysClock(CLK_SOURCE_PLL_60MHz);
//IO口配置
GPIOA_ResetBits(GPIO_Pin_10);?
GPIOA_ModeCfg(GPIO_Pin_10, GPIO_ModeOut_PP_5mA);
//定時器配置
TMR0_TimerInit(FREQ_SYS / 10000);? ? ?//100uS進入一次中斷? ??
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);?
PFIC_EnableIRQ(TMR0_IRQn);
//定時器中斷
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR0_IRQHandler(void) // TMR0 定時中斷
{
? ? if(TMR0_GetITFlag(TMR0_3_IT_CYC_END))
? ? {
? ? ? ? TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中斷標(biāo)志
? ? ? ? cont++;
? ? ? ? if(cont < 5 )
? ? ? ? {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? else if(5 <= cont < 45)
? ? ? ? {
? ? ? ? ? ? if(cont <= pwm_H[0])
? ? ? ? ? ? ? ? GPIOA_SetBits(GPIO_Pin_12);
? ? ? ? ? ? else
? ? ? ? ? ? ? ? GPIOA_ResetBits(GPIO_Pin_12);
??????????(其余IO翻轉(zhuǎn)操作省略)
? ? ? ? ?}
? ? ? ? else if(cont >= 200)//一個周期到了,更新比較值
? ? ? ? {
? ? ? ? ? ? ? cont = 0;
? ? ? ? ? ? ? for(int8_t i=0;i<6;i++)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? pwm_H[i] = pwm_L[i];
? ? ? ? ? ? ? }
? ? ? ? }
? ? }
}
我發(fā)現(xiàn)將?cont 類型設(shè)置成uint8_t才可以正常輸出PWM,設(shè)置成uint16_t就不輸出了。按理說設(shè)置成uint16_t沒什么影響啊。