8044|34

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我用定时器的扑获方式我发现他老是丢中断 [复制链接]

                                 发现有时候扑获来的数据少一半  请问管脚是不是要配成 FLOATING
此帖出自stm32/stm8论坛

最新回复

                                 我在输入框里输入端口名或者变量名称后,敲回车就消失了,这是什么原因呢?请高手指点,谢谢!   详情 回复 发表于 2009-3-9 17:57
点赞 关注
 

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

我遇到同样的问题

                                 我遇到同样的问题,采用TIM2的CH1通道,使用捕获输入的方式测频率,在溢出中断和捕获中断几乎同时到来的时候,就发现丢捕获中断的现象!希望香版主帮忙给点意见呀?
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我发现的是益处中断丢了一半

                                 我发现的是益处中断丢了一半 叫人超级郁闷 到底是怎么回师   
此帖出自stm32/stm8论坛
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 

还有我用的跟你一样也是TIM2的CH1通道

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 

是比较郁闷

                                 是呀,我也是比较郁闷,按照CM3的NVIC的相关资料说明,即使正在处理溢出中断的时候,有捕获产生,也会置相应的捕获标志位,等中断返回后,还会立即进入中断处理捕获的,但是实际情况是,紧跟着后面的这一次捕获并不置相应的捕获标志位,也就是说“丢中断”现象,开始我用MKD的软件仿真器,进行仿真发现这个问题,我当时怀疑是软件仿真器的bug。但是我把程序下载到目标板运行后,也是一样的结果
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 

我的TIM2中断处理代码

/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
 u16 Capture_Value1 = 0;    /*  value of the TIM2 capture */        
       u16 Capture_Value2 = 0;
static u8  flag=0;
 u16 Overflow_Counter = 0;
 u16 TIM2_SR=0;

void TIM2_IRQHandler(void)
{
     u8 i=0;
       u16 Auto_Reload_REG; 

 Auto_Reload_REG = TIM2->ARR;
 TIM2_SR = TIM2->SR;

 if(TIM2_SR == 0x0003)
 {
   i++;
 }

if( TIM2_SR & 0x0001 )
{
    TIM2->SR &= ~((u16)0x0001);
    Overflow_Counter++;
}
else if(TIM2_SR & 0x0002)
{
    TIM2->SR &= ~((u16)0x0002);

    if(flag != 1 )
    {
        
        Capture_Value1 = TIM2->CCR1;
        flag = 1;
    }
    else
    {
         Capture_Value2 = TIM2->CCR1;
        
        if(Capture_Value2 >= Capture_Value1)
        {
            Channel1_Frequency = 360000000/(Overflow_Counter * Auto_Reload_REG - (Capture_Value2 - Capture_Value1));
            Capture_Value1 = Capture_Value2;
            Overflow_Counter = 0;        
        }
        else
        {
            Channel1_Frequency = 360000000/(Overflow_Counter * Auto_Reload_REG + (Capture_Value1 - Capture_Value2));
            Capture_Value1 = Capture_Value2;
            Overflow_Counter = 0;
        }
             
    }
         
}
                      
}
此帖出自stm32/stm8论坛
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(初级)

7
 

我用软件仿真抓到的丢中断现象

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(初级)

8
 

豆腐干

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 

勘误手册中确实提到了存在丢中断问题,还是研究得不够仔

                                 打算按照,里面的说法试试看
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 

你的问题可能不是这个勘误上造成的。

TIM2_SR = TIM2->SR;
if(TIM2_SR == 0x0003){
   i++;
}

if( TIM2_SR & 0x0001 )
{
    TIM2->SR &= ~((u16)0x0001);
    Overflow_Counter++;
}
else if(TIM2_SR & 0x0002) <-----你将else去掉试一下。
{
    TIM2->SR &= ~((u16)0x0002);

此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 

我 的配置如下

                                 也许是我自己的电路问题 我在测试下
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 

10楼的办法可以尝试一下

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

13
 

确实不是勘误上说的问题,

                                 确实不是勘误上的问题,我最初的程序,就是10楼说的,没有else的。本来想采用刊物上所提供的“变通处理方法”,但是,目前还发现,出现丢中断,还不定就是丢捕获中断,还有可能丢溢出中断!溢出中断也丢的话,那该怎么整哦,目前还没招。。
此帖出自stm32/stm8论坛
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

14
 

更改后的中断程序

/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
 u16 Capture_Value1 = 0;    /*  value of the TIM2 capture */        
       u16 Capture_Value2 = 0;
static u8  flag=0;
 u16 Overflow_Counter = 0;
 u16 TIM2_SR=0;

void TIM2_IRQHandler(void)
{
     u8 i=0;
       u16 Auto_Reload_REG; 

 Auto_Reload_REG = TIM2->ARR;
 TIM2_SR = TIM2->SR;

 if(TIM2_SR == 0x0003)
 {
   i++;
 }

if((TIM2_SR & 0x0003) == (u16)0x0003)
{
    TIM2->SR &= ~((u16)0x0003);

    if(flag != 1 )
    {
        
        Capture_Value1 = TIM2->CCR1;
        flag = 1;
    }
    else
    {
         Capture_Value2 = TIM2->CCR1;
        
        if(Capture_Value2 >= Capture_Value1)
        {
            Channel1_Frequency = 360000000/((Overflow_Counter+1) * Auto_Reload_REG - (Capture_Value2 - Capture_Value1));
            Capture_Value1 = Capture_Value2;
            Overflow_Counter = 0;        
        }
        else
        {
            Channel1_Frequency = 360000000/(Overflow_Counter * Auto_Reload_REG + (Capture_Value1 - Capture_Value2));
            Capture_Value1 = Capture_Value2;
            Overflow_Counter = 1;
        }
             
    }
}

else if(TIM2_SR & 0x0002)
{
    TIM2->SR &= ~((u16)0x0002);

    if(flag != 1 )
    {
        
        Capture_Value1 = TIM2->CCR1;
        flag = 1;
    }
    else
    {
         Capture_Value2 = TIM2->CCR1;
        
        if(Capture_Value2 >= Capture_Value1)
        {
            Channel1_Frequency = 360000000/(Overflow_Counter * Auto_Reload_REG - (Capture_Value2 - Capture_Value1));
            Capture_Value1 = Capture_Value2;
            Overflow_Counter = 0;        
        }
        else
        {
            Channel1_Frequency = 360000000/(Overflow_Counter * Auto_Reload_REG + (Capture_Value1 - Capture_Value2));
            Capture_Value1 = Capture_Value2;
            Overflow_Counter = 0;
        }
             
    }
}

else if( TIM2_SR & 0x0001 )
{
    TIM2->SR &= ~((u16)0x0001);
    Overflow_Counter++;
}
                      
}
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 

丢捕获和溢出中断的仿真波形

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 

丢溢出中断的仿真波形

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

17
 

请问一下,捕获得到的数值是多少?设置的ARR是多少?

从示波器上看,捕获得到的数值应该是多少时有中断丢失? 希望能多给出几组数据。

另外,你如何配置TIM2的CC1管脚的GPIO寄存器?请尝试按照勘误表的思路,把这个管脚对应的EXTI打开,在EXTI中照样可以得到捕获的数值,这样可以确切地知道中断丢失时捕获的结果。
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

18
 

每5000个计数周期,就产生一次捕获!

利用MKD的软件调试函数产生信号,用软件仿真。一下是我的仿真函数:
signal void one_thou_hz (void) {
  while (1) {                      /* repeat forever       */
    PORTA |= 1;                    /* set PORTA bit 0      */
    twatch (10000);               /* delay for .0005 secs */
    PORTA &= ~1;                   /* clear PORTA bit 0    */
    twatch (10000);               /* delay for .0005 secs */
  }                                /* repeat               */
}

one_thou_hz()
一般在计数值为65~35时出现对中断的情况。
我的ARR是60000,采用边缘对齐,向下技术,TIMXCLK为72MHz,经2分频为36MHz作为计数时钟;TIM2的CC1管脚GPIO配置为悬浮输入(外部上拉)。附图为TIM2的相关配置。
此帖出自stm32/stm8论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

19
 

另我的mcu型号为stm32f103c6t6

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

20
 

请确认是“每5000个计数周期,就产生一次捕获”

从你给出的波形看,捕获的时刻很靠近计数器下溢,似乎应50000个计数周期产生一次捕获,你是不是少写一个0?
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
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
快速回复 返回顶部 返回列表