Здравствуйте коллеги.
Мучаюсь уже который день с таймером в стм32 (контроллер стм32ф303, таймеры аналогичны тем что в ф4).
Используется таймер общего назначения 4.
Задача - вызывать прерывание по переполнению и по совпадению, в прерывании определять какое из событий произошло и принимать соответствующие действия.
Вот код настройки таймера:
Код
void pwm_init(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
TIM4->PSC = 0;
TIM4->ARR = 1000;
TIM4->CCR3 = 800;
// TIM4->DIER = TIM_DIER_CC3IE;
TIM4->DIER = TIM_DIER_UIE;
NVIC_EnableIRQ(TIM4_IRQn);
NVIC_SetPriority (TIM4_IRQn, 5);
TIM4->CR1 |= TIM_CR1_CEN;
}
Таймер считает до 1000. В третьем канале записано 800.
Включено тольеко прерывание по переполнению.
Вот обработчик:
Код
void TIM4_IRQHandler(void){
if(TIM4->SR & TIM_SR_UIF){
TIM4->SR = ~TIM_SR_UIF;
GPIOE->ODR |= GPIO_ODR_12;
GPIOE->ODR &= ~GPIO_ODR_12;
}
if(TIM4->SR & TIM_SR_CC3IF){
TIM4->SR = ~TIM_SR_CC3IF;
GPIOE->ODR |= GPIO_ODR_10;
GPIOE->ODR &= ~GPIO_ODR_10;
}
GPIOE->ODR |= GPIO_ODR_15;
GPIOE->ODR &= ~GPIO_ODR_15;
}
Проверяем флаг прерывания, сбрасываем этот флаг путем записи в него нуля, и мигаем светодиодиком. Так для прерывания по переполнению и по совпадению третьего канала. В конце мигаем еще одинм светодиодиком, чтобы видет что обработчик вообще вызвался.
Но в итоге, несмотря на то что разрешено только прерывание по переполнению - выполняются оба обработчика, все светодиоды мигают.
Если разрешить только прерывание по совпадению, то ничего не меняется. Если оба одновременно - то опять ничего не меняются. Оба if выполняются друг за другом через одинаковые промежутки времени. Дебаг показывает постоянно единички во флагах CC4IF, CC3IF, CC2IF, CC1IF, UIF.
Что я делаю не так?
Хочу чтобы при переполнении мигал один светодиодик, а при совпадении - другой.