void TIM5_IRQHandler(void)
{
u16 tsr;
tsr = TIM5->SR;
if((TIM5CH1_CAPTURE_STA&0x80)==0)//还未捕获
{
if(tsr&0x01)//溢出
{
if(TIM5CH1_CAPTURE_STA&0x40)//已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0x3f)==0x3f)//高电平太长了
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = 0xffff;
}
else
{
TIM5CH1_CAPTURE_STA++;
}
}
}
if(tsr&0x02)
{
if(TIM5CH1_CAPTURE_STA&0x40)//捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA |= 0x80;//标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL = TIM5->CCR1;//获取当前捕获值
TIM5->CCER &= ~(1<<1); //重新设置为上升沿捕获
}
else
{
TIM5CH1_CAPTURE_STA = 0;//清空
TIM5CH1_CAPTURE_VAL = 0;
TIM5CH1_CAPTURE_STA |= 0x40;
TIM5->CNT = 0;
TIM5->CCER |= 1<<1;//设置为下降沿捕获
}
}
}
TIM5->SR = 0;//清除中断标志
}
我在实验中省掉了第一个if中的语句中的一堆括号,即(TIM5CH1_CAPTURE_STA&0x8),改成 if(TIM5CH1_CAPTURE_STA&0x80==0)//还未捕获,不能实现捕获,这是什么原因a
|