ARM2012 发表于 2013-4-12 18:09:42

STM32外部中断使用同一中断线的疑问

小弟遇到一个关于中断的难题,由于PA12和PB12都需要产生中断,但是STM32不能同时使用同一中断线,后来在网上搜到可以在进入服务函数的时候
检查单个管脚的电平高低,如果中断设置成下降沿触发的话,检查管脚是否低电平就可以判断是哪个引脚产生的中断。但尝试过不成功,烧写进去后,
刚上电,程序就直接进入了IRQINT1(在主函数处理IRQINT1),而按键时PB12能产生中断,按另一个键时PA12无反应。不知道,是不是配置错了。请
高手们帮忙看看!

          GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

//=========PA12
               
        GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
               
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,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);
               
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                //使能按键所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //抢占优先级1,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);
               
               
                //==========PB12====
               
        GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
               
        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);

        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                //使能按键所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //抢占优先级1,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);


//中断服务函数

void EXTI15_10_IRQHandler(void)
{
        delay_ms(10);    //消抖                       

    if(EXTI_GetITStatus(EXTI_Line12) != RESET)
        {

               
                if(PAin(12) == 0)
                {
                                IRQINT2 = 1;
                }
                if(PBin(12) == 0)
                {
                                IRQINT1 = 1;
                }
               
        }
       
       EXTI_ClearITPendingBit(EXTI_Line12);//清除EXTI12线路挂起位
}




                            

tiancaigao7 发表于 2013-4-12 21:21:46

PA12和PB12只能有一个连接到外部中断上。你刚才说的那种方式针对的是公用中断入口的中断服务。你要想实现这个,可以将这两个信号进行逻辑异或运算,然后接到一个IO口上,当发生电平变化的时候,通过另外一个IO口去读取其中一个电平,进而判断中断信号。

TongIC 发表于 2015-1-17 11:15:43

楼主的做法可以实现PA12和PB12分时相应中断了么
页: [1]
查看完整版本: STM32外部中断使用同一中断线的疑问