输入捕获中对库函数的配置还是比较好理解的,使能定时器对应的时钟,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清零,定时器重新置零,捕获下降沿