Skip to content

Commit abcf8d1

Browse files
Revert removal of STM32L0.wakeup(); fix standby logic
1 parent 7217660 commit abcf8d1

File tree

15 files changed

+1028
-1066
lines changed

15 files changed

+1028
-1066
lines changed

cores/arduino/Callback.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017-2018 Thomas Roell. All rights reserved.
2+
* Copyright (c) 2017-2020 Thomas Roell. All rights reserved.
33
*
44
* Permission is hereby granted, free of charge, to any person obtaining a copy
55
* of this software and associated documentation files (the "Software"), to
@@ -35,20 +35,19 @@
3535
*/
3636

3737
bool Callback::queue() {
38-
stm32l0_system_wakeup();
39-
4038
if (_callback) {
41-
return armv6m_pendsv_enqueue((armv6m_pendsv_routine_t)_callback, _context, 0);
39+
return armv6m_pendsv_enqueue((armv6m_pendsv_routine_t)_callback, _context, 0);
4240
} else {
43-
return false;
41+
stm32l0_system_wakeup();
42+
return false;
4443
}
4544
}
4645

4746
void Callback::call() {
48-
stm32l0_system_wakeup();
49-
5047
if (_callback) {
51-
(*_callback)(_context);
48+
(*_callback)(_context);
49+
} else {
50+
stm32l0_system_wakeup();
5251
}
5352
}
5453

@@ -57,12 +56,12 @@ void Callback::bind(const void *method, const void *object) {
5756
ptrdiff_t adj = ((ptrdiff_t)(((const uint32_t*)method)[1]) >> 1);
5857

5958
if (!((const uint32_t*)method)[1] & 1) {
60-
/* non-virtual function */
61-
_callback = (void(*)(void*))ptr;
59+
/* non-virtual function */
60+
_callback = (void(*)(void*))ptr;
6261
} else {
63-
/* virtual function */
64-
void *vptr = *((void**)((uintptr_t)object + adj));
65-
_callback = (void(*)(void*))(*((void**)((uint8_t*)vptr + (ptrdiff_t)ptr)));
62+
/* virtual function */
63+
void *vptr = *((void**)((uintptr_t)object + adj));
64+
_callback = (void(*)(void*))(*((void**)((uint8_t*)vptr + (ptrdiff_t)ptr)));
6665
}
6766
_context = (void*)((uintptr_t)object + adj);
6867
}

cores/arduino/Callback.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2016-2018 Thomas Roell. All rights reserved.
2+
* Copyright (c) 2016-2020 Thomas Roell. All rights reserved.
33
*
44
* Permission is hereby granted, free of charge, to any person obtaining a copy
55
* of this software and associated documentation files (the "Software"), to

cores/arduino/WInterrupts.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
4040
if (g_APinDescription[pin].attr & PIN_ATTR_EXTI) {
4141
switch (mode) {
4242
case CHANGE:
43-
control = (STM32L0_EXTI_CONTROL_EDGE_FALLING | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_WAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_MEDIUM);
43+
control = (STM32L0_EXTI_CONTROL_EDGE_FALLING | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_PRIORITY_MEDIUM);
4444
break;
4545
case FALLING:
46-
control = (STM32L0_EXTI_CONTROL_EDGE_FALLING | STM32L0_EXTI_CONTROL_WAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_MEDIUM);
46+
control = (STM32L0_EXTI_CONTROL_EDGE_FALLING | STM32L0_EXTI_CONTROL_PRIORITY_MEDIUM);
4747
break;
4848
case RISING:
49-
control = (STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_WAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_MEDIUM);
49+
control = (STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_PRIORITY_MEDIUM);
5050
break;
5151
default:
5252
control = 0;
@@ -59,10 +59,10 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
5959
} else {
6060
switch (mode) {
6161
case FALLING:
62-
control = (STM32L0_RTC_TAMP_CONTROL_EDGE_FALLING | STM32L0_RTC_TAMP_CONTROL_WAKEUP);
62+
control = (STM32L0_RTC_TAMP_CONTROL_EDGE_FALLING);
6363
break;
6464
case RISING:
65-
control = (STM32L0_RTC_TAMP_CONTROL_EDGE_RISING | STM32L0_RTC_TAMP_CONTROL_WAKEUP);
65+
control = (STM32L0_RTC_TAMP_CONTROL_EDGE_RISING);
6666
break;
6767
default:
6868
control = 0;

libraries/RTC/src/RTC.cpp

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void RTCClass::begin(bool resetTime)
5656
{
5757
if (resetTime && !(stm32l0_rtc_status() & (STM32L0_RTC_STATUS_TIME_INTERNAL | STM32L0_RTC_STATUS_TIME_EXTERNAL)))
5858
{
59-
stm32l0_rtc_time_write(0, Y2K_TO_GPS_OFFSET + Y2K_UTC_OFFSET, 0, false);
59+
stm32l0_rtc_time_write(0, Y2K_TO_GPS_OFFSET + Y2K_UTC_OFFSET, 0, false);
6060
}
6161
}
6262

@@ -530,7 +530,7 @@ void RTCClass::enableAlarm(AlarmMatch match)
530530
void RTCClass::disableAlarm()
531531
{
532532
if (_alarm_match != MATCH_OFF) {
533-
_alarm_match = MATCH_OFF;
533+
_alarm_match = MATCH_OFF;
534534

535535
stm32l0_rtc_alarm_stop();
536536
}
@@ -624,68 +624,68 @@ void RTCClass::SyncAlarm()
624624
uint32_t seconds, ticks, period;
625625

626626
if (_alarm_match != MATCH_OFF) {
627-
if (_alarm_epoch) {
628-
seconds = _alarm_epoch;
629-
ticks = 0;
630-
631-
switch (_alarm_match) {
632-
default:
633-
case MATCH_ANY: // Every Second
634-
period = 1;
635-
break;
636-
case MATCH_SS: // Every Minute
637-
period = 60;
638-
break;
639-
case MATCH_MMSS: // Every Hour
640-
period = 3600;
641-
break;
642-
case MATCH_HHMMSS: // Every Day
643-
period = 86400;
644-
break;
645-
case MATCH_YYMMDDHHMMSS: // Once, on a specific date and a specific time
646-
period = 0;
647-
break;
648-
}
649-
} else {
650-
if (_alarm_match != MATCH_YYMMDDHHMMSS) {
651-
seconds = Y2K_TO_GPS_OFFSET - _tz_offset; // offset by a day to avoid underflow
652-
ticks = 0;
653-
654-
switch (_alarm_match) {
655-
default:
656-
case MATCH_ANY: // Every Second
657-
period = 1;
658-
break;
659-
case MATCH_SS: // Every Minute
660-
period = 60;
661-
seconds += _alarm_seconds;
662-
break;
663-
case MATCH_MMSS: // Every Hour
664-
period = 3600;
665-
seconds += (_alarm_seconds + 60 * _alarm_minutes);
666-
break;
667-
case MATCH_HHMMSS: // Every Day
668-
period = 86400;
669-
seconds += (_alarm_seconds + 60 * _alarm_minutes + 3600 * _alarm_hours);
670-
break;
671-
}
672-
} else {
673-
tod.year = _alarm_year;
674-
tod.month = _alarm_month;
675-
tod.day = _alarm_day;
676-
tod.hours = _alarm_hours;
677-
tod.minutes = _alarm_minutes;
678-
tod.seconds = _alarm_seconds;
679-
tod.ticks = 0;
680-
681-
stm32l0_rtc_tod_to_time(&tod, &seconds, &ticks);
682-
683-
seconds = seconds + Y2K_TO_GPS_OFFSET - _tz_offset;
684-
period = 0;
685-
}
686-
}
687-
688-
stm32l0_rtc_alarm_start(seconds, ticks, period, STM32L0_RTC_ALARM_MODE_UTC_OFFSET, (stm32l0_rtc_alarm_callback_t)_alarmCallback, (void*)NULL);
627+
if (_alarm_epoch) {
628+
seconds = _alarm_epoch;
629+
ticks = 0;
630+
631+
switch (_alarm_match) {
632+
default:
633+
case MATCH_ANY: // Every Second
634+
period = 1;
635+
break;
636+
case MATCH_SS: // Every Minute
637+
period = 60;
638+
break;
639+
case MATCH_MMSS: // Every Hour
640+
period = 3600;
641+
break;
642+
case MATCH_HHMMSS: // Every Day
643+
period = 86400;
644+
break;
645+
case MATCH_YYMMDDHHMMSS: // Once, on a specific date and a specific time
646+
period = 0;
647+
break;
648+
}
649+
} else {
650+
if (_alarm_match != MATCH_YYMMDDHHMMSS) {
651+
seconds = Y2K_TO_GPS_OFFSET - _tz_offset; // offset by a day to avoid underflow
652+
ticks = 0;
653+
654+
switch (_alarm_match) {
655+
default:
656+
case MATCH_ANY: // Every Second
657+
period = 1;
658+
break;
659+
case MATCH_SS: // Every Minute
660+
period = 60;
661+
seconds += _alarm_seconds;
662+
break;
663+
case MATCH_MMSS: // Every Hour
664+
period = 3600;
665+
seconds += (_alarm_seconds + 60 * _alarm_minutes);
666+
break;
667+
case MATCH_HHMMSS: // Every Day
668+
period = 86400;
669+
seconds += (_alarm_seconds + 60 * _alarm_minutes + 3600 * _alarm_hours);
670+
break;
671+
}
672+
} else {
673+
tod.year = _alarm_year;
674+
tod.month = _alarm_month;
675+
tod.day = _alarm_day;
676+
tod.hours = _alarm_hours;
677+
tod.minutes = _alarm_minutes;
678+
tod.seconds = _alarm_seconds;
679+
tod.ticks = 0;
680+
681+
stm32l0_rtc_tod_to_time(&tod, &seconds, &ticks);
682+
683+
seconds = seconds + Y2K_TO_GPS_OFFSET - _tz_offset;
684+
period = 0;
685+
}
686+
}
687+
688+
stm32l0_rtc_alarm_start(seconds, ticks, period, STM32L0_RTC_ALARM_MODE_UTC_OFFSET, (stm32l0_rtc_alarm_callback_t)_alarmCallback, (void*)NULL);
689689
}
690690
}
691691

@@ -696,10 +696,10 @@ void RTCClass::_alarmCallback()
696696
_alarm_match = MATCH_OFF;
697697
}
698698

699-
stm32l0_system_wakeup();
700-
701699
if (_alarm_callback) {
702700
(*_alarm_callback)();
701+
} else {
702+
stm32l0_system_wakeup();
703703
}
704704
}
705705

libraries/STM32L0/keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ getVREF KEYWORD2
1919
getTemperature KEYWORD2
2020
resetCause KEYWORD2
2121
wakeupReason KEYWORD2
22+
wakeup KEYWORD2
2223
sleep KEYWORD2
2324
stop KEYWORD2
2425
standby KEYWORD2

libraries/STM32L0/src/STM32L0.cpp

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017-2018 Thomas Roell. All rights reserved.
2+
* Copyright (c) 2017-2020 Thomas Roell. All rights reserved.
33
*
44
* Permission is hereby granted, free of charge, to any person obtaining a copy
55
* of this software and associated documentation files (the "Software"), to
@@ -55,7 +55,7 @@ bool STM32L0Class::getVBUS()
5555
{
5656
#if defined(STM32L0_CONFIG_PIN_VBUS)
5757
if (STM32L0_CONFIG_PIN_VBUS == STM32L0_GPIO_PIN_NONE) {
58-
return false;
58+
return false;
5959
}
6060

6161
return !!stm32l0_gpio_pin_read(STM32L0_CONFIG_PIN_VBUS);
@@ -114,6 +114,16 @@ uint32_t STM32L0Class::resetCause()
114114
return stm32l0_system_reset_cause();
115115
}
116116

117+
uint32_t STM32L0Class::wakeupReason()
118+
{
119+
return stm32l0_system_wakeup_reason();
120+
}
121+
122+
void STM32L0Class::wakeup()
123+
{
124+
stm32l0_system_wakeup();
125+
}
126+
117127
void STM32L0Class::sleep(uint32_t timeout)
118128
{
119129
stm32l0_system_sleep(STM32L0_SYSTEM_POLICY_SLEEP, timeout);
@@ -122,9 +132,9 @@ void STM32L0Class::sleep(uint32_t timeout)
122132
void STM32L0Class::stop(uint32_t timeout)
123133
{
124134
if (g_swdStatus == 0) {
125-
stm32l0_system_swd_disable();
135+
stm32l0_system_swd_disable();
126136

127-
g_swdStatus = 2;
137+
g_swdStatus = 2;
128138
}
129139

130140
stm32l0_system_sleep(STM32L0_SYSTEM_POLICY_DEEPSLEEP, timeout);
@@ -143,18 +153,18 @@ void STM32L0Class::reset()
143153
void STM32L0Class::swdEnable()
144154
{
145155
if (g_swdStatus != 3) {
146-
stm32l0_system_swd_enable();
156+
stm32l0_system_swd_enable();
147157

148-
g_swdStatus = 1;
158+
g_swdStatus = 1;
149159
}
150160
}
151161

152162
void STM32L0Class::swdDisable()
153163
{
154164
if (g_swdStatus != 3) {
155-
stm32l0_system_swd_disable();
165+
stm32l0_system_swd_disable();
156166

157-
g_swdStatus = 2;
167+
g_swdStatus = 2;
158168
}
159169
}
160170

@@ -171,13 +181,13 @@ void STM32L0Class::wdtReset()
171181
bool STM32L0Class::flashErase(uint32_t address, uint32_t count)
172182
{
173183
if (address & 127) {
174-
return false;
184+
return false;
175185
}
176186

177187
count = (count + 127) & ~127;
178188

179189
if ((address < FLASHSTART) || ((address + count) > FLASHEND)) {
180-
return false;
190+
return false;
181191
}
182192

183193
stm32l0_flash_unlock();
@@ -190,17 +200,17 @@ bool STM32L0Class::flashErase(uint32_t address, uint32_t count)
190200
bool STM32L0Class::flashProgram(uint32_t address, const void *data, uint32_t count)
191201
{
192202
if ((address & 3) || (count & 3)) {
193-
return false;
203+
return false;
194204
}
195205

196206
if ((address < FLASHSTART) || ((address + count) > FLASHEND)) {
197-
return false;
207+
return false;
198208
}
199209

200210
if (count) {
201-
stm32l0_flash_unlock();
202-
stm32l0_flash_program(address, (const uint8_t*)data, count);
203-
stm32l0_flash_lock();
211+
stm32l0_flash_unlock();
212+
stm32l0_flash_program(address, (const uint8_t*)data, count);
213+
stm32l0_flash_lock();
204214
}
205215

206216
return true;

0 commit comments

Comments
 (0)