STM32定时器输入捕获测量频率

STM32F103C6T6不能使用同一个定时器的多个通道进行测量频率,只使用通道一时可以测量出频率,但是使用其他通道就不行,代码如下,看半天没看出哪有问题。


```c
void IC2Init(void)
{
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 2. GPIO初始化
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    // 上拉输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    // 上拉输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 3. 配置时基单元
    TIM_InternalClockConfig(TIM2);    // 选择内部时钟
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    
    TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;    // ARR,该值应该设置的尽量大,防止计数溢出
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;    // PSC,它的值决定了测周法的标准频率fc,它的值要根据测量信号的频率范围来调整,这里fc为1MHz
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;    
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    // 4. 配置输入捕获单元
    TIM_ICInitTypeDef TIM_ICInitStruct;
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;                    // IC通道1
    TIM_ICInitStruct.TIM_ICFilter = 0xF;                            // 滤波属性(滤波检测频率应远高于被测频率)
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;        // 边沿检测
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;                // 触发信号分频器
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;    // 配置数据选择器(这里选择直连通道)
    TIM_ICInit(TIM2, &TIM_ICInitStruct);
    
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;                    // IC通道2
    TIM_ICInitStruct.TIM_ICFilter = 0xF;                            // 滤波属性(滤波检测频率应远高于被测频率)
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;        // 边沿检测
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;                // 触发信号分频器
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;    // 配置数据选择器(这里选择直连通道)
    TIM_ICInit(TIM2, &TIM_ICInitStruct);

    // 5. 选择从模式的触发源
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
    
    // 6. 选择从模式触发后执行的操作
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
    
    // 7. 开启定时器
    TIM_Cmd(TIM2, ENABLE);
}

uint32_t IC_GetFreq21(void)
{
    // 测周法标准频率为1MHz
    return 1000000 / TIM_GetCapture1(TIM2) ;    
}
uint32_t IC_GetFreq22(void)
{
    // 测周法标准频率为1MHz
    return 1000000 / TIM_GetCapture2(TIM2);
}

```