Цитата(viakon @ Apr 22 2016, 08:26)

Зачем Вам таймер? все делается на прерываниях от ножек.
Это смотря зачем энкодер нужен. Если на каждый шаг требуется действие - можно и на прерываниях. А если пользователь с помощью энкодера вводит какое-то число на экране и он физически не может реагировать на изменения на экране быстрее, чем за 20-30 мс, а экран физически не может обновляться чаще, то какой смысл грузить процессор прерываниями? Достаточно повесить энкодер на таймер и раз в эти 20 мс считывать накопленный результат.
Я не использую библиотеки, поэтому инициализация таймера у меня несколько короче:
CODE
TIM3->PSC = 0; // TIM3CLK = PCLK/1
TIM3->ARR = 0xFFFF; // 16-bit resolution
TIM3->CNT = 0;
TIM3->CR1 = 0
| 0 * (TIM_CR1_CKD & -TIM_CR1_CKD) // Dead-time clock = timer clock
| 0 * TIM_CR1_ARPE // ARR not buffered
| 0 * (TIM_CR1_CMS & -TIM_CR1_CMS) // Unidirectional, not used
| 0 * TIM_CR1_DIR // Counting up, not used
| 0 * TIM_CR1_OPM // Counter not stopped at update event
| 0 * TIM_CR1_URS // Update request source, not used
| 1 * TIM_CR1_UDIS // Update event generation, 0 - enabled, 1 - disabled
| 1 * TIM_CR1_CEN // Counter enable
;
TIM3->SMCR = 0
| 0 * TIM_SMCR_ETP // External trigger polarity, not used
| 0 * TIM_SMCR_ECE // External clock mode 2 disabled
| 0 * (TIM_SMCR_ETPS & -TIM_SMCR_ETPS) // External trigger prescaler, not used
| 0 * (TIM_SMCR_ETF & -TIM_SMCR_ETF) // External trigger filter, not used
| 0 * TIM_SMCR_MSM // Master/slave mode, not used
| 0 * (TIM_SMCR_TS & -TIM_SMCR_TS) // Trigger selection, not used
| 3 * (TIM_SMCR_SMS & -TIM_SMCR_SMS) // Encoder mode, both edges
;
TIM3->CCMR1 = 0
// CC2 capture mode settings
| 1 * (TIM_CCMR1_IC2F & -TIM_CCMR1_IC2F) // IC2 Filter
| 0 * (TIM_CCMR1_IC2PSC & -TIM_CCMR1_IC2PSC) // IC2 Prescaler
| 1 * (TIM_CCMR1_CC2S & -TIM_CCMR1_CC2S) // Capture, TI1
// CC1 capture mode settings
| 1 * (TIM_CCMR1_IC1F & -TIM_CCMR1_IC1F) // IC1 Filter
| 0 * (TIM_CCMR1_IC1PSC & -TIM_CCMR1_IC1PSC) // IC1 Prescaler
| 1 * (TIM_CCMR1_CC1S & -TIM_CCMR1_CC1S) // Capture, TI1
;
значение TIM3->CNT достаточно явно привести к int16_t, оно уже будет со знаком.
Сообщение отредактировал IgorKossak - Apr 22 2016, 17:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!