Натолкнуло меня написать эту статью тема об Xmega и энкодерах. В ней для аппаратной работы с энкодером нужен был 32-ух битный таймер.
Рассмотрим сейчас как STM32 работает с энкодером и будем использовать конечно же 32-ух битный таймер.
"Подопытным кроликом" станет STM32F030F4P6 о котором писал ранее В этом МК есть недокументированный 32-ух битный таймер Tim2 одна из функций которого - аппаратное декодирование энкодера.
Настройка таймера не сложная.
void Tim2_Encoder_Config(void)
{
{
GPIO_InitTypeDef gpio;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // Вкл. тактирование GPIOA
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // и TIM2.
// Настройка порта в/в.
GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // Настройки относятся к выводам 0 и 1.
gpio.GPIO_Mode = GPIO_Mode_AF; // Альтернативная функция порта
gpio.GPIO_PuPd = GPIO_PuPd_UP; // Включены подтягивающие резисторы к плюсу.
GPIO_Init(GPIOA, &gpio); // Применение этих настроек к выбранным выводам GPIOA.
// Альтернативная функция выводов 0 и 1 порта GPIOA - 1 и 2 канал таймера Tim2.
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
}
{ // Настройки таймера.
TIM_TimeBaseInitTypeDef timer;
TIM_TimeBaseStructInit(&timer);
timer.TIM_Period = 0xFFFFFFFF; // Считать нужно от 0 до 0xFFFFFFFF.
timer.TIM_CounterMode = TIM_CounterMode_Down | TIM_CounterMode_Up; // Реверсивный счетчик.
TIM_TimeBaseInit(TIM2, &timer); // Применение этих настроек к TIM2.
}
// Настройки энкодера.
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_Cmd(TIM2, ENABLE); // Запуск таймера.
}Сперва включается тактирование порта GPIOA и таймера Tim2.
Далее выводы 0 и 1 порта GPIOA настраиваются на работу альтернативной функции. Какой именно зависит от третьего параметра функции GPIO_PinAFConfig. Если посмотреть документацию
То видно что первый и второй каналы захвата таймера Tim2 соответствуют второй альтернативной функции выводов 0 и 1 порта GPIOA.
Далее по коду производится настройка таймера Tim2. Потом активируется функция энкодера и запускается таймер.
В функции main в цикле регулярно считывается значение счетчика таймера и записывается в переменную xx. Если в режиме отладки наблюдать за переменной то видно что ее содержимое меняется на 4 при каждом щелчке энкодера.

Схема








