Я в прерывании смотрю на второй канал энкодера и инкерментирую или декрементирую значение энкодера в зависимости от его состония.
Код
void TIM2_IRQHandler(void)
{static int t1,t2,a;
if(TIM2->SR&TIM_SR_CC3IF)
{
if(GPIOB->IDR&GPIO_Pin_11)conor--;
else conor++;
t2=TIM2->CNT;
if(t2>t1)speed=t2-t1;
else speed=t2-t1+65535;
t1=t2;
speed=140625/speed;
speed=(speed*(100-90)+a*90)/100;a=speed;
TIM2->SR&=~TIM_SR_CC3IF;
if((conor>=3150336)|(conor<=-3150336)|(conor==0)){OSTANOV;} }
}
Использую таймер в режиме захвата.
В принципе можно использовать прерывания по выводам EXTI и там вести счёт. Тогда не нужен будет таймер и его можно будет отключить, тем самым немного уменьшив потребление прибора, если конечно не требуется замер скорости вращения.