OpenEdv-开源电子网

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

TIMER输入捕获中断服务函数越看越迷糊,请求讲解一下

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-9-13 00:20:04 | 显示全部楼层 |阅读模式
TIMER输入捕获中断服务函数源码:

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8  TIM5CH1_CAPTURE_STA=0;//输入捕获状态,先清零
u16 TIM5CH1_CAPTURE_VAL;//输入捕获值
//定时器5中断服务程序
void TIM5_IRQHandler(void)
{
  u16 tsr;
  tsr=TIM5->SR;
 if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获,也就是说如果TIM5CH1_CAPTURE_STA==0;
  {
    if(tsr&0X01)//溢出,这时如果TIM5->SR的bit0==1;表达式相当于“TIM5->SR&0x01”
     {//"位0 UIF"更新中断标志位,
       if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了,如果bit6==1,则TIM5CH1_CAPTURE_STA
        {//的值至少是“ox0010 0000”,
          if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了,这是一种特殊情况
            {
              TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次,这将导致第一个if表达式为假
              TIM5CH1_CAPTURE_VAL=0XFFFF;
             }else TIM5CH1_CAPTURE_STA++;
        }
      }
   if(tsr&0x02)//捕获1发生捕获事件
     {
        if(TIM5CH1_CAPTURE_STA&0X40)//捕获到一个下降沿,即如果bit6==1,
         {
           TIM5CH1_CAPTURE_STA|=0X80;//,将bit7置位,标记成功捕获到一次高电平脉宽
           TIM5CH1_CAPTURE_VAL=TIM5->CCR1;//获取当前的捕获值.
           TIM5->CCER&=~(1<<1);//CC1P=0 设置为上升沿捕获
         } else //还未开始,第一次捕获上升沿,本中断服务函数应该从这里开始分析,该内容类似初始化
            {
              TIM5CH1_CAPTURE_STA=0;//清空
              TIM5CH1_CAPTURE_VAL=0;
              TIM5CH1_CAPTURE_STA|=0X40;//标记捕获到了上升沿
              TIM5->CNT=0;//计数器清空
              TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
            }
      }
   }//第1个if的封口
TIM5->SR=0;//清除中断标志位
}
手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2017-8-2
在线时间
24 小时
发表于 2018-1-28 16:24:29 | 显示全部楼层
TIM5_IRQHandler里面有两个中断,分别是输入捕获中断和更新中断,如果在第一次上升沿进入中断后STA的Bit6是0,那么进行如下配置:
TIM1CH1_CAPTURE_STA=0;                //清空
TIM1CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM1,0);                //计数器清零,开始计数
TIM1CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获

因为上面已经配置成下降沿触发了,第二次进来时进行如下设置:

TIM1CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平,标志捕获完成
TIM1CH1_CAPTURE_VAL=TIM_GetCapture1(TIM1);//读取计数值
TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获

这样就完成了一次高电平捕获,但是如果当TIM1的计数值从上升沿0开始计数时,计到65536都没有下降沿触发时,就会进入一次更新中断,进入上面的if更新中断:TIM5CH1_CAPTURE_STA++

如果高电平的时间在0到65536时,只会有捕获中断,当计数器有溢出是就进入一次更新中断标记一次,
所以在计数器有溢出时的时间就是:65536*溢出次数+最后一次计数值,单位是us。

回复 支持 1 反对 0

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2016-4-18 14:42:12 | 显示全部楼层
正点原子 发表于 2015-9-22 23:01
回复【7楼】霸王表急:
---------------------------------
可以学习下我们例程

原子的视频感觉对库函数那些配置说的挺好的,但是一涉及到c语言编程的几乎一带而过都默认已经我们已经会了。。。不适合基础比较薄弱的,,,为了让视频不超时而略过。。。真是醉了,让我们这些新手蛋疼
回复 支持 1 反对 0

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
发表于 2013-9-13 08:59:24 | 显示全部楼层
凌晨还在看代码,精神可嘉! 这么多注释还有什么不明白的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-13 11:24:15 | 显示全部楼层
回复【楼主位】wangyan915205:
---------------------------------
我不是有《STM32开发指南》么?
看那里的介绍。
其实很简单啊,核心就是捕捉上升沿和下降沿,然后差值一减既得高电平脉宽
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-9-14 13:31:30 | 显示全部楼层
谢谢,明白了!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-11-14
在线时间
4 小时
发表于 2015-4-22 15:50:36 | 显示全部楼层
表示也看糊涂了
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-11-14
在线时间
4 小时
发表于 2015-4-22 16:02:43 | 显示全部楼层
回复【5楼】伙上伴冰:
---------------------------------
又看明白了
回复 支持 反对

使用道具 举报

14

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-8-5
在线时间
9 小时
发表于 2015-9-19 19:11:40 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
但是我用硬件仿真的时候总是不停的触发定时器的中断,没有按下键的时候也还是会进中断,中断到底是什么触发的呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-22 23:01:38 | 显示全部楼层
回复【7楼】霸王表急:
---------------------------------
可以学习下我们例程
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-8-2
在线时间
3 小时
发表于 2019-8-16 15:27:49 | 显示全部楼层
17369320302 发表于 2018-1-28 16:24
TIM5_IRQHandler里面有两个中断,分别是输入捕获中断和更新中断,如果在第一次上升沿进入中断后STA的Bit6是 ...

感谢  !!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 21:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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