多个外部中断公用一个中断服务函数怎么办?

2019-07-20 05:40发布

本帖最后由 jiangyy 于 2018-10-9 17:48 编辑

  今天写代码的时候,遇到一个问题。我用的是STM32F407ZGT6芯片,写代码的时候,写着写着,其中用到三个引脚:PA3,PE3,PF3,且三个引脚都用到外部中断(默认下拉输入)。因为正常使用的话,三个引脚都挂在EXTI_PinSource3(中断线3)上面。且它们共用一个外部中断服务函数。也就是三个不能同时使用。本来我设计的要求是:当外部三个高电平分别送入到三个引脚时,触发中断,在外部中断服务函数里面进行处理。但是目前只能映射一个,其他两个不能使用。我目前的做法是一个引脚映射到中断线上面(SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource3)),另外两个只配置为普通的下拉输入。其作出相应的处理代码如下:

定义输入引脚:
#define EX_RED_CTRL()           PAin(3)
#define FPGA_INIT_DONE()      PEin(3)
#define FPGA2MCU_IRQ()         PFin(3)

1.PF3中断处理函数:
void EXTI3_IRQHandler(void)
{
if (EXTI->pR & EXTI_Line3)
{
  EXTI->pR = EXTI_Line3;
  if(FPGA2MCU_IRQ())
  {
   delay_ms(3);
   if(FPGA2MCU_IRQ())
   {
    delay_ms(3);
    if(FPGA2MCU_IRQ())
    {
     delay_ms(3);
     if(FPGA2MCU_IRQ())
     {
      LED0 =!LED0;
      LED1 =!LED1;
     }
    }
   }
  }
}
}

2.PA3,PE3处理函数:
  这里我只能新建一个函数void update(void);把他们放进去,如下:
void update(void)
{
if(EX_RED_CTRL())
{
  delay_ms(3);
  if(EX_RED_CTRL())
  {
   delay_ms(3);
   if(EX_RED_CTRL())
   {
    delay_ms(3);
    if(EX_RED_CTRL())
    {
     LED0 =!LED0;
    }
   }
  }
}

if(FPGA_INIT_DONE())
{
  delay_ms(3);
  if(FPGA_INIT_DONE())
  {
   delay_ms(3);
   if(FPGA_INIT_DONE())
   {
    delay_ms(3);
    if(FPGA_INIT_DONE())
    {
     LED1 =!LED1;
    }
   }
  }
}
}

最后,我是把void update(void)函数放在主函数中的大循环while(1)中,一直循环查询。不知道高手有没有其他好的解决办法(三个引脚不能变更改动)。希望留言,共享谢谢!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
哈哈哈哈2018
1楼-- · 2019-07-20 07:14
 精彩回答 2  元偷偷看……
sammy902583
2楼-- · 2019-07-20 11:10
中断服务函数里面分别判断3根脚电平就能知道是哪个了.
哈哈哈哈2018
3楼-- · 2019-07-20 16:01
 精彩回答 2  元偷偷看……
jiangyy
4楼-- · 2019-07-20 18:37
貌似不行
jiangyy
5楼-- · 2019-07-20 21:55
哈哈哈哈2018 发表于 2018-10-9 18:20
并不是所有的中断都有独立的中断入口,很多的中断入口是共享的,这时候你需要在中断函数中去判断触发该中断 ...

很多人说不可以,具体你怎么操作?标志位都是共用一根中断线
jiangyy
6楼-- · 2019-07-21 00:06
 精彩回答 2  元偷偷看……

一周热门 更多>