Стоит задача измерения длительности импульсов, для этого использую 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;
}
}
{
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;
}
}