Skip to content

Commit ddb6b66

Browse files
Merge pull request #5177 from 0xc0170/fix_pwmout_sleep
PWMOut: lock deesleep addition
2 parents 8508d26 + 5a6aee4 commit ddb6b66

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

drivers/PwmOut.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#if defined (DEVICE_PWMOUT) || defined(DOXYGEN_ONLY)
2222
#include "hal/pwmout_api.h"
2323
#include "platform/mbed_critical.h"
24+
#include "platform/mbed_sleep.h"
2425

2526
namespace mbed {
2627
/** \addtogroup drivers */
@@ -56,12 +57,18 @@ class PwmOut {
5657
*
5758
* @param pin PwmOut pin to connect to
5859
*/
59-
PwmOut(PinName pin) {
60+
PwmOut(PinName pin) : _deep_sleep_locked(false) {
6061
core_util_critical_section_enter();
6162
pwmout_init(&_pwm, pin);
6263
core_util_critical_section_exit();
6364
}
6465

66+
~PwmOut() {
67+
core_util_critical_section_enter();
68+
unlock_deep_sleep();
69+
core_util_critical_section_exit();
70+
}
71+
6572
/** Set the ouput duty-cycle, specified as a percentage (float)
6673
*
6774
* @param value A floating-point value representing the output duty-cycle,
@@ -71,6 +78,7 @@ class PwmOut {
7178
*/
7279
void write(float value) {
7380
core_util_critical_section_enter();
81+
lock_deep_sleep();
7482
pwmout_write(&_pwm, value);
7583
core_util_critical_section_exit();
7684
}
@@ -177,7 +185,24 @@ class PwmOut {
177185
}
178186

179187
protected:
188+
/** Lock deep sleep only if it is not yet locked */
189+
void lock_deep_sleep() {
190+
if (_deep_sleep_locked == false) {
191+
sleep_manager_lock_deep_sleep();
192+
_deep_sleep_locked = true;
193+
}
194+
}
195+
196+
/** Unlock deep sleep in case it is locked */
197+
void unlock_deep_sleep() {
198+
if (_deep_sleep_locked == true) {
199+
sleep_manager_unlock_deep_sleep();
200+
_deep_sleep_locked = false;
201+
}
202+
}
203+
180204
pwmout_t _pwm;
205+
bool _deep_sleep_locked;
181206
};
182207

183208
} // namespace mbed

0 commit comments

Comments
 (0)