STM32定时器 输入捕获实现双边沿检测

STM32的定时器有输入捕获功能,在STM32F10x_tim.h中对于TIM_Input_Capture_Polarity有如下定义


#define  TIM_ICPolarity_Rising             ((uint16_t)0x0000)
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002)
#define  TIM_ICPolarity_BothEdge           ((uint16_t)0x000A)
#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \
                                      ((POLARITY) == TIM_ICPolarity_Falling))
#define IS_TIM_IC_POLARITY_LITE(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \
                                           ((POLARITY) == TIM_ICPolarity_Falling)|| \
                                           ((POLARITY) == TIM_ICPolarity_BothEdge))       

可以 可以出具有BothEdge也就是双边沿检测,但是实际上并没有

如下图所示


执行的是没有双边沿的,因此我们要手工实现双边沿,如下见技术手册




也就是在中断中我们可以选择检测本次中断是上升沿中断还是下降沿中断,如果是上升沿中断,就修改为下降沿中断,反之就修改为上升沿中断。


void TIM1_CC_IRQHandler(void)// 用相应的定时器中断 
{
	u8 i;
	if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)//是TIM1CH2
	{
		TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);//清空捕获标志
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8))//如果当前是高电平,那么下降沿,反之设置上升沿~!!!灵感!
			TIM1->CCER|=(1<<1);
		else
			TIM1->CCER&=~(1<<1);
}}
			
	

既可以实现上升沿和下降沿



你可能感兴趣的:(stm32)