stm32在进入standby状态如何唤醒,求个简单参考代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32在进入standby状态如何唤醒,求个简单参考代码相关的知识,希望对你有一定的参考价值。

我想用WKUP按键唤醒。目前进入standby了,进入前也配置了唤醒管脚,不知道为什么按下无反应,小白求助。另:唤醒后程序是从头开始运行,还是从暂停处继续执行?

参考技术A STM32
的低功耗模式有
3种:

1)睡眠模式(CM3内核停止,外设仍然运行)

2)停止模式(所有时钟都停止)

3)待机(standby)模式(1.8V内核电源关闭)
从待机模式唤醒后的代码执行等同于复位后的执行
进入Standby模式后,只能有Wake-up脚和RTC唤醒,特别是唤醒后,程序将从最开始运行,也就是相当于软件复位。

我这里有一个我以前写的参考代码

void PWR_EnterSTANDBYMode(void)

/* Clear Wake-up flag */
PWR->CR |= CR_CWUF_Set;

/* Select STANDBY mode */
PWR->CR |= CR_PDDS_Set;

/* Set SLEEPDEEP bit of Cortex System Control Register */
*(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;

/* Request Wait For Interrupt */
__WFI();

/*******************************************************************************
* Function Name : PWR_WakeUpPinCmd
* Description : Enables or disables the WakeUp Pin functionality.
* Input : - NewState: new state of the WakeUp Pin functionality.
* This parameter can be: ENABLE or DISABLE.
* Output : None
* Return : None
*******************************************************************************/
void PWR_WakeUpPinCmd(FunctionalState NewState)

/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));

*(vu32 *) CSR_EWUP_BB = (u32)NewState;

/*******************************************************************************
* Function Name : LowPower_Init
* Description : Initializes Low Power application.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void LowPower_Init(void)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

/* Enable WakeUp pin */
PWR_WakeUpPinCmd(ENABLE);

/* Enable Clock Security System(CSS) */
RCC_ClockSecuritySystemCmd(ENABLE);


PS,进入satandby之前要关闭看门狗,否则看门狗的复位,会导致MCU提前醒来

如果设备已被唤醒或进入睡眠状态,如何检查应用程序

【中文标题】如果设备已被唤醒或进入睡眠状态,如何检查应用程序【英文标题】:How to check in application if the device has been awoken or went to sleep 【发布时间】:2014-09-28 23:00:38 【问题描述】:

在我的 Android 应用中,我想在设备唤醒时收到通知 以及设备何时进入睡眠状态。 基于此,我必须执行一些操作。 请帮忙。

请注意

SCREEN_ON / OFF 不同。屏幕可能已关闭,但设备可能 在接到电话的情况下仍处于唤醒状态。什么时候我们 将手机靠近我们的耳朵接近传感器会关闭屏幕, 但设备不会进入睡眠状态。

【问题讨论】:

***.com/questions/5007721/… @Ankit 有什么适合你的解决方案吗? 【参考方案1】:

您可以捕获内置的 IntentFilter。

Intent.ACTION_SCREEN_ON
Intent.ACTION_SCREEN_OFF

使用服务和广播接收器组合,您可以实现您所寻找的。​​p>

你会发现完整的演示HERE

更新:

你可以使用PowerManager类的一些方法。

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);

if(pm.isScreenOn())
   // not sleep
else
  // sleep

API 级别 >=20

if(pm.isInteractive())
   // not sleep
else
  // sleep

解释:

public boolean isScreenOn ()

在 API 级别 7 中添加 此方法在 API 级别 20 中已弃用。 请改用isInteractive()

如果设备处于交互状态,则返回 true。

由于历史原因,此方法的名称是指屏幕的电源状态,但它实际上描述了设备的整体交互状态。此方法已替换为isInteractive()

此方法返回的值仅表示设备是否处于交互状态,可能与屏幕开启或关闭无关。要确定屏幕的实际状态,请使用getState()

返回 True 如果设备处于交互状态。

参考HERE

【讨论】:

SCREEN_ON / OFF 不同。屏幕可能已关闭,但设备可能仍处于唤醒状态,以防接到电话。当我们将手机靠在耳边时,接近传感器会关闭屏幕,但设备不会进入睡眠状态。【参考方案2】:

http://androidexample.com/Screen_Wake_Sleep_Event_Listner_Service_-_Android_Example/index.php?view=article_discription&aid=91&aaid=115

我认为这个链接解决了你的问题

  import android.content.Context;
  import android.content.Intent;

公共类 AEScreenOnOffReceiver 扩展 BroadcastReceiver

    private boolean screenOff;

    @Override
    public void onReceive(Context context, Intent intent) 

        //Toast.makeText(context, "BroadcastReceiver", Toast.LENGTH_SHORT).show();


        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 

            screenOff = true;

         else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 

            screenOff = false;

        

        // Toast.makeText(context, "BroadcastReceiver :"+screenOff, Toast.LENGTH_SHORT).show();

        // Send Current screen ON/OFF value to service
        Intent i = new Intent(context, AEScreenOnOffService.class);
        i.putExtra("screen_state", screenOff);
        context.startService(i);
    


【讨论】:

以上是关于stm32在进入standby状态如何唤醒,求个简单参考代码的主要内容,如果未能解决你的问题,请参考以下文章

1.Linux电源管理-休眠与唤醒

STM32L051低功耗STOP模式串口中断唤醒

STM32F030低功耗

低功耗板子测试功耗的方法

STM32Cube STM32L053闹钟唤醒LL库和HAL库

STM32手记