本帖最后由 wgb123 于 2018-10-7 11:47 编辑
对于输入捕获事件有点疑问,程序初始化是上升沿捕获,为什么if(TIM5CH1_CAPTURE_STA&0X40)为真就是捕获到一个下降沿?不是应该先设置下降沿捕获,然后判断该位吗?才能判断是否是下降沿。
还有一个就是判断捕获事件是否发生的函数看不懂
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
{
ITStatus bitstatus = RESET;
uint16_t itstatus = 0x0, itenable = 0x0;
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_TIM_GET_IT(TIM_IT));
itstatus = TIMx->SR & TIM_IT;
itenable = TIMx->DIER & TIM_IT;
if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
返回值为0或1;1表示发生捕获事件,但是上面的函数看的不大懂。
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++; //这里有疑问,高电平时间太长,说明会发生更新中断,中断次数应该+1;但是我觉得应该是写在上面的if里面,为什么 要写在else后面?
}
}
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿 //这个else有疑问,为什么上面的if不成立就能判断捕获到上升沿?
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,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&0X3F)==0X3F)//高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
现在就是这个不懂了,高电平太长,不是应该执行TIM5CH1_CAPTURE_STA++么;
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)那为什么要把低五位取出来?低五位不是放溢出次数么?我看原子的视频觉得应该是,发生一次更新中断就要执行一次 TIM5CH1_CAPTURE_STA++。
定时器更新中断就是定时器溢出中断,仔细看资料和程序注释。
一周热门 更多>