输入捕获实验 中断函数if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)与if(TIM5CH1_CAPTURE_STA&0X40)能否互换顺序

2019-07-21 08:53发布

void TIM5_IRQHandler(void)               //
{

        if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {          
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)   //if2
                 
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了    //if3          (ˇ?ˇ) 我感觉两个if语句顺序应该互换
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件     先进else后进if
                {       
                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                           因else后中断标志发生改变所以捕获的是下降沿
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿      
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);                    //从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;  
                                 TIM_SetCounter(TIM5,0);            //记刚摁下WK_UP时 此刻CNT=0;
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                   
        }

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

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
275891381
1楼-- · 2019-07-21 10:39
效果一样,但是下面这样节约代码运行时间if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)   //if2
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了





if(TIM5CH1_CAPTURE_STA&0X40)  放在前面每次中断都要判断两个if,因为上升沿捕获了,这个if一直成立判断完还要判断if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)在前面溢出了才判断两个if,平时if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) 不成立,if(TIM5CH1_CAPTURE_STA&0X40) 不判断


单片机够快,影响不大

一周热门 更多>