Добрый день.

Стоит задача измерения длительности импульсов, для этого использую TIM8 в режиме захвата. На вход TIM8_CH4 подаю импульсы ШИМ частотой 1 кГц, которые генерятся с помощью TIM4. В итоге функция TIM_GetCapture4() возвращает неправильные случайные значения. Кто-нибудь сталкивался с подобной проблемой?

Код
void MEASURE_Init(void)
{
         GPIO_InitTypeDef GPIO_InitStructure;    
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef  TIM_ICInitStructure;
    
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 |  RCC_APB2Periph_SYSCFG, ENABLE);
    
        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = IN_FREQ_GPIO;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;            
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//GPIO_Speed_50MHz;                    
        GPIO_Init(GPIOC, &GPIO_InitStructure);    
    
         // Connect TIM pins to AF3  
        GPIO_PinAFConfig(GPIOC, IN_FREQ_GPIO_SRC, GPIO_AF_TIM8);                
    
        TIM_DeInit(CCP_TIM);                
        TIM_TimeBaseStructure.TIM_Prescaler = 4 - 1;//((SystemCoreClock / 2000000) - 1);//8 - 1;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//52;//104;    
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x00;
        TIM_TimeBaseInit(CCP_TIM, &TIM_TimeBaseStructure);            

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter = 0x08;//0x0;
        TIM_ICInit(CCP_TIM, &TIM_ICInitStructure);
        
        // Enable the TIM8 global Interrupt
        NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
                
        // TIM enable counter
        TIM_Cmd(CCP_TIM, ENABLE);

        // Enable the CC2 Interrupt Request
        TIM_ITConfig(CCP_TIM, TIM_IT_CC4, ENABLE);        
}

void TIM8_CC_IRQHandler(void)
{
        if(TIM_GetITStatus(CCP_TIM, TIM_IT_CC4) == SET)
        {
                msHalfPeriodVal = TIM_GetCapture4(CCP_TIM);
                            
                TIM_ClearITPendingBit(CCP_TIM, TIM_IT_CC4);                
            
                msExtiFlag = 1;        
        }
}