Имеем такой простой до невозможности код
Код
/* таймер T2 25 МГц */
LPC_TIM2->MR0 = 782/2; // 782 = 32 кHz
LPC_TIM2->MCR = 3;
LPC_TIM2->TCR= 0x01;
NVIC_EnableIRQ(TIMER2_IRQn);
void TIMER2_IRQHandler(void)
{ static int raz=0;
if(raz == 0)
{ LPC_GPIO2->FIOSET = 0x1000;raz = 1;
} else {
LPC_GPIO2->FIOCLR = 0x1000; raz = 0;
}
LPC_TIM2->IR = 1; // Clear interrupt flag
}
LPC_TIM2->MR0 = 782/2; // 782 = 32 кHz
LPC_TIM2->MCR = 3;
LPC_TIM2->TCR= 0x01;
NVIC_EnableIRQ(TIMER2_IRQn);
void TIMER2_IRQHandler(void)
{ static int raz=0;
if(raz == 0)
{ LPC_GPIO2->FIOSET = 0x1000;raz = 1;
} else {
LPC_GPIO2->FIOCLR = 0x1000; raz = 0;
}
LPC_TIM2->IR = 1; // Clear interrupt flag
}
смотрим осциилографом, что получается:
___|___|___|___
Или наоборот
— — |— — |— — |— —
Вместо ожидаемого — — |___|— — |___|— — |___
При этом, если поставить брякпойнт на FIOSET или FIOCLR, а потом убрать и продолжить, то картина меняется
если мерять время этого второго паразита, то это будет 12-14 клоков
Однако, если перенести IR = 1; в начало
Код
void TIMER2_IRQHandler(void)
{ static int raz=0;
LPC_TIM2->IR = 1; // Clear interrupt flag
if(raz == 0)
{ LPC_GPIO2->FIOSET = 0x1000;raz = 1;
} else {
LPC_GPIO2->FIOCLR = 0x1000; raz = 0;
}
}
{ static int raz=0;
LPC_TIM2->IR = 1; // Clear interrupt flag
if(raz == 0)
{ LPC_GPIO2->FIOSET = 0x1000;raz = 1;
} else {
LPC_GPIO2->FIOCLR = 0x1000; raz = 0;
}
}
То все налаживается....
Теперь смотрю на все остальные прервывания, в том числе GPI прерывания GPIO прерывания Rising/Falling edge приходят одновременно? (2 ноги * прерывания по фронту и спаду) - там тоже получается какое-то левое повторное прерывание.. однако манипуляции с выносом очистки прерывания как можно раньше не прокатывают и, кажется, наоборот, от выноса очистки в конец количество левых прерываний уменьшается
ЗЫ: а в эмуляторе это не вылазит