У вас обычный инкрементальный энкодер? Тогда вам нужно просто сконфигурировать таймер в режиме работы с энкодером
Код
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef timer_base;
TIM_TimeBaseStructInit(&timer_base);
timer_base.TIM_Period = encoder->period;
timer_base.TIM_CounterMode = TIM_CounterMode_Down | TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &timer_base);
TIM_SetCounter(TIM3, 0);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
И просто периодически смотреть в счётчике таймера на сколько щелчков мы укрутили., забирать это значение и обнулять счётчик. Вот и всё. По сути прерывания не нужны. Единственное - по переполнению счётчика можно сделать таймер, но обычно это не требуется.