搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2013-4-12 18:09:42 | 显示全部楼层 |阅读模式
小弟遇到一个关于中断的难题,由于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线路挂起位
}




                            

出0入0汤圆

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

出0入0汤圆

发表于 2015-1-17 11:15:43 | 显示全部楼层
楼主的做法可以实现PA12和PB12分时相应中断了么
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 17:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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