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