mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			PWMOut: lock deesleep addition
As PWMOut in most cases depend on high speed freq clock, it should lock deepsleep while active.pull/5177/head
							parent
							
								
									c6f655c02e
								
							
						
					
					
						commit
						5a6aee43eb
					
				| 
						 | 
				
			
			@ -21,6 +21,7 @@
 | 
			
		|||
#if defined (DEVICE_PWMOUT) || defined(DOXYGEN_ONLY)
 | 
			
		||||
#include "hal/pwmout_api.h"
 | 
			
		||||
#include "platform/mbed_critical.h"
 | 
			
		||||
#include "platform/mbed_sleep.h"
 | 
			
		||||
 | 
			
		||||
namespace mbed {
 | 
			
		||||
/** \addtogroup drivers */
 | 
			
		||||
| 
						 | 
				
			
			@ -56,12 +57,18 @@ public:
 | 
			
		|||
     *
 | 
			
		||||
     *  @param pin PwmOut pin to connect to
 | 
			
		||||
     */
 | 
			
		||||
    PwmOut(PinName pin) {
 | 
			
		||||
    PwmOut(PinName pin) : _deep_sleep_locked(false) {
 | 
			
		||||
        core_util_critical_section_enter();
 | 
			
		||||
        pwmout_init(&_pwm, pin);
 | 
			
		||||
        core_util_critical_section_exit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~PwmOut() {
 | 
			
		||||
        core_util_critical_section_enter();
 | 
			
		||||
        unlock_deep_sleep();
 | 
			
		||||
        core_util_critical_section_exit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Set the ouput duty-cycle, specified as a percentage (float)
 | 
			
		||||
     *
 | 
			
		||||
     *  @param value A floating-point value representing the output duty-cycle,
 | 
			
		||||
| 
						 | 
				
			
			@ -71,6 +78,7 @@ public:
 | 
			
		|||
     */
 | 
			
		||||
    void write(float value) {
 | 
			
		||||
        core_util_critical_section_enter();
 | 
			
		||||
        lock_deep_sleep();
 | 
			
		||||
        pwmout_write(&_pwm, value);
 | 
			
		||||
        core_util_critical_section_exit();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -177,7 +185,24 @@ public:
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    /** Lock deep sleep only if it is not yet locked */
 | 
			
		||||
    void lock_deep_sleep() {
 | 
			
		||||
        if (_deep_sleep_locked == false) {
 | 
			
		||||
            sleep_manager_lock_deep_sleep();
 | 
			
		||||
            _deep_sleep_locked = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Unlock deep sleep in case it is locked */
 | 
			
		||||
    void unlock_deep_sleep() {
 | 
			
		||||
        if (_deep_sleep_locked == true) {
 | 
			
		||||
            sleep_manager_unlock_deep_sleep();
 | 
			
		||||
            _deep_sleep_locked = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pwmout_t _pwm;
 | 
			
		||||
    bool _deep_sleep_locked;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace mbed
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue