野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16939|回复: 5

外部中断选择重复问题

[复制链接]
发表于 2015-12-8 12:19:49 | 显示全部楼层 |阅读模式
我现在做一个东西有用到10个按键,前期在画图时没有考虑到,导致现在按键对应GPIO口在中断时有重复,key1-PB12、key2-PB13、key3-PB14、key4-PD9、key5-PD10、key6-PD11、key7-PD12、key8-PD15、key9-PC6、key10-PA8、key1和key7下面配置中断还对?

void EXTI_KEY1_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

        /* config the extiline(PC13) clock and AFIO clock */
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);
                                                                                               
        /* config the NVIC(PB12) */
        NVIC_Configuration();

        /* EXTI line gpio config(PB12) */       
        GPIO_InitStructure.GPIO_Pin = PIN_KEY10 ;                       /********KEY1********/
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(PORT_KEY10, &GPIO_InitStructure);

        /* EXTI line(PB12) mode config */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
  EXTI_InitStructure.EXTI_Line = EXTI_Line12;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

void EXTI_KEY7_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
                NVIC_Configuration();
                        /* EXTI line gpio config(PD12) */       
        GPIO_InitStructure.GPIO_Pin = PIN_KEY4 ;      
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(PORT_KEY4, &GPIO_InitStructure);

        /* EXTI line(PD12) mode config */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource12);
  EXTI_InitStructure.EXTI_Line = EXTI_Line12;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

在终端服务子程序中怎么判断?这时怎么判断是哪个按键在作用?
void EXTI15_10_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line12) != RESET) //
        {               
                LED1_TOGGLE;
                EXTI_ClearITPendingBit(EXTI_Line12);     //
        }

}

回复

使用道具 举报

发表于 2015-12-8 17:00:47 | 显示全部楼层
正是因为中断线15至10共用一个中断函数,所以才有这样的判断语句
  if(EXTI_GetITStatus(EXTI_Line12) != RESET)
把可能出现的情况一个一个判断吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-8 17:06:46 | 显示全部楼层
11kxmx 发表于 2015-12-8 17:00
正是因为中断线15至10共用一个中断函数,所以才有这样的判断语句
  if(EXTI_GetITStatus(EXTI_Line12) ! ...

但是有两个EXTI_Line12.
不是有PB12和PD12,这种情况下怎么判断?
回复 支持 反对

使用道具 举报

发表于 2015-12-9 17:04:02 | 显示全部楼层
952699805 发表于 2015-12-8 17:06
但是有两个EXTI_Line12.
不是有PB12和PD12,这种情况下怎么判断?

那就不好办了,PB12和PD12都可以映射中断12,但不能同时使能
我想是不是可以将12号中断线改为低电平触发,低电平中断来到后,除了判断是几号中断外,再判断一次是哪个管脚出现了低电平,象普通按键一样延时消抖,并等待抬起,不知能否实现.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-10 09:35:03 | 显示全部楼层
我接了一下,是无法判断的,但是我看手册上不是有[img][/img]
exti【3:0】这个可以用来表示是A还B、C等?
QQ截图20151210093308.png
回复 支持 反对

使用道具 举报

发表于 2015-12-10 10:37:24 | 显示全部楼层
952699805 发表于 2015-12-10 09:35
我接了一下,是无法判断的,但是我看手册上不是有[/img]
exti【3:0】这个可以用来表示是A还B、C等?

是的,不能同时配置, 只有反复配置了,一会儿PB12,一会儿PD12,,并作个标记,配置PB12时获得的中断是KEY1,
配置PD12时获得的中断是KEY7
但这样和查询模式或扫描模式比没发挥出中断的优势
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-11 05:20 , Processed in 0.033015 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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