ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
4 мая
1514457 Топик полностью
Бoмж (26.04.2025 14:56, просмотров: 175) ответил reZident на Ага. Логично. Чтение-модификация-запись: читается 0x00011000, накладывается маска 0x00001000, получается то же самое число 0x00011000 и сбрасываются оба прерывания вместе. Спасибо! А программист уверял меня, что все давно проверено и косяков тут быть не может :-)
Чепуха, при одновременном (синхронном) поступлении двух сигналов в таком случае будет считать только первый счётчик и вот почему: 
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]++;
}
}
}
memento mori