初级会员

- 积分
- 176
- 金钱
- 176
- 注册时间
- 2016-7-12
- 在线时间
- 35 小时
|
1金钱
我按自己的思路写了输入捕获实验,我用的是双边沿捕获: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);//清零中断标志
}
}
}
}
|
|