61

帖子

0

TA的资源

一粒金砂(初级)

21
 
版主,目前我TIM中断是这么处理的:
IT_Status = TIM4->SR & (TIM_IT_CC1 | TIM_IT_Update);
    IT_Enable = TIM4->DIER & (TIM_IT_CC1 | TIM_IT_Update);

    IT_Flag = IT_Status & IT_Enable;
    TIM4->SR = (INT16U)(~(TIM_IT_CC1 | TIM_IT_Update));

    if (ValBit(IT_Flag, 0))
    {
        O4FLOW2_FreqA_Step_CNT1++;
                TIM4->SR &= 0xfffe;
    }

//==
    if (ValBit(IT_Flag, 1))
    {        // TIM_IT_CC1
        // Clear TIM2 Capture compare interrupt pending bit
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);

        // Get the Input Capture value
        O4Flow2_FreqA_IC1Value1 = TIM_GetCapture1(TIM4);

        if (O4Flow2_FreqA_IC1Value1 != 0)
        {
            
                        O4Flow2_FreqA_IC1Value1 += 0x10000*(O4FLOW2_FreqA_Step_CNT1-1);
            // Frequency computation
            O4Flow2_FrequencyA = 36000000000  / O4Flow2_FreqA_IC1Value1;
                        O4FLOW2_FreqA_Step_CNT1 = 0;
        }
        else
        {
            //DutyCycle = 0;
            O4Flow2_FrequencyA = 0;
        }
    }

不过有一个疑问,是否CC1IF使能的话,也会导致UIF中断位置位?
如果是的话,那么O4Flow2_FreqA_IC1Value1 += 0x10000*(O4FLOW2_FreqA_Step_CNT1-1); 这句中O4FLOW2_FreqA_Step_CNT1-1 是有道理的。

因为我刚才测试,这个计数值-1的话,好像频率测量是对的。 不过没想通为何要-1
此帖出自stm32/stm8论坛
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

22
 
                                 这个问题我也苦恼的很久,定时器配置时间太长和太短,都有利有弊,目前还没想到好的解决办法
此帖出自stm32/stm8论坛
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

23
 
请问21楼的中断处理之前,TIM4初始化是如何做的?

请注意TIMx_CR1中URS位的设置。
此帖出自stm32/stm8论坛
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

24
 
                                 还是版主牛
此帖出自stm32/stm8论坛
 
 
 

回复

97

帖子

7

TA的资源

一粒金砂(初级)

25
 


URS位设置的是0,用TIM_UpdateRequestConfig(tTIMx, TIM_UpdateSource_Regular); 设置一下就OK了。谢谢!

这样就只有计数器溢出才会update,21楼的那个-1操作也不需要了
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

26
 
URS位设置的是0
URS=0时,有三种情况可以产生更新中断,你看看多出的那一次更新中断是否与此有关?

STM32_TIMx_CR1_URS.GIF (8.36 KB)

STM32_TIMx_CR1_URS.GIF

此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

27
 
                                 嘿嘿,我介绍的办法在程序设置上比你的方法简单很多,可是你却不愿意采纳,
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

28
 
不是,我这个是智能识别的,所以我觉得内部重设置TIM时钟频率始终不是最佳办法。 不过还是谢谢版主。
我现在URS设成1,那么只有计数器溢出才会产生UIF,这样我就可以准确计算出溢出次数,从而重新计算整个count计数值了。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

29
 
IT_Status = TIM4->SR & (TIM_IT_CC1 | TIM_IT_Update);
    IT_Enable = TIM4->DIER & (TIM_IT_CC1 | TIM_IT_Update);

    IT_Flag = IT_Status & IT_Enable;
    TIM4->SR = (INT16U)(~(TIM_IT_CC1 | TIM_IT_Update));   <--- ①这里

    if (ValBit(IT_Flag, 0))
    {
        O4FLOW2_FreqA_Step_CNT1++;
                TIM4->SR &= 0xfffe;  <--- ②还有这里
    }


为什么要2次清除标志?

在位置①处,有可能错误地清除某个标志:比如UIF产生中断,在读出IT_Status 之后,又产生CC1F事件,你将错误地清除CC1F。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

30
 


这些是之前技术支持给我的代码,(除了2这行是我后来自己加的)。
那版主的意思是1句不要? 还是2句不要?
应该是2句不要吧,因为IT_Flag已经读出来所有使能并触发了的标志位了。

除非出现这种情况:当我执行1的时候,正好CC1IF来了,那样的确会错误清除CC1IF。 那么就必须要在2这个位置去清除标志位了。
此帖出自stm32/stm8论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

31
 
我还是这么处理比较妥当:
IT_Status = TIM4->SR & (TIM_IT_CC1 | TIM_IT_Update);
    IT_Enable = TIM4->DIER & (TIM_IT_CC1 | TIM_IT_Update);

    IT_Flag = IT_Status & IT_Enable;
    //TIM4->SR = (INT16U)(~(TIM_IT_CC1 | TIM_IT_Update));

    if (ValBit(IT_Flag, 0))
    {
            TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
        O4FLOW2_FreqA_Step_CNT1++;
    }

//==
    if (ValBit(IT_Flag, 1))
    {        // TIM_IT_CC1
        // Clear TIM2 Capture compare interrupt pending bit
        TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
          ...............
          ...............
          ...............

   }
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表