PWM输入捕获

2019-07-24 12:16发布

本帖最后由 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); //清除中断标志位

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
HXYDJ
1楼-- · 2019-07-25 07:44
wgb123 发表于 2018-10-8 10:39
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        
   ...

if不成立肯定就进的是else
HXYDJ
2楼-- · 2019-07-25 09:10
wgb123 发表于 2018-10-8 10:39
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        
   ...

发生捕获事件后,if语句不成立肯定就进的是else语句了。
323232
3楼-- · 2019-07-25 10:04
.......不都说了么那个if是捕获下降沿的,既然不是下降沿那就是else呗。
wgb123
4楼-- · 2019-07-25 15:30
 精彩回答 2  元偷偷看……
wgb123
5楼-- · 2019-07-25 18:27
323232 发表于 2018-10-8 11:05
.......不都说了么那个if是捕获下降沿的,既然不是下降沿那就是else呗。

初始化是捕获上升沿啊,怎么成了下降沿?
323232
6楼-- · 2019-07-25 23:04
wgb123 发表于 2018-10-8 11:26
初始化是捕获上升沿啊,怎么成了下降沿?

上升沿啊,所以if(TIM5CH1_CAPTURE_STA&0X40)不成立啊,所以进else啊

一周热门 更多>