0

我正在使用 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。但是当我的董事会睡觉时,她永远不会醒来我不明白为什么,我错过了什么?

4

0 回答 0