ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
4 мая
1514351
reZident (25.04.2025 21:23, просмотров: 8192)
Подскажите непрограммисту, есть ли (если есть, то какие) подводные камни у такого вот обработчика прерывания? 
void TIMER2_IRQHandler(void)
{
static volatile uint32_t tm2_cr0; static volatile uint32_t tm2_cr1;
if (LPC_TIM2->IR & BIT(4)) { LPC_TIM2->IR |= BIT(4); if (LPC_TIM2->CR0 - tm2_cr0 >= FIN_MIN_PERIOD) { tm2_cr0 = LPC_TIM2->CR0; vars.fcntr[0]++; } } if (LPC_TIM2->IR & BIT(5)) { LPC_TIM2->IR |= BIT(5); if (LPC_TIM2->CR1 - tm2_cr1 >= FIN_MIN_PERIOD) { tm2_cr1 = LPC_TIM2->CR1; vars.fcntr[1]++; } } }

Давно работающая программа на контроллере LPC1765. Используются два входа одного таймера CAP2.0 и CAP2.1. Случайно обнаружилось, что при подаче на оба входа синхронной частоты (с любым значением от 0,1Гц до 10кГц) считаются импульсы только по входу CAP2.0 (инкрементируется vars.fcntr[0]). Если снять сигнал со входа CAP2.0, то счет по входу CAP2.1 (инкремент vars.fcntr[1]) возобновляется.