输入捕获理解

  输入捕获中对库函数的配置还是比较好理解的,使能定时器对应的时钟,GPIO口的初始化,模式设置为复用模式,引脚的复用映射,定时器的初始化,输入捕获的初始化,输入捕获时用到了中断,所以还要进行中断模式的配置ITConfig,定时器使能,NVIC中断使能。

对于我来说理解的重点是中断服务函数的理解

看的例程里面设置了TIM_CAPURE_SAT来判断输入捕获的状态,TIM_CAPURE_VAL来存放输入捕获的时间值

1.首先是判断是否进行一次成功捕获

if((TIM5CH1_CAPTURE_STA&0X80)==0)

如果捕获成功就将中断标志位清零

TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update
if((TIM5CH1_CAPTURE_STA&0X80)==0)//»¹Î´³É¹¦²¶»ñ	
	{
		if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)//Òç³ö
		{	     
			if(TIM5CH1_CAPTURE_STA&0X40)//ÒѾ­²¶»ñµ½¸ßµçƽÁË
			{
				if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//¸ßµçƽ̫³¤ÁË
				{
					TIM5CH1_CAPTURE_STA|=0X80;		//±ê¼Ç³É¹¦²¶»ñÁËÒ»´Î
					TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
				}else TIM5CH1_CAPTURE_STA++;
			}	 
		}
		if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//²¶»ñ1·¢Éú²¶»ñʼþ£¬resetÒ²¾ÍÊÇ0
		{	
			if(TIM5CH1_CAPTURE_STA&0X40)		//²¶»ñµ½Ò»¸öϽµÑØ 		
			{	  			
				TIM5CH1_CAPTURE_STA|=0X80;		//±ê¼Ç³É¹¦²¶»ñµ½Ò»´Î¸ßµçƽÂö¿í
			  TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//»ñÈ¡µ±Ç°µÄ²¶»ñÖµ.
	 			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 ÉèÖÃΪÉÏÉýÑز¶»ñ
			}else  								//»¹Î´¿ªÊ¼,µÚÒ»´Î²¶»ñÉÏÉýÑØ
			{
				TIM5CH1_CAPTURE_STA=0;			//Çå¿Õ
				TIM5CH1_CAPTURE_VAL=0;
				TIM5CH1_CAPTURE_STA|=0X40;		//±ê¼Ç²¶»ñµ½ÁËÉÏÉýÑØ
				TIM_Cmd(TIM5,DISABLE ); 	//¹Ø±Õ¶¨Ê±Æ÷5
	 			TIM_SetCounter(TIM5,0);
	 			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);		//CC1P=1 ÉèÖÃΪϽµÑز¶»ñ
				TIM_Cmd(TIM5,ENABLE ); 	//ʹÄܶ¨Ê±Æ÷5
			}		    
		}			     	    					   
 	}

上升沿的检测在初始化的时候已经设置,中断服务函数主要是检测下降沿

根据更新产生中断的方式来判断是否完成最终的捕获,如果是因为计数溢出产生的中断TIM_GetITStatus(TIM5, TIM_IT_Update) == RESET,表示没有捕获完全,但STA++,

判断是否捕获中断是否完成TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET,当捕获到一个下降沿的时候,标记捕获完成,TIM_GetCapture1(TIM5)获取时间值,然后将STA,VAL清零,定时器重新置零,捕获下降沿


你可能感兴趣的:(学习感悟)