求助:F407通用定时器开启编码器模式,溢出中断之后发生异变

2019-07-20 16:32发布

求助诸位大神!鄙人采用STM32F407VET6的TIM2,3,4,5的CH1和CH2来对用于电机的增量光电编码器进行测速。每次芯片复位初始化之后,在定时器中断未发生的时候(向上向下均未溢出过的情况下),TIMX->CNT的数值都还算正常。在发生中断之后,原本转一圈计数2000次变成了转好几圈计数也不过100次的情况,非常奇怪!四个定时器的效果都是这样。
以下是鄙人的初始化程序,以TIM2为例:

[mw_shl_code=c,true]RCC->APB1ENR|=1<<0;
                RCC->AHB1ENR|=1<<0;
                RCC->AHB1ENR|=1<<1;
                GPIO_Set(GPIOA,PIN15,
                                GPIO_MODE_AF,GPIO_OTYPE_OD,
                                GPIO_SPEED_50M,GPIO_PUPD_NONE);
                GPIO_AF_Set(GPIOA,15,1);
                GPIO_Set(GPIOB,PIN3,
                                GPIO_MODE_AF,GPIO_OTYPE_OD,
                                GPIO_SPEED_50M,GPIO_PUPD_NONE);
                GPIO_AF_Set(GPIOB,3,1);//Set CH1 CH2
               
                TIM2->DIER|=1<<0;        //Enable Interrupt
                TIM2->DIER|=1<<6;         //Tigger Interrupt
               
                TIM2->ARR=1999;       
                TIM2->PSC=41;

                TIM2->CR1&=~(3<<8);        //Keep Original Frequency
                TIM2->CR1&=~(3<<5);        //Align to Sides
               
                TIM2->CCMR1|=1<<0;        //CC1S Project IC1 to TI1
                TIM2->CCMR1|=1<<8;        //CC2S Project IC2 to TI2
               
                TIM2->CCER&=0XFF55; //Trigger at Upper Impulse
               
                TIM2->CCMR1|=3<<4;        //IC1F FILTER MODE 0011
                TIM2->CCMR1|=3<<12;        //IC2F FILTER MODE 0011
               
                TIM2->SMCR|=3<<0;        //Encoder Mode
               
                TIM2->CNT=1000;        //Start to Count from the number
               
                TIM2->CR1|=1<<0;        //Enable Timer
               
                MY_NVIC_Init(0,2,TIM2_IRQn,2);[/mw_shl_code]




然后这是中断函数:

[mw_shl_code=c,true]void TIM2_IRQHandler(void)//Encoder 1
{
        if(TIM2->SR&0X0001)
        {
                if (Encoder_Status&(1<<0))
                {
                        if (TIM2->CNT>=Encoder_Start[0])
                        {
                                Encoder_Cycle_Raw[0]--;
                        }
                        else
                        {
                                Encoder_Cycle_Raw[0]++;
                        }
                }                       
        }
        TIM2->SR&=~(1<<0);
}[/mw_shl_code]

由于项目急着要用,时间相对较为紧急,恳请诸位大神求助!另如果有高人有寄存器版本的亲测可用的F4的编码器模式初始话函数能够分享,鄙人将不胜感激!

另如果有其他要补充的信息,请随时留言!

谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。