Выясненно опытным путем с использованием документа "Cortex-M3 programming manual".
Сброс флага статусного регистра
Код
TIM2->SR =~(TIM_SR_UIF);
не приводит к сбросу самого запроса на прерывание.
Чтобы сбросить запрос на прерывания делаем:
1. После загрузки временных прарметров разрешаем прерывание по срабатыванию таймера
2. генерим событие таймера UG
3. Ждем один такт и только потом сбрасиываем флаг прерывания в регистре статуса таймера
4. Запускаем Таймер
5. Очищаем Interrupt clear-pending registers (NVIC_ICPRx)
6. И только потом включаем разрешение на прерывание
Код
/* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */
TIM2->ARR=(1500); // загрузка рег-ра для сравнения ~ 366/1500=0,244 Hz
TIM2->PSC=(65535-1); // предделитель CK_CNT=24000000/65536=366,2109375 Hz
TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера
TIM2->EGR = TIM_EGR_UG; // генерим событие таймера
__NOP();
TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания
TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера
NVIC_ClearPendingIRQ (TIM2_IRQn);
/* Разрешение прерывания TIM2 */
NVIC_EnableIRQ(TIM2_IRQn);
Если закоментить nop, то сброс события таймера не проходит.
Собственно вопрос такой , если мы в конце сбрасываем бит запроса на прерывания от таймера2 , тогда уже не важно какие события произошли до этого , прерывание по идее не ожидается, правильно ? Но если я убираю команду
TIM2->EGR = TIM_EGR_UG; // генерим событие таймера , то таймер сразу после разрешения прерывания запускается.