打印
[STM32F0]

STOP Mode唤醒问题

[复制链接]
3786|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP, ENABLE);           
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);               
        PWR_EnterSTOPMode(PWR_Regulator_LowPower , PWR_STOPEntry_WFI);
SystemInit();               


上面的代码是唤醒,但是好像进入低功耗后就没法唤醒了,系统就是死机了。

QQ截图20160326195430.jpg (247.63 KB )

QQ截图20160326195430.jpg
沙发
菜鸟同学|  楼主 | 2016-3-26 19:56 | 只看该作者
一直对这个很迷惑。不晓得是怎么回事,功耗暂时不提,关机是无法唤醒

使用特权

评论回复
板凳
zhuomuniao110| | 2016-3-27 11:50 | 只看该作者
板子开机  ->  按下PA1  ->  芯片进入stop模式  ->  按下PA1  ->  外部中断将芯片唤醒   。。。

程序处理如下:
void EXTI0_1_IRQHandler(void)

{
        if(EXTI_GetITStatus(EXTI_Line1)!= RESET )
        {               
            if(mcu_state == MCU_IS_RUNNING)
                         mcu_state = MCU_IS_STOP;
                else if(mcu_state == MCU_IS_STOP)
                         mcu_state = MCU_IS_RUNNING;
                b_mcu_exti_has_intterrupt = 1;
                EXTI_ClearITPendingBit(EXTI_Line1);
        }

}
然后在main里面:
void MCU_State_Change(void)
{
    if(b_mcu_exti_has_intterrupt)  
    {
        b_mcu_exti_has_intterrupt = 0;
        if(mcu_state == MCU_IS_RUNNING)
                {                  
                  
                }
                else if(mcu_state == MCU_IS_STOP)
                {                    
                    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
                        NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE);
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);                        
                        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
                }
        }
}
现在发现两个问题:
1.感觉按键不是很灵敏,有时要按几下才能进入休眠,有时休眠要按几下才能唤醒,外部中断我仿真过,每次按下按键都能进到中断里面。

2.芯片进入stop模式之后被唤醒,时钟明显感觉变慢了,我在数码管上做了TIM16计数,我后来在:
if(mcu_state == MCU_IS_RUNNING)
{
          TIM16_For_Tick_Start();                                                  /*开定时器*/
}

使用特权

评论回复
地板
zhuomuniao110| | 2016-3-27 11:51 | 只看该作者
上面是人家的,据说可以通过外部触发唤醒,他的问题是不知道为何唤醒后时钟慢了,其实不是慢了,是时钟恢复到了默认情况。
在各个中断的ISR里没有一来就给flag设置不同的值,而是先判断HSEON已经被复位了再赋值。原因就是IJK说的,进入STOP模式是,硬件会自动复位HSEON,停止掉HSE;从STOP模式唤醒后,系统使用默认的HSI作为系统时钟,直到软件去更改时钟配置。

使用特权

评论回复
5
zhuomuniao110| | 2016-3-27 11:57 | 只看该作者
stm32的低功耗,采用rtc的alarm唤醒,在唤醒之前所用的外设有uart,TIM2.当唤醒之后,首先我从新配置了时钟:代码

    ErrorStatus HSEStartUpStatus;
   
    //turn on HSE
    RCC_HSEConfig(RCC_HSE_ON);

    //Wait till HSE is ready and if Time out is reached exit
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if(HSEStartUpStatus == SUCCESS)
    {
              /* Enable Prefetch Buffer */
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

      /* Flash 2 wait state */
      FLASH_SetLatency(FLASH_Latency_2);
       
      /* HCLK = SYSCLK */
      RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
      /* PCLK2 = HCLK */
      RCC_PCLK2Config(RCC_HCLK_Div1);

      /* PCLK1 = HCLK/2 */
      RCC_PCLK1Config(RCC_HCLK_Div2);

      /* PLLCLK = 8MHz * 9 = 72 MHz */
      RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
      
//enable PLL
RCC_PLLCmd(ENABLE);
        
//Wait till PLL is ready
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {}

        //Select PLL as system clock source
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        //Wait till PLL is used as system clock source
        while(RCC_GetSYSCLKSource() != 0x08)
        {}
   }

这段代码应该没问题,以防万一,先贴出来。
之后如果去配置uart或者TIM2这些外设,使他们正常使用?

使用特权

评论回复
6
Cary_Liu| | 2016-3-27 20:48 | 只看该作者
你上面那个代码是进入stop模式吧。唤醒一般有外部中断或者rtc唤醒,唤醒后直接是从 PWR_EnterSTOPMode(PWR_Regulator_LowPower , PWR_STOPEntry_WFI);后开始执行代码的。我之前弄的stmL15x系列是这样子的。

使用特权

评论回复
7
菜鸟同学|  楼主 | 2016-3-28 09:59 | 只看该作者
Cary_Liu 发表于 2016-3-27 20:48
你上面那个代码是进入stop模式吧。唤醒一般有外部中断或者rtc唤醒,唤醒后直接是从 PWR_EnterSTOPMode(PWR_ ...

你说的都对,但是,一唤醒就死机了,不晓得跑到那里去了。

使用特权

评论回复
8
冰河w| | 2016-3-28 11:01 | 只看该作者
唤醒一般有外部中断或者rtc唤醒

使用特权

评论回复
9
Cary_Liu| | 2016-4-1 15:10 | 只看该作者
菜鸟同学 发表于 2016-3-28 09:59
你说的都对,但是,一唤醒就死机了,不晓得跑到那里去了。

以唤醒就死机,你是外部中断唤醒的吗?是否在中断里调用了进入stop模式时,更改了配置没有恢复的外设。我以前stm32L系列进入stop模式后,用外部终端唤醒,发现我在中断里调用了printf串口输出功能就死了。

使用特权

评论回复
10
hugo0chen| | 2016-8-5 18:20 | 只看该作者
功耗有490ua,不知道为什么
GPIO 进入前都设置了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

707

帖子

8

粉丝