关于输入捕获问题

2019-07-14 17:08发布

void tiM2_IRQHandler(void)
{

         if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
        {         
                if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
                 
                {            
                        if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM2CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM2CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        
                        if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
                        {         
                                TIM2CH1_CAPTURE_STA=TIM2CH1_CAPTURE_STA&0Xbf;
                                num_rise++;
                                HVAL=TIM_GetCapture1(TIM2);
                                HTIME=TIM2CH1_CAPTURE_STA&0X3f;
                                   TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                if(num_rise==0){
                                TIM2CH1_CAPTURE_STA=0;                        //清空
                                TIM2CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM2,0);
                                TIM2CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                           TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                                }
                                if(num_rise==1)
                                {
                                        num_rise=0;//为下次测量做准备
                                        TIM2CH1_CAPTURE_STA|=0X80;//周期捕获成功
                                        TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
                                }
                                
                        }                    
                }                                                                                    
         }

    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

}
这是中断服务函数,在这边我捕获一个上升沿和一个下降沿来捕获高电平时间,然后再捕获一个上升沿来捕获周期时间,但是我这样好像只能同时测一个范围内的频率和占空比。。。。求解答!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。