SAMD21 在深度睡眠后不会醒来

问题描述

我正在使用 atsamd21e18a 制作个人版块。我实际上正在研究睡眠模式。我制作了一个函数,将 samd21 置于这样的睡眠模式。我使用 RTCZero 库。

所以在我的设置功能中,我有这样的东西

RTCZero rtc;

void setup(){
    // Set the XOSC32K to run in standby
    SYSCTRL->XOSC32K.bit.RUNSTDBY = 1;

    rtc.begin();   
    .... other line code ....
    attachInterrupt(digitalPinToInterrupt(PIN_USER_BUTTON),wakeUpButtonUser,CHANGE);
    ...other line....
}

所以在我的设置中,我初始化了 rtc 并在我的用户按钮中附加了一个中断。此按钮用于打开或关闭我的电路板。

我的函数goTosleep()

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__DSB();
__WFI();

在我的函数 wakeUpButtonUser 中,我有一个简单的 if/else 语句。如果用户按下按钮超过 3 秒,samd21 使用 goToSleep() 功能进入睡眠状态,否则如果不到 3 秒,我想唤醒电路板并点亮我的 LED,但它不起作用。

这里我的 wakeUpButtonUser 函数,user_button 是从 C++ 为我的按钮创建的对象。

void wakeUpButtonUser(){
  if (userButton.ispressed())
  {
    userButton.setTimeStartpressed(millis());
    PRINT_DEBUG_LN("pressed");
  }
  else
  {
    userButton.setTimeEndpressed(millis());
    PRINT_DEBUG_LN("Released");
    uint32_t time_pressed = userButton.getTimepressed();
    if (time_pressed >= temps_on && time_pressed < temps_off)
    {                  
        PRINT_DEBUG_LN("ON");
         //here I have code to light up a led
    }
    else
    {
        PRINT_DEBUG_LN("STOP");
        goSleepMode();
    }
  }
}

功能有效,因为如果我注释 goToSleep() 行,我可以根据按下按钮的时间打开或关闭串行读取,并且 LED 也可以工作,因为我可以在睡觉前点亮 LED。但是当我的董事会睡觉时,她永远不会醒来我不明白为什么,我错过了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)