我按自己的思路写了输入捕获实验,我用的是双边沿捕获:TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_BothEdge; 但是用LCD显示的时候发现,按一下按键,显示时间是十几秒,有时候连续几次都是十几秒,几十秒,这肯定运行不对啊,改了半天,加了好多语句还是运行不对,不知道哪里出了问题。
u32 Pulse_Wide;// 高电平时间u8 update; //检测完成标志u8 count=0; //溢出次数 ,最高位标记检测到一次边沿 void TIM5_IRQHandler(){ u32 timer=0,timer1; if(TIM_GetITStatus(TIM5, TIM_IT_CC1)) { if((count&0x80)==0) //判断之前是否检测到了一次边沿(count最高位标记检测到了一次边沿;) { TIM_Cmd(TIM5,DISABLE ); TIM_SetCounter(TIM5, 0); TIM_Cmd(TIM5,ENABLE ); //把变量清零 Pulse_Wide=0; count=0; update=0; timer=0; count=(count|0x80);//count最高位标记检测到了一次边沿; } else//如果之前检测到了一次边沿 { timer1=TIM_GetCapture1(TIM5);//记录捕获值 count&=0x7F; //记录溢出次数。 //计算脉冲宽度 timer=count; timer*=500000;//我设定的溢出周期是500000,即ARR的值。 timer+=timer1; Pulse_Wide=timer; timer=0; count=0; update=1;//标记完成检测,在主函数中清零。 } TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);//清零中断标志} if( TIM_GetITStatus(TIM5, TIM_IT_Update)){ if(update==0) { if((count&0x80)==1) //判断是否开始检测高电平时间 { count+=1; //记录溢出次数 TIM_ClearITPendingBit(TIM5,TIM_IT_Update);//清零中断标志 } }} }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>