打印

我用定时器的扑获方式我发现 他老是丢中断

[复制链接]
4388|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yjf1979yjf|  楼主 | 2009-2-26 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现有时候扑获来的数据少一半  请问管脚是不是要配成 FLOATING
沙发
a7_cool| | 2009-2-26 17:43 | 只看该作者

我遇到同样的问题

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

使用特权

评论回复
板凳
yjf1979yjf|  楼主 | 2009-2-26 17:46 | 只看该作者

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

我发现的是益处中断丢了一半 叫人超级郁闷 到底是怎么回师   

使用特权

评论回复
地板
yjf1979yjf|  楼主 | 2009-2-26 17:46 | 只看该作者

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

使用特权

评论回复
5
a7_cool| | 2009-2-26 17:58 | 只看该作者

是比较郁闷

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

使用特权

评论回复
6
a7_cool| | 2009-2-26 18:00 | 只看该作者

我的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;
        }
             
    }
         
}
                      
}

使用特权

评论回复
7
a7_cool| | 2009-2-26 18:05 | 只看该作者

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

使用特权

评论回复
8
yjf1979yjf|  楼主 | 2009-2-26 18:15 | 只看该作者

豆腐干

使用特权

评论回复
9
a7_cool| | 2009-2-27 10:17 | 只看该作者

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

打算按照,里面的说法试试看

使用特权

评论回复
10
ST_ARM| | 2009-2-27 10:28 | 只看该作者

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

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);

使用特权

评论回复
11
yjf1979yjf|  楼主 | 2009-2-27 10:39 | 只看该作者

我 的配置如下

也许是我自己的电路问题 我在测试下

使用特权

评论回复
12
香水城| | 2009-2-27 11:06 | 只看该作者

10楼的办法可以尝试一下

使用特权

评论回复
13
a7_cool| | 2009-2-27 12:07 | 只看该作者

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

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

使用特权

评论回复
14
a7_cool| | 2009-2-27 12:07 | 只看该作者

更改后的中断程序

/*******************************************************************************
* 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++;
}
                      
}

使用特权

评论回复
15
a7_cool| | 2009-2-27 12:13 | 只看该作者

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

使用特权

评论回复
16
a7_cool| | 2009-2-27 12:15 | 只看该作者

丢溢出中断的仿真波形

使用特权

评论回复
17
香水城| | 2009-2-27 12:18 | 只看该作者

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

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

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

使用特权

评论回复
18
a7_cool| | 2009-2-27 12:40 | 只看该作者

每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的相关配置。

使用特权

评论回复
19
a7_cool| | 2009-2-27 12:47 | 只看该作者

另我的mcu型号为stm32f103c6t6

使用特权

评论回复
20
香水城| | 2009-2-27 12:49 | 只看该作者

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

103

帖子

0

粉丝