OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2942|回复: 4

关于STM32输入捕获部分代码的疑问

[复制链接]

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2017-11-3
在线时间
31 小时
发表于 2018-3-24 09:41:06 | 显示全部楼层 |阅读模式
各位前辈,小弟正在学习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; //开启下一次捕获
  }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-3-24 13:49:44 | 显示全部楼层
程序初始化的时候设置的是上升沿捕获,当上升沿到来的时候,进入的是这段代码
TIM5CH1_CAPTURE_STA=0; //清空
   TIM5CH1_CAPTURE_VAL=0;
   TIM_SetCounter(TIM5,0);
   TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
此时开始计数,并标记已经捕获到了上升沿,然后设置为下降沿捕获,当高电平变为低电平的时候,也就是下降沿来了。此时程序进入的是这段代码
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
  {
   TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
   TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); //获得TIMx输入捕获1的值
   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
  }
并标记高电平捕获完成。然后又设置为上升沿捕获,准备捕获下一次高电平。主程序根据TIM5CH1_CAPTURE_STA这个状态位判断是否捕获到了高电平。注意TIM5CH1_CAPTURE_STA这个状态位,0x80代表捕获高电平结束,0x40代表捕获到了上升沿。主程序中判断状态位的最高位为0x80时,才进行数据处理,否则代表高电平未捕获成功,不进行任何操作。
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2017-11-3
在线时间
31 小时
 楼主| 发表于 2018-3-25 14:43:52 | 显示全部楼层
本帖最后由 STM32白丁 于 2018-3-25 15:01 编辑
HXYDJ 发表于 2018-3-24 13:49
程序初始化的时候设置的是上升沿捕获,当上升沿到来的时候,进入的是这段代码
TIM5CH1_CAPTURE_STA=0; // ...

前辈你好,感谢你的解答,前辈我还想请问一下,当上升沿来临之时,程序进入
  TIM5CH1_CAPTURE_STA=0;
   TIM5CH1_CAPTURE_VAL=0;
   TIM_SetCounter(TIM5,0);
   TIM5CH1_CAPTURE_STA|=0X40;
   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
这几段代码,这几段代码执行完之后,程序然后不是应该跳入while循环中吗?难道还继续在中断服务函数中一直等到下降沿到来,然后在跳入到while循环中执行?(也就是说当上升沿到来之后变成高电平的时候,程序是继续呆在中断函数中还是进入到while循环中?)
回复 支持 反对

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-3-26 09:46:55 | 显示全部楼层
STM32白丁 发表于 2018-3-25 14:43
前辈你好,感谢你的解答,前辈我还想请问一下,当上升沿来临之时,程序进入
  TIM5CH1_CAPTURE_STA=0;
...

中断里面代码执行完就继续返回主函数,在while循环中判断if((TIM5CH1_CAPTURE_STA&0x80))   如果这个条件成立,也就是高电平捕获完成,就进入if语句执行,如果中断捕获未完成就在while语句中一直循环。直到中断到来,在进入中断。
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2017-11-3
在线时间
31 小时
 楼主| 发表于 2018-3-29 09:45:41 | 显示全部楼层
HXYDJ 发表于 2018-3-26 09:46
中断里面代码执行完就继续返回主函数,在while循环中判断if((TIM5CH1_CAPTURE_STA&0x80))   如果这个条件 ...

理解了,谢谢您的答复。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 04:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表