OpenEdv-开源电子网

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

用STM8S外部中断的时候发现中断被自己打断了如何破

[复制链接]

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
发表于 2016-1-16 11:37:11 | 显示全部楼层 |阅读模式
5金钱
用的是PORTB外部中断,按键进入,但是中断程序还在执行的时候再按键也会进中断,这种怎么破?

最佳答案

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

进中断可以吧中断关掉中断程序执行完后再开中断啊
敢想敢为,敢做敢当。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2015-11-21
在线时间
25 小时
发表于 2016-1-16 11:37:12 | 显示全部楼层
进中断可以吧中断关掉中断程序执行完后再开中断啊
回复

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
 楼主| 发表于 2016-1-18 08:59:06 | 显示全部楼层
keyer 发表于 2016-1-16 11:37
进中断可以吧中断关掉中断程序执行完后再开中断啊

但是另外还有一个优先级更高的中断会触发,如果把总中断关了的话另一个中断不是触发不了了
敢想敢为,敢做敢当。
回复

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
 楼主| 发表于 2016-1-20 15:47:07 | 显示全部楼层
通过实验得出点结论,跟大家分享下。
STM8S外部中断只能通过一个总中断开关控制,即__disable_interrupt()和 __enable_interrupt()函数。在一个外部中断服务程序(假设为中断A服务程序)运行的时候,若是没有对总中断进行使能,则同软件优先级的中断不能打断该运行中的A中断,则需要等中断A服务程序运行完成才能再一次进入该中断;若是在运行过程中使能了中断,则该运行的中断服务程序可以被同软件优先级的中断(假设为B)打断(包括其自身),且当中断B执行完之后,会继续返回中断A服务程序接着运行。
敢想敢为,敢做敢当。
回复

使用道具 举报

7

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-14
在线时间
98 小时
 楼主| 发表于 2016-1-20 15:47:54 | 显示全部楼层
例如将PB4和PB5作为中断源的PORTB中断,设为下降沿触发:
__interrupt void EXTI_PORTB_IRQHandler(void)
{
     delay(20);
     if((GPIO_ReadInputPin(GPIOB,GPIO_PIN_5)==0)||(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0))
          {
                if((GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0))
                   {
                      __enable_interrupt();
                      while(Bool_para)
                       {
                         /*程序C*/
                       }
                   }  

                if((GPIO_ReadInputPin(GPIOB,GPIO_PIN_5)==0))
                   {
                         /*程序D*/
                   }
          }

}
此例中,若是某一时刻由PB4触发中断,则如果Bool_para为真,程序会一直停留在程序C的位置,但因为此时已经使能了总中断,此时若PB5触发中断将会执行程序D,且执行完此次中断之后将返回程序C继续运行。

敢想敢为,敢做敢当。
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2016-2-3 09:00:10 | 显示全部楼层
onebank 发表于 2016-1-18 08:59
但是另外还有一个优先级更高的中断会触发,如果把总中断关了的话另一个中断不是触发不了了

关闭总中断后,如果这时有新的中断到来,不会产生中断,但会挂起中断标志。等你再次开启总中断后,还是会响应的。另外的,不要在中断中处理太多,建议抛个事件到main中处理即可。尽量避免嵌套中断!
功夫再高、也怕羊刀
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-9-30 06:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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