OpenEdv-开源电子网

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

关于捕获的问题:请求大师指导,诚心请求指点迷津!

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-6-24 20:12:36 | 显示全部楼层 |阅读模式
本人是一个普普通通的自学者,5月份买的战舰板,是以寄存器版本学习的,现在已经自学到捕获章节了。对于捕获例程中的中断服务函数很是不解,想了好长时间,还是不清楚,现在把我的问题提出来,真心求教高人指点迷津!
下面是原代码:
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获,程序一开始会自然进入到该句
{                           
if(TIM5->SR&0X01)//TIM5溢出,程序运行,捕获前可能会溢出  {     
    if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了,
    {                       
   if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了TIM5CH1_CAPTURE_STA&0X3F)==0X3F是最大值;
      { 
        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
        TIM5CH1_CAPTURE_VAL=0XFFFF;
      }
     else TIM5CH1_CAPTURE_STA++;
    }
  }
  if(TIM5->SR&0x02)//捕获1发生下降沿捕获事件,  只要发生了捕获,不管是上升沿还是下降沿捕获,TIMx_SR的bit1(CC1IF位)就会自动置1。
  {
       if(TIM5CH1_CAPTURE_STA&0X40)//如果捕获到的是一个下降沿
    { 
      TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获到一次高电平脉宽
      TIM5CH1_CAPTURE_VAL=TIM5->CCR1;//获取当前的捕获值.TIM5->CNT没有清零该语句有意义吗?也就是说TIM5->CCR1的值能正确反映捕获值吗?
      TIM5->CCER&=~(1<<1);//CC1P=0 设置为上升沿捕获
     }
    else  //如果捕获的是一个上升沿
      {
       TIM5CH1_CAPTURE_STA=0;//清空
       TIM5CH1_CAPTURE_VAL=0;
       TIM5CH1_CAPTURE_STA|=0X40;//标记捕获到了上升沿,以便让程序进入到“1 if”语句;当捕获到上升沿时     
       TIM5->CNT=0;//计数器清空,
       TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
      }
    }
 }
TIM5->SR=0;//清除中断标志位,以便可以重复捕获
}

本人对本程序的理解不知正确与否?:
1,整个捕获中断服务函数可以视为2句,其中所有的if语句算一句,“TIM5->SR=0;”语句算一句;首先要明确知道程序刚运行时发生中断的条件是产生了边沿事件且是上升沿事件
(在TIM5_Cap_Init(u16 arr,u16 psc)函数里有定义);只有产生了上升沿才有可能出现“TIM5CH1_CAPTURE_STA|=0X80”;首先只有当捕获到上升沿时并将TIM5->CNT清零,随之捕获到下降沿时,TIM5_CCR1的值才是计算脉宽的重要参数;
2,当程序捕获到上升沿时,是直接执行下面代码的?是吗?我觉得一捕获到上升沿就应该将 TIM5->CNT=0清零!不知道对不对?

    else  //还未开始,如果捕获到上升沿或者说信号还处于上升沿阶段
      {
       TIM5CH1_CAPTURE_STA=0;//清空
       TIM5CH1_CAPTURE_VAL=0;
       TIM5CH1_CAPTURE_STA|=0X40;//标记捕获到了上升沿,以便让程序进入到“1 if”语句;当捕获到上升沿时     
        
       TIM5->CNT=0;//计数器清空,
       TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
      }

2,可不可以将主函数中的计算脉宽语句也放到中断服务函数里来;
3,程序中出现了两次“TIM5CH1_CAPTURE_STA|=0X80”语句,当第一个(即if(TIM5CH1_CAPTURE_STA&0X40))条件语句里出现TIM5CH1_CAPTURE_STA|=0X80时,主函数里的计算脉宽语句有意义吗?因为 TIM5->CNT计数器此时的值不确定。当然,原程序不会错,可是我就是不理解。
手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-24 21:11:14 | 显示全部楼层
1,可以这么理解.
2,你的建议不错,确实在获取到CNT值之后,就应该立马清零,和设置反转捕获沿.以提高准确度.
2,可以,但不建议.
3,事实上,
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了TIM5CH1_CAPTURE_STA&0X3F)==0X3F是最大值;
      { 
        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
        TIM5CH1_CAPTURE_VAL=0XFFFF;
      } 
这个标记捕获,很难执行到.
只需要一次TIM5CH1_CAPTURE_STA|=0X80;就可以计算脉宽了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-6-24 21:14:43 | 显示全部楼层
谢谢你!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 10:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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