OpenEdv-开源电子网

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

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

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-9 17:43:08 | 显示全部楼层 |阅读模式
本帖最后由 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)中,一直循环查询。不知道高手有没有其他好的解决办法(三个引脚不能变更改动)。希望留言,共享谢谢!

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

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-10-9
在线时间
3 小时
发表于 2018-10-10 16:35:28 | 显示全部楼层
jiangyy 发表于 2018-10-9 19:07
很多人说不可以,具体你怎么操作?标志位都是共用一根中断线

由于我没有你说的MCU的手册,在这里我给你截了一个类似的M0+内核的MCU的中断标志寄存器的说明。图中说明的问题就是每个端口都有自己的中断标志,即使它的中断处理入口相同。
Image 2.png


回复 支持 1 反对 0

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-10-9 17:50:43 | 显示全部楼层
中断服务函数里面分别判断3根脚电平就能知道是哪个了.
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-10-9
在线时间
3 小时
发表于 2018-10-9 18:20:16 | 显示全部楼层
并不是所有的中断都有独立的中断入口,很多的中断入口是共享的,这时候你需要在中断函数中去判断触发该中断的标志位,然后再做相应的处理。
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-9 19:05:35 来自手机 | 显示全部楼层
貌似不行
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-9 19:07:19 来自手机 | 显示全部楼层
哈哈哈哈2018 发表于 2018-10-9 18:20
并不是所有的中断都有独立的中断入口,很多的中断入口是共享的,这时候你需要在中断函数中去判断触发该中断 ...

很多人说不可以,具体你怎么操作?标志位都是共用一根中断线
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-9 19:08:02 来自手机 | 显示全部楼层
sammy902583 发表于 2018-10-9 17:50
中断服务函数里面分别判断3根脚电平就能知道是哪个了.

貌似不行,都是共用一根中断线。
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-9 19:08:34 来自手机 | 显示全部楼层
sammy902583 发表于 2018-10-9 17:50
中断服务函数里面分别判断3根脚电平就能知道是哪个了.

貌似不行,都是共用一根中断线。
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-9 19:09:30 来自手机 | 显示全部楼层
sammy902583 发表于 2018-10-9 17:50
中断服务函数里面分别判断3根脚电平就能知道是哪个了.

貌似不行,都是共用一根中断线。
回复 支持 反对

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
发表于 2018-10-10 08:49:17 | 显示全部楼层
如果所有的都一样的话,那就在中断里判断pin脚,用这个作区分吧
穷不可怕,可怕的是穷的是我~~~
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-10 11:25:11 | 显示全部楼层
sammy902583 发表于 2018-10-9 17:50
中断服务函数里面分别判断3根脚电平就能知道是哪个了.

不知道你试过没有?反正我之前是试过的,检测电平是不可以的。因为你把三个IO口映射到一根中断线上面,只有一个IO口挂在中断线上,其他的不起作用(也就是产生不了中断)。你试试看
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2018-10-10 11:25:44 | 显示全部楼层
烈日灼心 发表于 2018-10-10 08:49
如果所有的都一样的话,那就在中断里判断pin脚,用这个作区分吧

不知道你试过没有?反正我之前是试过的,检测电平是不可以的。因为你把三个IO口映射到一根中断线上面,只有一个IO口挂在中断线上,其他的不起作用(也就是产生不了中断)。你试试看
回复 支持 反对

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
发表于 2018-10-10 15:57:19 | 显示全部楼层
jiangyy 发表于 2018-10-10 11:25
不知道你试过没有?反正我之前是试过的,检测电平是不可以的。因为你把三个IO口映射到一根中断线上面,只 ...

检测什么电平啊,  你说公用一个外部中断函数?  函数我看看, 怎么共用
穷不可怕,可怕的是穷的是我~~~
回复 支持 反对

使用道具 举报

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2017-4-24
在线时间
44 小时
发表于 2018-10-16 17:14:15 | 显示全部楼层
一个中断函数没事啊,你干嘛检测电平啊,很多是短信号的,某一位触发你要标记下来,在中断中检测这个信号就可以了,经常这么用啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 10:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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