5990|9

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

版主,现在遇到了个棘手的问题,关于停止和唤醒的。 [复制链接]

我现在要在一个中断线上同时实现中断和事件有没有可能呢?
为什么要这样呢,原因是我想让外部中断线EXTI5的中断来让MCU进入停止模式
也要让外部中断线EXTI5的中断来让MCU从停止模式唤醒,怎么实现呢?
于是我想,事件不是可以不执行外部中断服务程序嘛,但是这样就矛盾了,我到底设事件呢还是中断呢?
程序如下:
void EXTI9_5_IRQHandler (void)
{
   if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
           LcdDisZimo0808(4,64,'4',0);
           LcdDisZimo0808(5,64,'5',0);
           LcdDisZimo0808(6,64,'6',0);
           LcdDisZimo0808(7,64,'7',0);
           LcdRefreshAll();
           Delay(10000);
           PWR_EnterSTOPMode (PWR_Regulator_LowPower,   PWR_STOPEntry_WFI);//进入停止模式
           RCC_Configuration();      //初始化时钟

           LcdDisZimo0808(4,64,'9',0);
          LcdDisZimo0808(5,64,'9',0);
          LcdDisZimo0808(6,64,'9',0);
          LcdDisZimo0808(7,64,'9',0);
          LcdRefreshAll();
          Delay(10000);
    /* Clear the Key Button EXTI line pending bit */     
    EXTI_ClearITPendingBit(EXTI_Line5);
}
}

这样的程序就进入了死循环当中一有外部中断就休眠,根本就出不来了。
我想让MCU唤醒的时候从初始化时钟开始执行,可以实现吗?或者说这样的一个思路应该用什么方法实现?
此帖出自stm32/stm8论坛

最新回复

                                 lz在EXTI中断里进入停止模式,并希望使用使用同一个EXTI中断唤醒是不可行的 因为MCU在进入停止模式前仍然在EXTI中断里,中断优先级相同不能打断自己,所以也不能唤醒MCU,lz可以尝试在进入停止模式前调高中断的优先级,可不可行我还没有测试过。 我建议楼主采用下面的方法: 看手册这段 Two options are available to select the Sleep mode entry mechanism, depending on the SLEEPONEXIT bit in the Cortex-M3 System Control register: ● Sleep-now: if the SLEEPONEXIT bit is cleared, the MCU enters Sleep mode as soon as WFI or WFE instruction is executed. ● Sleep-on-exit: if the SLEEPONEXIT bit is set, the MCU enters Sleep mode as soon as it exits the lowest priority ISR. 把SLEEPONEXIT位在中断里置1,那么MCU在退出中断的时候就会自动进入睡眠模式,如果希望唤醒MCU,那么在中断里把这位清0就可以了。  详情 回复 发表于 2010-9-14 11:58
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 


我又把程序改成了这样试了一下,还是不行,还是只运行到进入停止模式后就没反应了。也不会执行else里面的程序。不知为什么?
unsigned char PDI_FLAG=0;        
这是变量的定义

  void EXTI9_5_IRQHandler (void)
{
   if(EXTI_GetITStatus(EXTI_Line5) != RESET)
        {
            /* Clear the Key Button EXTI line pending bit */     
                EXTI_ClearITPendingBit(EXTI_Line5);
            if(PDI_FLAG==0)
                 {
                   LcdDisZimo0808(4,64,'4',0);
                   LcdDisZimo0808(5,64,'5',0);
                   LcdDisZimo0808(6,64,'6',0);
                   LcdDisZimo0808(7,64,'7',0);
                   LcdRefreshAll();
                   Delay(10000);

                   PDI_FLAG=1;
                   PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
                  //LcdCommand(0xAE); //关显示
                 }
                else
                 {
                  RCC_Configuration();                                  //初始化时钟
                  LcdDisZimo0808(4,64,'9',0);
                  LcdDisZimo0808(5,64,'9',0);
                  LcdDisZimo0808(6,64,'9',0);
                  LcdDisZimo0808(7,64,'9',0);
                  LcdRefreshAll();
                  Delay(10000);

                  
                  
                  //LcdCommand(0xAF); //开显示
                  PDI_FLAG=0;
                 }
               
        }
}
此帖出自stm32/stm8论坛
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在 else 前面加一个"}"
if(*********)
{
    *****;
   if(************)
      {
          *****;
      }
}
else
{
***********;
}

以我的理解..格式应当为这样.
此帖出自stm32/stm8论坛
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
上面*号为程序内容..

仅提供格式.

此if  else语句是:当if()里面的条件不满足时,,执行else内的程序..有可能是因为你的if()里面的条件已经满足了.所以不会进去else,,而且还是一直在满足条件中.
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢楼上耐心的回答,现在发现是外部中断根本唤醒不了,不知怎么搞的。下面的程序只运行了case 0:
再按外部中断的按键就没反应了,郁闷。
  void EXTI9_5_IRQHandler (void)
{
   if(EXTI_GetITStatus(EXTI_Line5) != RESET)
        {
            /* Clear the Key Button EXTI line pending bit */     
                EXTI_ClearITPendingBit(EXTI_Line5);

                   switch(PDI_FLAG)
                   {
                      case 0: LcdDisZimo0808(4,64,'4',0);
                                 break;
              case 1: LcdDisZimo0808(5,64,'5',0);
                                 break;
              case 2: LcdDisZimo0808(6,64,'6',0);
                                 break;
              case 3: LcdDisZimo0808(7,64,'7',0);
                                 break;
                   }
           LcdRefreshAll();
           Delay(10000);
                   PDI_FLAG++;
                   //PDI_FLAG=1;
                   PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
                  
                                        
        }
}
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
这个进入停止模式是不是不能放在中断里呀?
为什么放在主程序是可以唤醒的呢?
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 自己顶一个~
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 自己顶一个~
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
不确定是否能够这样用。

不管进入过程是在中断中还是在中断外,都请检查一下,系统是否进入了停止模式,是否被唤醒了,然后对比一下应该会有比较清晰的结论。可以通过测量功耗的变化,判断是否进入停止模式和是否被唤醒。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
lz在EXTI中断里进入停止模式,并希望使用使用同一个EXTI中断唤醒是不可行的
因为MCU在进入停止模式前仍然在EXTI中断里,中断优先级相同不能打断自己,所以也不能唤醒MCU,lz可以尝试在进入停止模式前调高中断的优先级,可不可行我还没有测试过。

我建议楼主采用下面的方法:
看手册这段
Two options are available to select the Sleep mode entry mechanism,
depending on the SLEEPONEXIT bit in the Cortex-M3 System Control register:
● Sleep-now: if the SLEEPONEXIT bit is cleared, the MCU enters Sleep mode as soon
as WFI or WFE instruction is executed.
● Sleep-on-exit: if the SLEEPONEXIT bit is set, the MCU enters Sleep mode as soon as
it exits the lowest priority ISR.

把SLEEPONEXIT位在中断里置1,那么MCU在退出中断的时候就会自动进入睡眠模式,如果希望唤醒MCU,那么在中断里把这位清0就可以了。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表