OpenEdv-开源电子网

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

中断处理如何简短?

[复制链接]

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-18 15:46:18 | 显示全部楼层 |阅读模式
5金钱
void TIM1_CC_IRQHandler(void)
{    
    static u16 CapValue1;//第奇数次中断把当前计数值存放在1里
    static u16 CapValue2;//第偶数次中断把当前计数值存放在2里
    static u8 n;         //连续的计数值分开存放标志
    u16 time;             //连续两个上升沿计数值的差
    static u8 flg;       //记录哪个值是最新的值 
    static u8 AverageFlag = 0;//计数10个求平均
    static u32 sum = 0;       //time的累加和
    
    if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
    {   
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); //清除中断标志位
        
        if (n++)//n初始值0,
        {
            n = 0; //使轮流存放在1和2里
           // CapValue2 = TIM_GetCounter(TIM1); //第偶数次进来把当前计数值存放在2里
            CapValue2 = TIM_GetCapture1(TIM1);          
        }
        else
        {
           //CapValue1 = TIM_GetCounter(TIM1);//第奇数次进来把当前计数值存放在1里
            CapValue1 = TIM_GetCapture1(TIM1);
        }
        
        /*轮流计算上升沿间隔时间,即减去上次计数值*/
        if (flg++) //flg初始为0,
        {
            if (CapValue2 > CapValue1)
            {
                time = CapValue2 - CapValue1;//未溢出,直接减去
            }
            else
            {
                time = CapValue2 + 65535 - CapValue1;//计数溢出
            }
            
            flg = 0; //本次2为新值,所以间隔时钟数为2-1.下次则1为新值,为1-2
        }
        else       
        {
            if (CapValue1 > CapValue2)
            {
                time = CapValue1 - CapValue2;//未溢出,直接减去
            }
            else
            {
                time = CapValue1 + 65535 - CapValue2;//计数溢出
            }
            
        } 
      
        sum += time;
        
        if (++AverageFlag  == 10)
        {             
            time = sum / 10;
            f = (1000000 / time);//计算频率,定时器72分频,1微秒计数1次。算出1秒内有多少个time微秒。

           AverageFlag = 0;
           sum = 0;   
        }            
    }
}

采集频率,想每10个周期求一次平均再输出。

最佳答案

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

回复【8楼】正点原子: --------------------------------- 找到原因了 昨天没有清启动停止标志位 我把标志位清掉就正常了,注释掉清标志位就又昨天那样了。 分析得出结论:应该是不停的执行TIM_Cmd(TIM1,ENABLE );和DISABLE这两句导致的错误。 补充:主要是不停执行 TIM_Cmd(TIM1, DISABLE);导致的。          一直使能虽然也不对,但不影响结果。
小小蜗牛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-18 15:46:19 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
找到原因了
昨天没有清启动停止标志位

我把标志位清掉就正常了,注释掉清标志位就又昨天那样了。

分析得出结论:应该是不停的执行TIM_Cmd(TIM1,ENABLE );和DISABLE这两句导致的错误。
补充:主要是不停执行 TIM_Cmd(TIM1, DISABLE);导致的。
         一直使能虽然也不对,但不影响结果。
小小蜗牛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-19 00:15:21 | 显示全部楼层
你这个貌似也不是很长啊,主要是不耗太多时间。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-19 08:08:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那就不改了,谢谢
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-19 08:09:49 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不过定义了好几个静态变量,有没有影响。
中断是不是只是看时间上的消耗,不考虑空间上的消耗呢?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-19 08:13:43 | 显示全部楼层
还有个问题要解决,就是第一次进来1读到的值,减去2的值0.不是一个正确的间隔。
想想怎么处理。
又加个标志位?
小小蜗牛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-20 00:56:07 | 显示全部楼层
回复【4楼】jiutianshenjian:
---------------------------------
没影响。
回复【5楼】jiutianshenjian:
---------------------------------
这个你自己想办法吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-21 17:03:18 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
 这个是什么原因呢?
我的TIM_Cmd失能后再使能就不对了。
失能前稳定50Hz,失能后,然后再使能就乱了,多为18 15Hz左右,
小小蜗牛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-21 23:14:50 | 显示全部楼层
回复【7楼】jiutianshenjian:
---------------------------------
那你看看是不是你的 ARR,PSC被修改了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-22 08:16:42 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
没可能啊。
TIM_Cmd(TIM1,DISABLE ); 
TIM_Cmd(TIM1,ENABLE ); 

这两句怎么能去修改那两个呢?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-11-22 09:05:06 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我是想 启动键按下时采集频率,停止键按下时停止采集。

我是这样做的:
1.初始化里注释掉了TIM_Cmd(TIM1,ENABLE );
  
2.按下启动键时:TIM_Cmd(TIM1,ENABLE );

3.按下停止键时:TIM_Cmd(TIM1,DISABLE );

4.再次启动时:TIM_Cmd(TIM1,ENABLE );

于是第二次启动时,就不准了,后面再停止启动都一样结果15 和 18Hz。

我发送这句话前又试了一下,又好了!~~不知道改了哪里。。。晕倒@@@@@@
小小蜗牛
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 19:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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