版主,现在遇到了个棘手的问题,关于停止和唤醒的。

天天流浪   2010-9-12 00:08 楼主
我现在要在一个中断线上同时实现中断和事件有没有可能呢?
为什么要这样呢,原因是我想让外部中断线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唤醒的时候从初始化时钟开始执行,可以实现吗?或者说这样的一个思路应该用什么方法实现?

回复评论 (9)



我又把程序改成了这样试了一下,还是不行,还是只运行到进入停止模式后就没反应了。也不会执行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;
                 }
               
        }
}
点赞  2010-9-12 00:24
在 else 前面加一个"}"
if(*********)
{
    *****;
   if(************)
      {
          *****;
      }
}
else
{
***********;
}

以我的理解..格式应当为这样.
点赞  2010-9-12 00:54
上面*号为程序内容..

仅提供格式.

此if  else语句是:当if()里面的条件不满足时,,执行else内的程序..有可能是因为你的if()里面的条件已经满足了.所以不会进去else,,而且还是一直在满足条件中.
点赞  2010-9-12 00:56
谢谢楼上耐心的回答,现在发现是外部中断根本唤醒不了,不知怎么搞的。下面的程序只运行了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);//进入停止模式
                  
                                        
        }
}
点赞  2010-9-12 09:31
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
这个进入停止模式是不是不能放在中断里呀?
为什么放在主程序是可以唤醒的呢?
点赞  2010-9-12 13:05
                                 自己顶一个~
点赞  2010-9-12 20:31
                                 自己顶一个~
点赞  2010-9-13 11:37
不确定是否能够这样用。

不管进入过程是在中断中还是在中断外,都请检查一下,系统是否进入了停止模式,是否被唤醒了,然后对比一下应该会有比较清晰的结论。可以通过测量功耗的变化,判断是否进入停止模式和是否被唤醒。
点赞  2010-9-13 12:13
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
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复