SAMD21 在深度睡眠后不会醒来

时间:2021-06-09 07:38:14

标签: c++ arduino 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。但是当我的董事会睡觉时,她永远不会醒来我不明白为什么,我错过了什么?

0 个答案:

没有答案