OpenEdv-开源电子网

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

多个外部中断的处理出现问题

[复制链接]

12

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2012-2-17
在线时间
41 小时
发表于 2012-2-24 16:53:06 | 显示全部楼层 |阅读模式
定义了三个外部中断口。PA3,PA7和PA4。但是PA4和PA7的下降沿触发进入中断服务程序时,发现有影响,PA7中断后随即PA3也发生了中断,PA4中断也会发生PA3的中断。。。。配置情况:
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
。。。。。。。。。。。。。。。。。。。。
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
  EXTI_InitStructure.EXTI_Line = EXTI_Line3;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
  EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
。。。。。。。。。。。。。。。。。。。        IO口定义
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。中断服务程序
void EXTI3_IRQHandler(void)
{
  int i;
  
  if(EXTI_GetITStatus(EXTI_Line3) != RESET)
  {
    printf("\nThe left pull down\r\n");
    /* Clear the EXTI line 3 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line3);
  }
  for(i=0;i<1000;i++);  

}


void EXTI4_IRQHandler(void)
{
  int i;
  
  if(EXTI_GetITStatus(EXTI_Line4) != RESET)
  {
    printf("\nThe center pull down\r\n");
    /* Clear the EXTI line 3 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line4);
  }
  for(i=0;i<1000;i++);
}

。。。。。。。。。。。。。。。。。。。。。。。。。串口打印如下:  right后出现了left两个事件。(没有消抖动)




(由于太难描述了。PA7口略),,,求教





。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-2-24 19:24:46 | 显示全部楼层
把你中断里面的for丢掉.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2012-2-17
在线时间
41 小时
 楼主| 发表于 2012-2-24 22:30:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
可以了,,但是现在还有个问题,就是,消不了抖动   
          while(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)==0)
{
i++;
i--;
} 晕。这样的话,就停机了,
。。。。。。。。。。。。。。。。。。。。。。。
void EXTI15_10_IRQHandler(void)//中断PB11,按键下降沿触发
{
   int i;
  if(EXTI_GetITStatus(EXTI_Line11) != RESET)
  {  
    printf("\nThe left pull down\r\n");
    /* Clear the EXTI line 3 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line11);
  }
   while(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)==0)
{
i++;
i--;
}
}
、、论坛找不到类似用固件库消抖的。。。。。
。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-2-25 01:12:20 | 显示全部楼层
回复【3楼】wwwzfgcom:
---------------------------------
参考寄存器版本的吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-9-24 13:37:24 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
蒜蓉是个老帖子,但是我也遇到这样的问题,就挖坟了。开发板寄存器版本解决办法是中断里面延时10ms消抖,这肯定不行,中断时间太长了,程序在ucos上面跑的,我外部用了三个按键中断,发现按下一个按键应该触发一个中断,但是有时候会触发三个外部中断。
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-9-24 13:37:45 | 显示全部楼层
这算是个老帖子,但是我也遇到这样的问题,就挖坟了。开发板寄存器版本解决办法是中断里面延时10ms消抖,这肯定不行,中断时间太长了,程序在ucos上面跑的,我外部用了三个按键中断,发现按下一个按键应该触发一个中断,但是有时候会触发三个外部中断。
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-25 00:07:37 | 显示全部楼层
回复【6楼】cornrn:
---------------------------------
有了ucosii,你可以直接用一个任务扫描按键。
如果一定要用中断,那确实就存在抖动的可能,得想其它办法,比较麻烦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-9-26 15:31:13 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
不打算一直扫描按键,因为我几个任务都尽量DMA传输的,这按键扫描不想开个任务给单片机隔断时间扫描一下。我想中断触发了再扫描发消息给系统。办法解决了,利用中断和系统 tick counter OSTime数变化来消抖
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-9-26 15:31:45 | 显示全部楼层
回复【8楼】cornrn:
---------------------------------
thanks,atom
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 00:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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