OpenEdv-开源电子网

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

新手请教 输入捕获上面的疑问

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-21
在线时间
1 小时
发表于 2015-10-21 09:30:35 | 显示全部楼层 |阅读模式
5金钱

void TIM5_IRQHandler(void)
{

  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)//
  { 
   if(TIM5CH1_CAPTURE_STA&0X40)  //   {      
    TIM5CH1_CAPTURE_STA|=0X80;  //
    TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
       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);  //
   }     
  }                    
  }
 

 

最佳答案

查看完整内容[请看2#楼]

给你说下我理解的输入捕获语句的含义:因为例程里面设置的是上升沿捕获,所以捕获到上升沿的时候会进入中断,也就是进入if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)这条语句,这个if成立就说明已经捕获了一个上升沿。而if(TIM5CH1_CAPTURE_STA&0X40) 语句成立的条件是捕获到跳变沿(上升沿和下降沿都可以使该if语句成立),而显然之前已经捕获一个上升沿,这条if语句一旦再次成立就说明又捕获了一 ...
没个性,不签名。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-3-24
在线时间
4 小时
发表于 2015-10-21 09:30:36 | 显示全部楼层
给你说下我理解的输入捕获语句的含义:因为例程里面设置的是上升沿捕获,所以捕获到上升沿的时候会进入中断,也就是进入if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)这条语句,这个if成立就说明已经捕获了一个上升沿。而if(TIM5CH1_CAPTURE_STA&0X40) 语句成立的条件是捕获到跳变沿(上升沿和下降沿都可以使该if语句成立),而显然之前已经捕获一个上升沿,这条if语句一旦再次成立就说明又捕获了一个下降沿(之前有一个上升沿,再次跳变只能是下降沿!),到此为止完成了一次高电平的捕获!  TIM5CH1_CAPTURE_STA|=0X80;  //
     TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
        TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //
这三条语句分别是标记成功捕获;记录捕获值;再次设置上升沿捕获等待下一个高电平。
else之后的说明上一个if没成立,也就是只检测到上升沿还没检测到下降沿,更说明上升沿是刚刚检测到的,在等待下降沿的来临,此刻立马设置 TIM5CH1_CAPTURE_STA=0;   //
     TIM5CH1_CAPTURE_VAL=0;
      TIM_SetCounter(TIM5,0);//
开始让定时器工作记录上升沿持续时间,等待再次跳变(也就是下降沿,也就是等待上一个if语句的成立)
希望对你有帮助
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-21
在线时间
1 小时
 楼主| 发表于 2015-10-22 08:37:46 | 显示全部楼层
回复【2楼】乐土:
------------------------------真是谢谢你不辞辛苦的帮我解答了,我不明白的地方就是,既然在定时器中断中调用if语句来检测上升沿,那么你这句话“更说明上升沿是刚刚检测到的”的“刚刚”不是存在最大65535*1us的误差吗?(例程里设定定时器频率1MHZ前提下)
没个性,不签名。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-21
在线时间
1 小时
 楼主| 发表于 2015-10-22 08:57:27 | 显示全部楼层
回复【2楼】乐土:
---------------------------------
谢谢你了,真是谢谢你
没个性,不签名。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-21
在线时间
1 小时
 楼主| 发表于 2015-10-22 09:01:47 | 显示全部楼层
回复【3楼】大山里的花儿那么红:
---------------------------------
说错了,是时钟频率72分频基础下,
没个性,不签名。
回复

使用道具 举报

10

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-3-24
在线时间
4 小时
发表于 2015-10-22 11:05:59 | 显示全部楼层
原子哥之前有提到:STM32有三级流水线,指令周期是不一定的。ARM给出的是1.25MIPS/Mhz(一个平均执行速度),就是1Mhz的频率,每秒钟可以执行1.25M指令。72M,那么就是72*1.25,这样算下来一条指令平均执行速度是1/(72*1.25)us,也就是大概11个ns,在这里对高电平时间的捕获不会产生太大影响。
不知道理解的对否。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-21
在线时间
1 小时
 楼主| 发表于 2015-10-22 16:08:38 | 显示全部楼层
回复【6楼】乐土:
---------------------------------
谢谢你的回答 ,不过我觉得这个最大的误差应该是一个定时器周期吧
,因为在定时器中断中进行的if判断
没个性,不签名。
回复

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2017-11-3
在线时间
31 小时
发表于 2018-3-12 15:59:54 | 显示全部楼层
前辈你好,请问当检测到上升沿来临时,单片机程序进入中断服务程序,然后将TIM5CH1_CAPTURE_STA的值至为0X40,接着程序会进入到while(1)主循环中,在主循环中TIM5CH1_CAPTURE_STA的值又会被至0。然后即使下降沿来了,程序进入中断服务函数中,但是if(TIM5CH1_CAPTURE_STA&0X40)函数根本进不去啊?怎么计算高电平时间呢?求指教。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 01:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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