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条回答
wgb123
1楼-- · 2019-07-26 04:47
323232 发表于 2018-10-8 11:27
上升沿啊,所以if(TIM5CH1_CAPTURE_STA&0X40)不成立啊,所以进else啊

捕获到了,第五位不是一么?
323232
2楼-- · 2019-07-26 07:54
wgb123 发表于 2018-10-8 11:29
捕获到了,第五位不是一么?

我不知道你说的一是什么,我只知道你旁边注释写着if(TIM5CH1_CAPTURE_STA&0X40)成立是判断接收到下降沿
wgb123
3楼-- · 2019-07-26 09:22
 精彩回答 2  元偷偷看……
323232
4楼-- · 2019-07-26 13:49
wgb123 发表于 2018-10-8 11:39
说错了,是第六位,TIM5CH1_CAPTURE_STA这个是八位的,第七位是记录是捕获完成标志位位,第六位是捕获电 ...

0x40是第六位吗?难道不是0100 0000么?不清楚,你再仔细看看,注释一般写着不会错
wgb123
5楼-- · 2019-07-26 16:28
HXYDJ 发表于 2018-10-7 10:51
初始化的时候上升沿捕获,TIM5CH1_CAPTURE_STA这个值为0,当第一个上升沿来的时候,TIM5CH1_CAPTURE_STA ...

谢谢解答,我以为上升沿来了,是硬件将这个标志位置一,原来这个是自己定义的一个八位数据。谢谢解答了。
wgb123
6楼-- · 2019-07-26 17:27
323232 发表于 2018-10-8 11:41
0x40是第六位吗?难道不是0100 0000么?不清楚,你再仔细看看,注释一般写着不会错

我一般是从第零位开始数

一周热门 更多>