@@ -45,6 +45,7 @@ STM32LowPower::STM32LowPower()
45
45
{
46
46
_configured = false ;
47
47
_serial = NULL ;
48
+ _rtc_wakeup = false ;
48
49
}
49
50
50
51
/* *
@@ -66,8 +67,8 @@ void STM32LowPower::begin(void)
66
67
*/
67
68
void STM32LowPower::idle (uint32_t millis)
68
69
{
69
- if (millis > 0 ) {
70
- programRtcWakeUp (millis);
70
+ if (( millis > 0 ) || _rtc_wakeup ) {
71
+ programRtcWakeUp (millis, IDLE_MODE );
71
72
}
72
73
LowPower_sleep (PWR_MAINREGULATOR_ON);
73
74
}
@@ -80,8 +81,8 @@ void STM32LowPower::idle(uint32_t millis)
80
81
*/
81
82
void STM32LowPower::sleep (uint32_t millis)
82
83
{
83
- if (millis > 0 ) {
84
- programRtcWakeUp (millis);
84
+ if (( millis > 0 ) || _rtc_wakeup ) {
85
+ programRtcWakeUp (millis, SLEEP_MODE );
85
86
}
86
87
LowPower_sleep (PWR_LOWPOWERREGULATOR_ON);
87
88
}
@@ -94,8 +95,8 @@ void STM32LowPower::sleep(uint32_t millis)
94
95
*/
95
96
void STM32LowPower::deepSleep (uint32_t millis)
96
97
{
97
- if (millis > 0 ) {
98
- programRtcWakeUp (millis);
98
+ if (( millis > 0 ) || _rtc_wakeup ) {
99
+ programRtcWakeUp (millis, DEEP_SLEEP_MODE );
99
100
}
100
101
LowPower_stop (_serial);
101
102
}
@@ -108,8 +109,8 @@ void STM32LowPower::deepSleep(uint32_t millis)
108
109
*/
109
110
void STM32LowPower::shutdown (uint32_t millis)
110
111
{
111
- if (millis > 0 ) {
112
- programRtcWakeUp (millis);
112
+ if (( millis > 0 ) || _rtc_wakeup ) {
113
+ programRtcWakeUp (millis, SHUTDOWN_MODE );
113
114
}
114
115
LowPower_shutdown ();
115
116
}
@@ -150,36 +151,56 @@ void STM32LowPower::enableWakeupFrom(HardwareSerial *serial, voidFuncPtrVoid cal
150
151
151
152
/* *
152
153
* @brief Attach a callback to a RTC alarm.
153
- * @param rtc: pointer to a STM32RTC
154
+ * @param rtc: pointer to a STM32RTC. Can be NULL as RTC is a Singleton.
154
155
* @param callback: pointer to callback function called when leave the low power
155
156
* mode.
156
- * @param data: optional pointer to callaback data parameters (default NULL).
157
+ * @param data: optional pointer to callback data parameters (default NULL).
157
158
* @retval None
158
159
*/
159
160
void STM32LowPower::enableWakeupFrom (STM32RTC *rtc, voidFuncPtr callback, void *data)
160
161
{
161
162
if (rtc == NULL ) {
162
163
rtc = &(STM32RTC::getInstance ());
163
164
}
164
- // Reconfigure rtc for low power mode (using LSE as clock source)
165
- rtc->configForLowPower ();
165
+ _rtc_wakeup = true ;
166
166
rtc->attachInterrupt (callback, data);
167
167
}
168
168
169
169
/* *
170
170
* @brief Configure the RTC alarm
171
171
* @param millis: time of the alarm in milliseconds. At least 1000ms.
172
+ * @param lp_mode: low power mode targeted.
172
173
* @retval None
173
174
*/
174
- void STM32LowPower::programRtcWakeUp (uint32_t millis)
175
+ void STM32LowPower::programRtcWakeUp (uint32_t millis, LP_Mode lp_mode )
175
176
{
176
177
int epoc;
177
178
uint32_t sec;
178
179
STM32RTC& rtc = STM32RTC::getInstance ();
180
+ STM32RTC::RTC_Source_Clock clkSrc = rtc.getClockSource ();
181
+
182
+ switch (lp_mode) {
183
+ case IDLE_MODE:
184
+ case SLEEP_MODE:
185
+ break ;
186
+ // LSI or LSE must be selected as clock source to wakeup the device.
187
+ case DEEP_SLEEP_MODE:
188
+ clkSrc = (clkSrc == STM32RTC::RTC_HSE_CLOCK) ? STM32RTC::RTC_LSI_CLOCK : clkSrc;
189
+ break ;
190
+ default :
191
+ case SHUTDOWN_MODE:
192
+ #ifdef STM32L4xx
193
+ // For shutdown mode LSE have to be used (STM32L4 series only)
194
+ clkSrc = STM32RTC::RTC_LSE_CLOCK;
195
+ #else
196
+ // LSE or LSI
197
+ clkSrc = (clkSrc == STM32RTC::RTC_HSE_CLOCK) ? STM32RTC::RTC_LSI_CLOCK : clkSrc;
198
+ #endif
199
+ break ;
200
+ }
201
+ rtc.configForLowPower (clkSrc);
179
202
180
203
if (millis > 0 ) {
181
- // LSE must be selected as clock source to wakeup the device from shutdown mode
182
- rtc.configForLowPower ();
183
204
// Convert millisecond to second
184
205
sec = millis / 1000 ;
185
206
// Minimum is 1 second
0 commit comments