При инициализации, выполняется вот такое:
Код: Выделить всё
TIM2->PSC = 24 - 1; // 1us/tick
TIM2->DIER = TIM_DIER_UIE;
TIM2->ARR = period;
TIM2->CCR1 = pw;
TIM2->CCR2 = pw + timeout_us;
NVIC_EnableIRQ(TIM2_IRQn);
TIM2->CR1 = TIM_CR1_CEN;
Ничего страшного - просто запускается таймер. Разрешено только прерывание по обновлению.
Обработчик прерывания выглядит вот так:
Код: Выделить всё
extern "C" void TIM2_IRQHandler();
void TIM2_IRQHandler()
{
TurnOn( TEST_PIN );
TurnOff( TEST_PIN );
TIM2->SR = 0;
}
Вопреки ожиданиям, на ножке появляется два прямоугольника:
Тоесть, флаг не сбрасывается.
Сначала, я подумал, что задеваю какие-то зарезервированные биты. Поэтому, сделал как в STMовской библиотеке:
Код: Выделить всё
TIM2->SR = (uint16_t)~TIM_IT_Update;
Результат абсолютно тот-же. Самое интересное, что вызов функции из библиотеки работает правильно:
Код: Выделить всё
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
Хотя, там только одна строчка. После недолгих экспериментов, я обнаружил, что имеет значение сколько тактов остается до конца прерывания:
Код: Выделить всё
extern "C" void TIM2_IRQHandler();
void TIM2_IRQHandler()
{
TurnOn( TEST_PIN );
TurnOff( TEST_PIN );
TIM2->SR = 0;
Nop();
Nop();
}
Выдает правильную картинку:
Если поставить TIM2->SR = 0; в начало прерывания, то флаг сбрасывается корректно.
Кто-нибуть сталкивался с таким?