Пример рабочий, до вызова нужно настроить тактирование таймера и функцию соответствующего таймеру вывода порта.
Для работы прерываний также отдельно требуется: NVIC_EnableIRQ(TimerX_IRQn) и при необходимости NVIC_SetPriority (TimerX_IRQn, TimerX_IRQ_PRIOR)
// --------------------------------------------------------------------------
// Настройка таймера в режиме захвата (прерывание по фронту и спаду)
// Таймер == MDR_TIMER1, MDR_TIMER2, MDR_TIMER3
// tmr_chanel = TIMER_CH1...TIMER_CH3 (0...2)
// psg == к-т предделителя
// arr == основание счета таймера (MAX == 0xFFFF)
// filtr == значение для CHFLTR [0..3] = 1, 2, 4, 8 TIM_CLC
// --------------------------------------------------------------------------
void Timer_asCapture_Setup(MDR_TIMER_TypeDef *MDR_TIMERx, u8 tmr_chanel, u16 psg, u16 arr, u8 inp_filtr)
{
MDR_TIMERx->CNTRL = 0; // откл на время настройки
MDR_TIMERx->CNT = 0; // сбросили счетчик
MDR_TIMERx->PSG = psg; // предделитель частоты на входе CNT, Fcnt = TIM_CLK/(PSG+1)
MDR_TIMERx->ARR = arr; // верхняя граница счета, CNTmax == ARR
MDR_TIMERx->CNTRL = TIMER_CNTRL_CNT_EN; // счет вверх 0 -> ARR, 0 -> ARR...
// режим CAPTURE отрицательный фронт входной фильтр
*(&MDR_TIMERx->CH1_CNTRL + tmr_chanel) = TIMER_CH_CNTRL_CAP_NPWM | (1 << TIMER_CH_CNTRL_CHSEL_Pos) | (inp_filtr << TIMER_CH_CNTRL_CHFLTR_Pos);
// CCR1 разрешен положительный фронт
*(&MDR_TIMERx->CH1_CNTRL2 + tmr_chanel) = (1 << TIMER_CH_CNTRL2_CCR1_EN_Pos) | (0 << TIMER_CH_CNTRL2_CHSEL1_Pos);
// прерывание по CCR1 прерывание по CCR
MDR_TIMERx->IE = ( (1 << tmr_chanel) << TIMER_IE_CCR1_CAP_EVENT_IE_Pos ) | ( (1 << tmr_chanel) << TIMER_IE_CCR_CAP_EVENT_IE_Pos );
MDR_TIMERx->STATUS = 0;
}