С этим режимом таймера не работал, поэтому несколько общих замечаний:
Цитата(retterberg @ Feb 29 2016, 11:33)

И ещё, почему то не могу обнулить ни один бит регистра SR, соответственно вот эти условия if (TIM2_SR & 2) и if (TIM2_SR & 4) не имеют никакого смысла.
Возможно вы просто не успеваете заметить как бит обнулился. Пока вы делаете шаг в отладчике датчик присылает новый сигнал и бит устанавливается снова. И еще - не используйте "магические числа", пишите if (TIM2_SR & TIM_SR_CC1IF), if (TIM2_SR & TIM_SR_CC2IF) - вам самому потом будет понятнее. Кроме этого - после обнуления флагов надо поставить инструкцию DSB, иначе есть риск войти в этот же обработчик снова сразу после выхода, из-за конвейера. Далее, можно на входе в прерывание считать TIM2_SR во временную переменную, тут же сбросить SR записью в него инвертированного значения считанных флагов и дальше анализировать флаги в переменной. Это позволит обойтись без DSB (конвейер успеет продвинуться за время проверки флагов) и позволит вам не потерять флаги, возникшие между чтением SR и его сбросом (так как вы сбросите только те флаги, которые уже считаны) и код ваш будет короче и быстрее, ибо чтение TIM2_SR произойдет только один раз, а не при проверке каждого флага:
Код
void interrupt(void)
{
uint32_t Flags = TIM2_SR;
TIM2_SR = ~Flags;
if(Flags & TIM_SR_CC1IF)
up=TIM2_CCR1;
if(Flags & TIM_SR_CC2IF)
down=TIM2_CCR2;
}
Цитата
Код
TIM2_DIER |= TIM2_DIER_CC1IE; //Enable the interrupt CC1
TIM2_DIER |= TIM2_DIER_CC2IE; //Enable the interrupt CC2
Эти две записи можно объединить:
Код
TIM2_DIER |= 0
| TIM2_DIER_CC1IE //Enable the interrupt CC1
| TIM2_DIER_CC2IE //Enable the interrupt CC2
;
Тогда у вас будет всего одно чтение и одна запись в регистр. И если вам не нужно сохранять состояние остальных битов (а чаще всего это именно так), такой вариант позволяет писать "=" вместо "|=" и заодно обнулить ненужные биты.
Код
NVIC_ISER0 |= NVIC_ISER0_TIM2; //TIM2 Interrupt
Здесь "|=" избыточно. Запись нуля в этот регистр не меняет его состояния, поэтому достаточно писать NVIC_ISER0 = NVIC_ISER0_TIM2