OpenEdv-开源电子网

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

中断5-9里面有多个中断怎么判断呢

[复制链接]

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
发表于 2017-2-27 14:01:55 | 显示全部楼层 |阅读模式
1金钱
void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)                //判断中断6是否发生
        {①}
        if(EXTI_GetITStatus(EXTI_Line8)!=RESET)                //判断中断8是否发生
        {②}
}
这样子能分辨中断5-9里面具体是6还是8中断吗,中断6触发会运行②吗,实验现象好像相互影响了

最佳答案

查看完整内容[请看2#楼]

终于弄好了 在中断初始化里面加了一句EXTI->PR = 0;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-27 14:01:56 | 显示全部楼层
沧海 发表于 2017-2-28 13:12
EXTI_GetFlagStatus这个函数

终于弄好了
在中断初始化里面加了一句EXTI->PR = 0;
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7716
金钱
7716
注册时间
2016-11-30
在线时间
652 小时
发表于 2017-2-27 16:08:03 | 显示全部楼层
就是这样子处理,但是记得判断完之后要清除相应的标志位!
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-27 16:25:32 | 显示全部楼层
lvkanger 发表于 2017-2-27 16:08
就是这样子处理,但是记得判断完之后要清除相应的标志位!

但我这样写,测试的时候6中断了,运行完6的中断函数,好像也运行了8的中断函数
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7716
金钱
7716
注册时间
2016-11-30
在线时间
652 小时
发表于 2017-2-27 17:05:41 | 显示全部楼层
我是路人甲 发表于 2017-2-27 16:25
但我这样写,测试的时候6中断了,运行完6的中断函数,好像也运行了8的中断函数

所以有可能是中断标志在置位啊,你清除一下标志,看看还会不会进。
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7716
金钱
7716
注册时间
2016-11-30
在线时间
652 小时
发表于 2017-2-27 17:05:51 | 显示全部楼层
我是路人甲 发表于 2017-2-27 16:25
但我这样写,测试的时候6中断了,运行完6的中断函数,好像也运行了8的中断函数

所以有可能是中断标志在置位啊,你清除一下标志,看看还会不会进。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165558
金钱
165558
注册时间
2010-12-1
在线时间
2118 小时
发表于 2017-2-27 22:09:38 | 显示全部楼层
这样应该是可以的。你在初始化中断的时候,清除所有的标记,再使能试试
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 08:43:21 | 显示全部楼层
lvkanger 发表于 2017-2-27 17:05
所以有可能是中断标志在置位啊,你清除一下标志,看看还会不会进。

我这里是手打的代码,所以省略了清除中断标志,实际上是写了的
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 08:43:44 | 显示全部楼层
正点原子 发表于 2017-2-27 22:09
这样应该是可以的。你在初始化中断的时候,清除所有的标记,再使能试试

谢谢, 我再试试
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 09:27:22 | 显示全部楼层
正点原子 发表于 2017-2-27 22:09
这样应该是可以的。你在初始化中断的时候,清除所有的标记,再使能试试

再请问下,需要清除哪些标记呢
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-2-28 11:38:36 | 显示全部楼层
这个是不会影响的,但你得清除掉相应的标志位。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 11:49:55 | 显示全部楼层
本帖最后由 我是路人甲 于 2017-2-28 11:51 编辑
沧海 发表于 2017-2-28 11:38
这个是不会影响的,但你得清除掉相应的标志位。


void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)                //判断中断6是否发生
        {①        EXTI_ClearITPendingBit(EXTI_Line6);            //清除中断标志位
        }
        if(EXTI_GetITStatus(EXTI_Line8)!=RESET)                //判断中断8是否发生
        {②
          EXTI_ClearITPendingBit(EXTI_Line8);            //清除中断标志位
        }
}
实际是这样的,去测试就是相互影响了,如果屏蔽1个中断就正常
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-2-28 13:10:00 | 显示全部楼层
我是路人甲 发表于 2017-2-28 11:49
void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)                ...

不是吧。你把程序发来看看
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-2-28 13:12:39 | 显示全部楼层
我是路人甲 发表于 2017-2-28 11:49
void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)                ...

EXTI_GetFlagStatus这个函数
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 13:29:10 | 显示全部楼层
沧海 发表于 2017-2-28 13:12
EXTI_GetFlagStatus这个函数

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
{
  ITStatus bitstatus = RESET;
  uint32_t enablestatus = 0;
  /* Check the parameters */
  assert_param(IS_GET_EXTI_LINE(EXTI_Line));
  
  enablestatus =  EXTI->IMR & EXTI_Line;
  if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET))
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}
EXTI_GetFlagStatus这个函数是??我好想没有用这个吧
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 13:29:56 | 显示全部楼层
沧海 发表于 2017-2-28 13:12
EXTI_GetFlagStatus这个函数

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_GET_EXTI_LINE(EXTI_Line));
  
  if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
 楼主| 发表于 2017-2-28 15:40:46 | 显示全部楼层
我是路人甲 发表于 2017-2-28 14:13
终于弄好了
在中断初始化里面加了一句EXTI->PR = 0;

反复测试终于找到问题了,一开始程序就是对的。有两块板,一块能行,另一块老混乱,估计PCB线或者焊接混起了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165558
金钱
165558
注册时间
2010-12-1
在线时间
2118 小时
发表于 2017-2-28 21:18:16 | 显示全部楼层
我是路人甲 发表于 2017-2-28 09:27
再请问下,需要清除哪些标记呢

所有标志,你直接对PR赋值为0,试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-23 19:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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