Чепуха, при одновременном (синхронном) поступлении двух сигналов в
таком случае будет считать только первый счётчик и вот почему: void TIMER2_IRQHandler(void)
{
static uint32_t tm2_cr0 = 0;
static uint32_t tm2_cr1 = 0;
// здесь пришло два синхронных сигнала, поэтому
// LPC_TIM2->IR == 0b 0011 0000
// Обработка канала 0 (CR0)
if (LPC_TIM2->IR & 0b 0001 0000) {// BIT(4) == 0b 0001 0000
LPC_TIM2->IR = 0b 0001 0000; // в этом месте LPC_TIM2->IR мы присваиваем 0b 0001 0000
uint32_t now = LPC_TIM2->CR0;
if ((now - tm2_cr0) >= FIN_MIN_PERIOD) {
tm2_cr0 = now;
vars.fcntr[0]++;
}
}
// Обработка канала 1 (CR1)
// Если оба сигнала придут одновременно, этот счётчик не сработает, т.к.
// LPC_TIM2->IR == 0b 0001 0000
// и при проверке пятого бита будет false
if (LPC_TIM2->IR & 0b 0010 0000) {// if (0b 0001 0000 & 0b 0010 0000) будет false и этот счётчик импульс не сосчитает
LPC_TIM2->IR = BIT(5);// Очистка флага
uint32_t now = LPC_TIM2->CR1;
if ((now - tm2_cr1) >= FIN_MIN_PERIOD) {
tm2_cr1 = now;
vars.fcntr[1]++;
}
}
}