我用TIM3产生一个高电平幅度恒定(200us),而频率可调的PWM波形的时候发现从示波器读取到的波形出现2~3s的低电平(正常应该是一直连续的方波),详细情况如下:
1.TIM3定义100us中断
Timer3_Init(7200,0);
2.TIM3初始化如下:
void Timer3_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3-> SC=psc; //预分频器7200,得到10Khz的计数时钟
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0x01; //使能定时器3
#ifdef PA7_OUT_PWM
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0x0FFFFFFF;
GPIOA->CRL|=0x30000000; //PA7 推挽输出
GPIOA->ODR|=0<<7; //PA7 输出高
#endif
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
3.TIM3_IRQHandler中断服务函数如下,这里我发现当(timer_pwm >= 20)的值较小的时候输出的PWM波是正常的,但是当该值较小时则有问题,每次进来取反也是OK的,请问这是什么原因呢?
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0x0001)// for 1 ms
{
timer_pwm++;
if((pwm_flag!= 0)&&(timer_pwm == 2))//持续200us的高电平
{
//printf("timer_pwm:%d\n",timer_pwm);
pwm_flag = 0;
PWM_PA7_OUT = 0;
}
if(timer_pwm >= 20)//50
{
//printf("timer2_timer:%d\n",timer2_timer);
timer_pwm = 0;
pwm_flag = 1;
PWM_PA7_OUT = 1;
}
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
|