Код
TIM1->CR1 &= TIM_CLK_APB;
TIM1->CR2 &=0xFF00;
TIM1->CR2 |= 199;
TIM1->OC1R = 60000;
TIM_ITConfig(TIM1, TIM_IT_OC1, ENABLE);
VIC_Config(TIM1_ITLine, VIC_IRQ, 0);
VIC_ITCmd(TIM1_ITLine, ENABLE);
TIM_CounterCmd(TIM1, TIM_START);
TIM1->CR2 &=0xFF00;
TIM1->CR2 |= 199;
TIM1->OC1R = 60000;
TIM_ITConfig(TIM1, TIM_IT_OC1, ENABLE);
VIC_Config(TIM1_ITLine, VIC_IRQ, 0);
VIC_ITCmd(TIM1_ITLine, ENABLE);
TIM_CounterCmd(TIM1, TIM_START);
Обработчик прерывания просто перебрасывает состояние вывода - мигает светодиод.
Код
void TIM1_IRQHandler(void){
TIM_ClearFlag(TIM1, TIM_FLAG_OC1);
TIM_CounterCmd(TIM1, TIM_CLEAR);
if (flag == 1){
GPIO_WriteBit(GPIO6, GPIO_Pin_7, Bit_SET);
flag = 0;}
else{
GPIO_WriteBit(GPIO6, GPIO_Pin_7, Bit_RESET);
flag = 1;}
VIC0->VAR = 0xFF;}
TIM_ClearFlag(TIM1, TIM_FLAG_OC1);
TIM_CounterCmd(TIM1, TIM_CLEAR);
if (flag == 1){
GPIO_WriteBit(GPIO6, GPIO_Pin_7, Bit_SET);
flag = 0;}
else{
GPIO_WriteBit(GPIO6, GPIO_Pin_7, Bit_RESET);
flag = 1;}
VIC0->VAR = 0xFF;}
Проблема: прерывание исполняется два раза подряд, т.е. после окончания периода работы счетчика вызывается прерывание и перебрасывается состояние ножки. После этого сразу же вызывается обработчик повторно и возвращает состояние. Потом снова отрабатывается период и все по новой.
Если установить в обработчике точку останова и шагать в отладчике - все работает правильно.
Что я делаю не так?