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);
}
```