Прошу прощения ели тема поднималась - не нашел.
Проект на STM32F070. Timer3 используется для задержки. Простейший режим: считаем вверх до ARR, прерывание по переполнению. Почему то после инициализации первое прерывание происходит СРАЗУ. Вне зависимости от прескалера и ARR. А дальше все как и положено.
После долгих упражнений решил обмануть - первый раз жду переполнения, благо ждать микросекунды, и сбрасываю. Так работает, но как то коряво. В чем собственно корень зла?
Пробовал инизиализачию и через HAL и напрямую. Без разницы.
Код
void Timer3Init(void){
int PrescalerValue = (uint32_t)(SystemCoreClock / 100000) - 1;
TIM3->CR1 = 0; // disable timer
TIM3->PSC = PrescalerValue;
TIM3->ARR = 2;
TIM3->CR1 = TIM_CR1_CEN; // Enable timer
while((TIM3->SR & 1) == 0); // <*************** танец с бубном тут
TIM3->CR1 = 0; // disable timer
NVIC_ClearPendingIRQ(TIM3_IRQn);
NVIC_EnableIRQ(TIM3_IRQn); // Enable interrupt from TIM3 (NVIC level)
}
void StartTimer3(int timeout){
Timer3Expired = 0;
TIM3->CR1 = 0; // disable timer
TIM3->ARR = timeout / 10;
TIM3->CR1 = TIM_CR1_CEN; // Enable timer
TIM3->SR = 0; // clear interrupt flag
TIM3->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
}
На разных форумах читал что похожая фигня на других линейках, но ответа нигде не нашел. Вдруг тут повезет?
Сообщение отредактировал IgorKossak - Sep 28 2016, 09:54