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