打印

外部中断, 上升沿实际上是边沿触发????

[复制链接]
3033|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ysu533|  楼主 | 2014-10-2 18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代理商给了5块GD32F103RC芯片让测试用, 我也是想评估下, 能替换ST的就替换了, 结果为了调试个外部中断, 让费了我一整天的国庆假日. PB1 外部中断, 我设置的上升沿触发, 结果触发次数数总是双倍.
折腾了1整天, 刚才搜索到这个贴:
https://bbs.21ic.com/forum.php?mod=viewthread&tid=622199
有人碰到一样的问题, 但是帖子没有回应, 最后也没结果, 有人说可能是抖动. 我已经排除了.

我说已经的排除的理由有以下几个:
1. 设置成上升沿触发, 然后每次触发读回系统滴答的计数器数值, 计算偶数次触发与奇数次触发的时间间隔, 发现间隔正好是脉宽宽度(正也初步印证了是边沿触发);
2: 设置成上升沿下降沿都触发, 发现结果和上升沿触发是一样的, 如果是抖动的话, 触发次数应该大于单边沿触发吧.

触发源是ID卡读头, 韦根26输出. 同样程序STM32没有问题.

希望厂家, 版主, 还有碰到同样问题的坛友帮忙解惑一下. 另外上面帖子里面说有的引脚就没这问题, 这是真的吗?
沙发
denvice| | 2014-10-3 12:53 | 只看该作者
你是用固件库操作的还是寄存器操作的?你在清除中断标志位后插入点延时看看。

使用特权

评论回复
板凳
ysu533|  楼主 | 2014-10-3 13:34 | 只看该作者
denvice 发表于 2014-10-3 12:53
你是用固件库操作的还是寄存器操作的?你在清除中断标志位后插入点延时看看。 ...

我都是固件库和寄存器混合的, 我跟踪了, 寄存器设置是对的. 我不知道你说的延时目的是什么?

请参考我上面说的, 设置成上升沿触发和边沿(上下)效果是一样的, 都是26个数据触发52次, 另外同样的程序用STM32的芯片验证过了, STM32 没有问题.

目前我的解决办法就是把他当成边沿触发用, 不过心里总是不太爽, 本来只需要进26次中断了, 结果进了52次. 我真希望是我自己的问题. 如果是芯片的问题, 那真是不爽啊, 带着可能是芯片本身的问题的心态调程序, 那得多累啊

使用特权

评论回复
地板
denvice| | 2014-10-5 10:03 | 只看该作者
GD的指令执行起来会比ST的要快,经常有人遇到速度的问题,所以我怀疑是你清除中断标志位的写法配合GD的芯片有问题,所以你在清除中断标志位后插入几个NOP,或者是已进入中断就清除中断标志位,然后进行你的中断处理程序,然后再退出。

使用特权

评论回复
5
ysu533|  楼主 | 2014-10-5 11:19 | 只看该作者
denvice 发表于 2014-10-5 10:03
GD的指令执行起来会比ST的要快,经常有人遇到速度的问题,所以我怀疑是你清除中断标志位的写法配合GD的芯片 ...

还是不明白, 这个快慢有什么关系? 即使出现你说的, 也不会出现中断加倍的可能啊. 我就是一进入就清除中断标志的. 中断代码如下
void EXTI0_IRQHandler(void)
{
  EXTI_ClearITPendingBit(WG2_EXITLINE);
  if (WG2_TRI_IS_RISING()) {
                if(WG2_finish == 0) {
                        WG2_time_cnt = WG_TIMEOUT;
                        WG2_cnt ++;
                        WG2_data = WG2_data << 1;
                        if(WG2_IS_DATA1()) {
                                WG2_data |= (u32)1;
                        }
                }
  }       
}

中断里面代码非常简单, 除了检测引脚状态, 就是赋值.
最外面一层的if本来是没有必要的, 为了修补这个问题加上的.

使用特权

评论回复
6
ysu533|  楼主 | 2014-10-8 12:45 | 只看该作者
上班了还没有人回应,自己顶

使用特权

评论回复
7
GONGO| | 2014-10-9 16:00 | 只看该作者
这不可能
决不可能
怎么可能呢

建议你先用一个最基本的程序测试一下,
下面的程序供参考:
测试时,把 PB0 连接到 PB1 ,用 PB0 产生脉冲,触发中断。

void EXTI1_IRQHandler(void)
{
  if( EXTI_GetITStatus( EXTI_Line1 ) != RESET )
  {
    /* Clear the  EXTI line 1 pending bit */
    EXTI_ClearITPendingBit( EXTI_Line1 );
   
    EXTI1_Have_Done = 1 ;
  }
}

/**
  * @brief   Main program
  * @param  None
  * @retval None
  */
int main(void)
{
    int i = 0 ;   

        /* Enable GPIO clock */
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB  |
                                                        RCC_APB2Periph_AFIO  , ENABLE);  

        {
        /* Configure the GPIO ports */
        GPIO_InitTypeDef GPIO_InitStructure;
        
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_0  ;
        GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_Out_PP ;
        GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
        GPIO_Init( GPIOB, &GPIO_InitStructure );

        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_1 ;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IN_FLOATING;
        GPIO_Init( GPIOB, &GPIO_InitStructure );

        GPIO_ResetBits( GPIOB , GPIO_Pin_0 ) ;

        }

    {
        NVIC_InitTypeDef   NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel                          = EXTI1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority              = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

    }


    {
        EXTI_InitTypeDef   EXTI_InitStructure;

        /* Connect EXTI1 Line to PB.01 pin */
        GPIO_EXTILineConfig( GPIO_PortSourceGPIOB , GPIO_PinSource1 );

        /* Configure EXTI1 line */
        EXTI_InitStructure.EXTI_Line                 = EXTI_Line1;
        EXTI_InitStructure.EXTI_Mode                 = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger         = EXTI_Trigger_Rising;  
        EXTI_InitStructure.EXTI_LineCmd         = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
    }


  while( 1 )
  {
   
    GPIO_SetBits( GPIOB , GPIO_Pin_0 ) ;

    {
        for( i = 0 ; i < 200 ; i++ );
   
        if( EXTI1_Have_Done == 0 )
        {
           // set a breakpoint
           EXTI1_Have_Done = 2 ;
        }        
   
        EXTI1_Have_Done = 0 ;
    }        




    EXTI1_Have_Done = 0 ;




    GPIO_ResetBits( GPIOB , GPIO_Pin_0 ) ;

    {
        for( i = 0 ; i < 200 ; i++ );
   
        if( EXTI1_Have_Done == 1 )
        {
           // set a breakpoint
           EXTI1_Have_Done = 2 ;
        }        
    }        

  }       


  while (1)
  {
  }

}




使用特权

评论回复
8
andy_yao| | 2014-10-15 15:02 | 只看该作者
ysu533 发表于 2014-10-5 11:19
还是不明白, 这个快慢有什么关系? 即使出现你说的, 也不会出现中断加倍的可能啊. 我就是一进入就清除中断 ...

请在进入中断后增加判定中断是否产的语名,再清标志位试试。
if(EXTI_GetITStatus(WG2_EXITLINE) != RESET)       

使用特权

评论回复
9
omlarn| | 2016-6-26 22:01 | 只看该作者
这个问题我今天也碰到了,用的GD32F103VC 设置的PC11为下降沿中断,老是莫名其妙的多进中断,用示波器看看,也就是一个低脉冲,不过脉冲底部有稍微的波动,但是波动的最大值不到0.4V,也就是说低脉冲的底部整个按逻辑电平来说还是低电平。不知道什么问题,求解。。。

使用特权

评论回复
10
182317716| | 2016-6-27 08:52 | 只看该作者
GD代理商QQ:182317716 更多样品,中文手册.开发工具支持!
---13686827076-王生

使用特权

评论回复
11
ah9b87| | 2016-6-27 17:18 | 只看该作者
就是边沿触发啊

使用特权

评论回复
12
vibra2016| | 2016-6-27 21:51 | 只看该作者
边沿触发跟上升沿触发有区别的么?

使用特权

评论回复
13
波越| | 2016-6-28 07:27 | 只看该作者
本来就是边沿触发的

使用特权

评论回复
14
comeon201208| | 2016-6-28 21:41 | 只看该作者
边沿触发跟上升沿触发的有区别的么?这个区别大的吧

使用特权

评论回复
15
历史暴君| | 2016-6-29 07:05 | 只看该作者
就是边沿啊

使用特权

评论回复
16
飞翔的控制器| | 2016-6-29 07:17 | 只看该作者
现在用电平触发的比较少了

使用特权

评论回复
17
vivilzb1985| | 2016-6-29 21:40 | 只看该作者
这个一般还是设计成的边沿触发的比较好的。

使用特权

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

本版积分规则

2

主题

15

帖子

1

粉丝