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); //清除中断标志位
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
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) 不判断
单片机够快,影响不大
一周热门 更多>