#include
"STM32LowPower.h"
#include
<STM32RTC.h>
STM32RTC
&
rtc
=
STM32RTC::getInstance();
const
byte
seconds
=
0
;
const
byte
minutes
=
0
;
const
byte
hours
=
16
;
const
byte
day
=
20
;
const
byte
month
=
4
;
const
byte
year
=
22
;
void
alarmMatch(
void
*
data);
void
printWakeSource();
void
printBackupRegisterType();
void
printClockReady();
void
setup
()
{
Serial.begin
(
115200
);
Serial.println
(F(
"------------------------------------------------"
));
printWakeSource();
printBackupRegisterType();
printClockReady();
Serial.println
(F(
"------------------------------------------------"
));
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST)) {
enableBackupDomain();
resetBackupDomain();
setBackupRegister(LL_RTC_BKP_DR0,
0
);
}
__HAL_RCC_CLEAR_RESET_FLAGS();
rtc.begin();
rtc.setTime(hours, minutes, seconds);
rtc.setDate(day, month, year);
delay
(
1000
);
String someRandomData
=
"www.mischianti.org"
;
LowPower.begin();
LowPower.enableWakeupFrom(
&
rtc, alarmMatch,
&
someRandomData);
int
wakeSeconds
=
rtc.getSeconds()
+
20
;
rtc.setAlarmDay(day);
rtc.setAlarmTime(
16
,
0
, wakeSeconds,
0
);
rtc.enableAlarm(rtc.MATCH_DHHMMSS);
Serial.print
(
"Boot number RTC backup register: "
);
uint32_t boot_count_RTC_back
=
getBackupRegister(LL_RTC_BKP_DR0);
Serial.println
(boot_count_RTC_back);
boot_count_RTC_back
=
boot_count_RTC_back
+
1
;
setBackupRegister(LL_RTC_BKP_DR0, boot_count_RTC_back);
Serial.println
(
"Start shutdown mode in "
);
for
(
int
i
=
10
;i>
0
;i
-
-
) {
Serial.print
(i);
Serial.print
(
" "
);
delay
(
1000
); }
Serial.println
(
"OK!"
);
Serial.printf(
"Now is %02d/%02d/%02d %02d:%02d:%02d.%03d and we set the wake at 16:10! So wait 10secs! \n"
,
rtc.getDay(), rtc.getMonth(), rtc.getYear(),
rtc.getHours(), rtc.getMinutes(), rtc.getSeconds(), rtc.getSubSeconds());
delay
(
1000
);
LowPower.shutdown();
}
void
loop
()
{
Serial.printf(
"%02d/%02d/%02d "
, rtc.getDay(), rtc.getMonth(), rtc.getYear());
Serial.printf(
"%02d:%02d:%02d.%03d\n"
, rtc.getHours(), rtc.getMinutes(), rtc.getSeconds(), rtc.getSubSeconds());
delay
(
1000
);
}
void
alarmMatch(
void
*
data)
{
String myData
=
*
(String
*
)data;
Serial.println
(
"Alarm Match!"
);
Serial.println
(myData);
}
void
printClockReady() {
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY)) {
Serial.println
(F(
"HSI oscillator clock ready."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY)) {
Serial.println
(F(
"HSE oscillator clock ready."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)) {
Serial.println
(F(
"Main PLL clock ready."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY)) {
Serial.println
(F(
"PLLI2S clock ready."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY)) {
Serial.println
(F(
"LSE oscillator clock ready."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY)) {
Serial.println
(F(
"LSI oscillator clock ready."
));
}
}
void
printWakeSource() {
Serial.println
(F(
"-----------------------------------"
));
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST)) {
Serial.println
(F(
"Wake from POR/PDR or BOR reset."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)) {
Serial.println
(F(
"Wake from Pin reset."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST)) {
Serial.println
(F(
"Wake from POR/PDR reset."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)) {
Serial.println
(F(
"Wake from Software reset."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) {
Serial.println
(F(
"Wake from Independent Watchdog reset."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)) {
Serial.println
(F(
"Wake from Window Watchdog reset."
));
}
if
(__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST)) {
Serial.println
(F(
"Wake from Low Power reset."
));
}
Serial.println
(F(
"-----------------------------------"
));
}
void
printBackupRegisterType() {
#if
defined(BKP_BASE)
Serial.println
(F(
"Backup base enabled!"
));
#elif
defined(RTC_BKP0R)
Serial.println
(F(
"Backup RTC enabled!"
));
#elif
defined(TAMP_BKP0R)
#if
defined(STM32G4xx)
|
|
defined(STM32L5xx)
|
|
defined(STM32U5xx)
|
|
\
defined(STM32MP1xx)
|
|
defined(STM32WLxx)
Serial.println
(F(
"Backup RTC and TAMP enabled! TAMP busy use RTC!"
));
#else
Serial.println
(F(
"Backup RTC and TAMP enabled! Use TAMP!"
));
#endif
#else
Serial.println
(F(
"Backup not available!"
));
#endif
}