初级会员

- 积分
- 123
- 金钱
- 123
- 注册时间
- 2017-11-3
- 在线时间
- 31 小时
|
各位前辈,小弟正在学习STM32的输入捕获部分,但是对于这部分的实现代码感觉十分疑惑,小弟是这样理解的,当上升沿到来之时,先进入捕获中断的else语句。计数器被至0,同时TIM5CH1_CAPTURE_STA被赋值为40H,再设置为下降沿捕获。然后程序进入while(1)主循环中,TIM5CH1_CAPTURE_STA被赋值为00H,然后就算是下降沿来了之后,程序进入中断服务函数中,但是其只能进入 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) 这个大语句中,因为TIM5CH1_CAPTURE_STA被赋值为00H,所以根本无法进入到 if(TIM5CH1_CAPTURE_STA&0X40) 这个语句中,所以跟本无法计算高电平持续的时间,更不要提计算时间是否溢出了。这个代码我已经下载进板子中试过了,是可以用的,但是这个过程实在想不通,请各位前辈解惑,谢谢。
/**************中断服务程序***********/
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
{
if(TIM5CH1_CAPTURE_STA&0X40) //已经捕获到高电平了
{
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发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); //获得TIMx输入捕获1的值
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
}
else
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
}
}
/**************主程序***********/
while(1)
{
if((TIM5CH1_CAPTURE_STA&0x80)) //成功捕获到了一次上升沿
{
temp=TIM5CH1_CAPTURE_STA&0x3f;
temp=temp*65536; //溢出时间总和
temp=temp+TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
printf("高电平持续时间为:%d us\r\n",temp);
TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
}
}
|
|