RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
0:38ceb79fef03
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* mbed Microcontroller Library
kevman 0:38ceb79fef03 2 * Copyright (c) 2006-2013 ARM Limited
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 0:38ceb79fef03 5 * you may not use this file except in compliance with the License.
kevman 0:38ceb79fef03 6 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 7 *
kevman 0:38ceb79fef03 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 9 *
kevman 0:38ceb79fef03 10 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 0:38ceb79fef03 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 13 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 14 * limitations under the License.
kevman 0:38ceb79fef03 15 */
kevman 0:38ceb79fef03 16 #ifndef MBED_PWMOUT_H
kevman 0:38ceb79fef03 17 #define MBED_PWMOUT_H
kevman 0:38ceb79fef03 18
kevman 0:38ceb79fef03 19 #include "platform/platform.h"
kevman 0:38ceb79fef03 20
kevman 0:38ceb79fef03 21 #if defined (DEVICE_PWMOUT) || defined(DOXYGEN_ONLY)
kevman 0:38ceb79fef03 22 #include "hal/pwmout_api.h"
kevman 0:38ceb79fef03 23 #include "platform/mbed_critical.h"
kevman 0:38ceb79fef03 24 #include "platform/mbed_power_mgmt.h"
kevman 0:38ceb79fef03 25
kevman 0:38ceb79fef03 26 namespace mbed {
kevman 0:38ceb79fef03 27 /** \addtogroup drivers */
kevman 0:38ceb79fef03 28
kevman 0:38ceb79fef03 29 /** A pulse-width modulation digital output
kevman 0:38ceb79fef03 30 *
kevman 0:38ceb79fef03 31 * @note Synchronization level: Interrupt safe
kevman 0:38ceb79fef03 32 *
kevman 0:38ceb79fef03 33 * Example
kevman 0:38ceb79fef03 34 * @code
kevman 0:38ceb79fef03 35 * // Gradually change the intensity of the LED.
kevman 0:38ceb79fef03 36 * #include "mbed.h"
kevman 0:38ceb79fef03 37 *
kevman 0:38ceb79fef03 38 * PwmOut led(LED1);
kevman 0:38ceb79fef03 39 *
kevman 0:38ceb79fef03 40 * int main() {
kevman 0:38ceb79fef03 41 * while(1) {
kevman 0:38ceb79fef03 42 * led = led + 0.01;
kevman 0:38ceb79fef03 43 * wait(0.2);
kevman 0:38ceb79fef03 44 * if(led == 1.0) {
kevman 0:38ceb79fef03 45 * led = 0;
kevman 0:38ceb79fef03 46 * }
kevman 0:38ceb79fef03 47 * }
kevman 0:38ceb79fef03 48 * }
kevman 0:38ceb79fef03 49 * @endcode
kevman 0:38ceb79fef03 50 * @ingroup drivers
kevman 0:38ceb79fef03 51 */
kevman 0:38ceb79fef03 52 class PwmOut {
kevman 0:38ceb79fef03 53
kevman 0:38ceb79fef03 54 public:
kevman 0:38ceb79fef03 55
kevman 0:38ceb79fef03 56 /** Create a PwmOut connected to the specified pin
kevman 0:38ceb79fef03 57 *
kevman 0:38ceb79fef03 58 * @param pin PwmOut pin to connect to
kevman 0:38ceb79fef03 59 */
kevman 0:38ceb79fef03 60 PwmOut(PinName pin) : _deep_sleep_locked(false)
kevman 0:38ceb79fef03 61 {
kevman 0:38ceb79fef03 62 core_util_critical_section_enter();
kevman 0:38ceb79fef03 63 pwmout_init(&_pwm, pin);
kevman 0:38ceb79fef03 64 core_util_critical_section_exit();
kevman 0:38ceb79fef03 65 }
kevman 0:38ceb79fef03 66
kevman 0:38ceb79fef03 67 ~PwmOut()
kevman 0:38ceb79fef03 68 {
kevman 0:38ceb79fef03 69 core_util_critical_section_enter();
kevman 0:38ceb79fef03 70 unlock_deep_sleep();
kevman 0:38ceb79fef03 71 core_util_critical_section_exit();
kevman 0:38ceb79fef03 72 }
kevman 0:38ceb79fef03 73
kevman 0:38ceb79fef03 74 /** Set the output duty-cycle, specified as a percentage (float)
kevman 0:38ceb79fef03 75 *
kevman 0:38ceb79fef03 76 * @param value A floating-point value representing the output duty-cycle,
kevman 0:38ceb79fef03 77 * specified as a percentage. The value should lie between
kevman 0:38ceb79fef03 78 * 0.0f (representing on 0%) and 1.0f (representing on 100%).
kevman 0:38ceb79fef03 79 * Values outside this range will be saturated to 0.0f or 1.0f.
kevman 0:38ceb79fef03 80 */
kevman 0:38ceb79fef03 81 void write(float value)
kevman 0:38ceb79fef03 82 {
kevman 0:38ceb79fef03 83 core_util_critical_section_enter();
kevman 0:38ceb79fef03 84 lock_deep_sleep();
kevman 0:38ceb79fef03 85 pwmout_write(&_pwm, value);
kevman 0:38ceb79fef03 86 core_util_critical_section_exit();
kevman 0:38ceb79fef03 87 }
kevman 0:38ceb79fef03 88
kevman 0:38ceb79fef03 89 /** Return the current output duty-cycle setting, measured as a percentage (float)
kevman 0:38ceb79fef03 90 *
kevman 0:38ceb79fef03 91 * @returns
kevman 0:38ceb79fef03 92 * A floating-point value representing the current duty-cycle being output on the pin,
kevman 0:38ceb79fef03 93 * measured as a percentage. The returned value will lie between
kevman 0:38ceb79fef03 94 * 0.0f (representing on 0%) and 1.0f (representing on 100%).
kevman 0:38ceb79fef03 95 *
kevman 0:38ceb79fef03 96 * @note
kevman 0:38ceb79fef03 97 * This value may not match exactly the value set by a previous write().
kevman 0:38ceb79fef03 98 */
kevman 0:38ceb79fef03 99 float read()
kevman 0:38ceb79fef03 100 {
kevman 0:38ceb79fef03 101 core_util_critical_section_enter();
kevman 0:38ceb79fef03 102 float val = pwmout_read(&_pwm);
kevman 0:38ceb79fef03 103 core_util_critical_section_exit();
kevman 0:38ceb79fef03 104 return val;
kevman 0:38ceb79fef03 105 }
kevman 0:38ceb79fef03 106
kevman 0:38ceb79fef03 107 /** Set the PWM period, specified in seconds (float), keeping the duty cycle the same.
kevman 0:38ceb79fef03 108 *
kevman 0:38ceb79fef03 109 * @param seconds Change the period of a PWM signal in seconds (float) without modifying the duty cycle
kevman 0:38ceb79fef03 110 * @note
kevman 0:38ceb79fef03 111 * The resolution is currently in microseconds; periods smaller than this
kevman 0:38ceb79fef03 112 * will be set to zero.
kevman 0:38ceb79fef03 113 */
kevman 0:38ceb79fef03 114 void period(float seconds)
kevman 0:38ceb79fef03 115 {
kevman 0:38ceb79fef03 116 core_util_critical_section_enter();
kevman 0:38ceb79fef03 117 pwmout_period(&_pwm, seconds);
kevman 0:38ceb79fef03 118 core_util_critical_section_exit();
kevman 0:38ceb79fef03 119 }
kevman 0:38ceb79fef03 120
kevman 0:38ceb79fef03 121 /** Set the PWM period, specified in milliseconds (int), keeping the duty cycle the same.
kevman 0:38ceb79fef03 122 * @param ms Change the period of a PWM signal in milliseconds without modifying the duty cycle
kevman 0:38ceb79fef03 123 */
kevman 0:38ceb79fef03 124 void period_ms(int ms)
kevman 0:38ceb79fef03 125 {
kevman 0:38ceb79fef03 126 core_util_critical_section_enter();
kevman 0:38ceb79fef03 127 pwmout_period_ms(&_pwm, ms);
kevman 0:38ceb79fef03 128 core_util_critical_section_exit();
kevman 0:38ceb79fef03 129 }
kevman 0:38ceb79fef03 130
kevman 0:38ceb79fef03 131 /** Set the PWM period, specified in microseconds (int), keeping the duty cycle the same.
kevman 0:38ceb79fef03 132 * @param us Change the period of a PWM signal in microseconds without modifying the duty cycle
kevman 0:38ceb79fef03 133 */
kevman 0:38ceb79fef03 134 void period_us(int us)
kevman 0:38ceb79fef03 135 {
kevman 0:38ceb79fef03 136 core_util_critical_section_enter();
kevman 0:38ceb79fef03 137 pwmout_period_us(&_pwm, us);
kevman 0:38ceb79fef03 138 core_util_critical_section_exit();
kevman 0:38ceb79fef03 139 }
kevman 0:38ceb79fef03 140
kevman 0:38ceb79fef03 141 /** Set the PWM pulsewidth, specified in seconds (float), keeping the period the same.
kevman 0:38ceb79fef03 142 * @param seconds Change the pulse width of a PWM signal specified in seconds (float)
kevman 0:38ceb79fef03 143 */
kevman 0:38ceb79fef03 144 void pulsewidth(float seconds)
kevman 0:38ceb79fef03 145 {
kevman 0:38ceb79fef03 146 core_util_critical_section_enter();
kevman 0:38ceb79fef03 147 pwmout_pulsewidth(&_pwm, seconds);
kevman 0:38ceb79fef03 148 core_util_critical_section_exit();
kevman 0:38ceb79fef03 149 }
kevman 0:38ceb79fef03 150
kevman 0:38ceb79fef03 151 /** Set the PWM pulsewidth, specified in milliseconds (int), keeping the period the same.
kevman 0:38ceb79fef03 152 * @param ms Change the pulse width of a PWM signal specified in milliseconds
kevman 0:38ceb79fef03 153 */
kevman 0:38ceb79fef03 154 void pulsewidth_ms(int ms)
kevman 0:38ceb79fef03 155 {
kevman 0:38ceb79fef03 156 core_util_critical_section_enter();
kevman 0:38ceb79fef03 157 pwmout_pulsewidth_ms(&_pwm, ms);
kevman 0:38ceb79fef03 158 core_util_critical_section_exit();
kevman 0:38ceb79fef03 159 }
kevman 0:38ceb79fef03 160
kevman 0:38ceb79fef03 161 /** Set the PWM pulsewidth, specified in microseconds (int), keeping the period the same.
kevman 0:38ceb79fef03 162 * @param us Change the pulse width of a PWM signal specified in microseconds
kevman 0:38ceb79fef03 163 */
kevman 0:38ceb79fef03 164 void pulsewidth_us(int us)
kevman 0:38ceb79fef03 165 {
kevman 0:38ceb79fef03 166 core_util_critical_section_enter();
kevman 0:38ceb79fef03 167 pwmout_pulsewidth_us(&_pwm, us);
kevman 0:38ceb79fef03 168 core_util_critical_section_exit();
kevman 0:38ceb79fef03 169 }
kevman 0:38ceb79fef03 170
kevman 0:38ceb79fef03 171 /** A operator shorthand for write()
kevman 0:38ceb79fef03 172 * \sa PwmOut::write()
kevman 0:38ceb79fef03 173 */
kevman 0:38ceb79fef03 174 PwmOut &operator= (float value)
kevman 0:38ceb79fef03 175 {
kevman 0:38ceb79fef03 176 // Underlying call is thread safe
kevman 0:38ceb79fef03 177 write(value);
kevman 0:38ceb79fef03 178 return *this;
kevman 0:38ceb79fef03 179 }
kevman 0:38ceb79fef03 180
kevman 0:38ceb79fef03 181 /** A operator shorthand for write()
kevman 0:38ceb79fef03 182 * \sa PwmOut::write()
kevman 0:38ceb79fef03 183 */
kevman 0:38ceb79fef03 184 PwmOut &operator= (PwmOut &rhs)
kevman 0:38ceb79fef03 185 {
kevman 0:38ceb79fef03 186 // Underlying call is thread safe
kevman 0:38ceb79fef03 187 write(rhs.read());
kevman 0:38ceb79fef03 188 return *this;
kevman 0:38ceb79fef03 189 }
kevman 0:38ceb79fef03 190
kevman 0:38ceb79fef03 191 /** An operator shorthand for read()
kevman 0:38ceb79fef03 192 * \sa PwmOut::read()
kevman 0:38ceb79fef03 193 */
kevman 0:38ceb79fef03 194 operator float()
kevman 0:38ceb79fef03 195 {
kevman 0:38ceb79fef03 196 // Underlying call is thread safe
kevman 0:38ceb79fef03 197 return read();
kevman 0:38ceb79fef03 198 }
kevman 0:38ceb79fef03 199
kevman 0:38ceb79fef03 200 #if !(DOXYGEN_ONLY)
kevman 0:38ceb79fef03 201 protected:
kevman 0:38ceb79fef03 202 /** Lock deep sleep only if it is not yet locked */
kevman 0:38ceb79fef03 203 void lock_deep_sleep()
kevman 0:38ceb79fef03 204 {
kevman 0:38ceb79fef03 205 if (_deep_sleep_locked == false) {
kevman 0:38ceb79fef03 206 sleep_manager_lock_deep_sleep();
kevman 0:38ceb79fef03 207 _deep_sleep_locked = true;
kevman 0:38ceb79fef03 208 }
kevman 0:38ceb79fef03 209 }
kevman 0:38ceb79fef03 210
kevman 0:38ceb79fef03 211 /** Unlock deep sleep in case it is locked */
kevman 0:38ceb79fef03 212 void unlock_deep_sleep()
kevman 0:38ceb79fef03 213 {
kevman 0:38ceb79fef03 214 if (_deep_sleep_locked == true) {
kevman 0:38ceb79fef03 215 sleep_manager_unlock_deep_sleep();
kevman 0:38ceb79fef03 216 _deep_sleep_locked = false;
kevman 0:38ceb79fef03 217 }
kevman 0:38ceb79fef03 218 }
kevman 0:38ceb79fef03 219
kevman 0:38ceb79fef03 220 pwmout_t _pwm;
kevman 0:38ceb79fef03 221 bool _deep_sleep_locked;
kevman 0:38ceb79fef03 222 #endif
kevman 0:38ceb79fef03 223 };
kevman 0:38ceb79fef03 224
kevman 0:38ceb79fef03 225 } // namespace mbed
kevman 0:38ceb79fef03 226
kevman 0:38ceb79fef03 227 #endif
kevman 0:38ceb79fef03 228
kevman 0:38ceb79fef03 229 #endif