21
21
#if defined (DEVICE_PWMOUT) || defined(DOXYGEN_ONLY)
22
22
#include " hal/pwmout_api.h"
23
23
#include " platform/mbed_critical.h"
24
+ #include " platform/mbed_sleep.h"
24
25
25
26
namespace mbed {
26
27
/* * \addtogroup drivers */
@@ -56,12 +57,18 @@ class PwmOut {
56
57
*
57
58
* @param pin PwmOut pin to connect to
58
59
*/
59
- PwmOut (PinName pin) {
60
+ PwmOut (PinName pin) : _deep_sleep_locked( false ) {
60
61
core_util_critical_section_enter ();
61
62
pwmout_init (&_pwm, pin);
62
63
core_util_critical_section_exit ();
63
64
}
64
65
66
+ ~PwmOut () {
67
+ core_util_critical_section_enter ();
68
+ unlock_deep_sleep ();
69
+ core_util_critical_section_exit ();
70
+ }
71
+
65
72
/* * Set the ouput duty-cycle, specified as a percentage (float)
66
73
*
67
74
* @param value A floating-point value representing the output duty-cycle,
@@ -71,6 +78,7 @@ class PwmOut {
71
78
*/
72
79
void write (float value) {
73
80
core_util_critical_section_enter ();
81
+ lock_deep_sleep ();
74
82
pwmout_write (&_pwm, value);
75
83
core_util_critical_section_exit ();
76
84
}
@@ -177,7 +185,24 @@ class PwmOut {
177
185
}
178
186
179
187
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
+
180
204
pwmout_t _pwm;
205
+ bool _deep_sleep_locked;
181
206
};
182
207
183
208
} // namespace mbed
0 commit comments