关键代码:
uint16_t cont = 0;//计数
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); // 清除中断标志
? ? ? ? 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翻转操作省略)
? ? ? ? ?}
? ? ? ? else if(cont >= 200)//一个周期到了,更新比较值
? ? ? ? {
? ? ? ? ? ? ? cont = 0;
? ? ? ? ? ? ? for(int8_t i=0;i<6;i++)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? pwm_H[i] = pwm_L[i];
? ? ? ? ? ? ? }
? ? ? ? }
? ? }
}
我发现将?cont 类型设置成uint8_t才可以正常输出PWM,设置成uint16_t就不输出了。按理说设置成uint16_t没什么影响啊。