mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
Anna Bridge
Date:
Fri Jun 22 16:45:37 2018 +0100
Revision:
186:707f6e361f3e
Parent:
184:08ed48f1de7f
Child:
187:0387e8f68319
mbed-dev library. Release version 162

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 184:08ed48f1de7f 1 /** \addtogroup platform */
AnnaBridge 184:08ed48f1de7f 2 /** @{*/
AnnaBridge 184:08ed48f1de7f 3 /**
AnnaBridge 184:08ed48f1de7f 4 * \defgroup platform_power_mgmt Power management functions
AnnaBridge 184:08ed48f1de7f 5 * @{
AnnaBridge 184:08ed48f1de7f 6 */
AnnaBridge 184:08ed48f1de7f 7
AnnaBridge 184:08ed48f1de7f 8 /* mbed Microcontroller Library
AnnaBridge 184:08ed48f1de7f 9 * Copyright (c) 2006-2018 ARM Limited
AnnaBridge 184:08ed48f1de7f 10 *
AnnaBridge 184:08ed48f1de7f 11 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 184:08ed48f1de7f 12 * you may not use this file except in compliance with the License.
AnnaBridge 184:08ed48f1de7f 13 * You may obtain a copy of the License at
AnnaBridge 184:08ed48f1de7f 14 *
AnnaBridge 184:08ed48f1de7f 15 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 184:08ed48f1de7f 16 *
AnnaBridge 184:08ed48f1de7f 17 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 184:08ed48f1de7f 18 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 184:08ed48f1de7f 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 184:08ed48f1de7f 20 * See the License for the specific language governing permissions and
AnnaBridge 184:08ed48f1de7f 21 * limitations under the License.
AnnaBridge 184:08ed48f1de7f 22 */
AnnaBridge 184:08ed48f1de7f 23 #ifndef MBED_POWER_MGMT_H
AnnaBridge 184:08ed48f1de7f 24 #define MBED_POWER_MGMT_H
AnnaBridge 184:08ed48f1de7f 25
AnnaBridge 184:08ed48f1de7f 26 #include "sleep_api.h"
AnnaBridge 184:08ed48f1de7f 27 #include "mbed_toolchain.h"
Anna Bridge 186:707f6e361f3e 28 #include "hal/ticker_api.h"
AnnaBridge 184:08ed48f1de7f 29 #include <stdbool.h>
AnnaBridge 184:08ed48f1de7f 30
AnnaBridge 184:08ed48f1de7f 31 #ifdef __cplusplus
AnnaBridge 184:08ed48f1de7f 32 extern "C" {
AnnaBridge 184:08ed48f1de7f 33 #endif
AnnaBridge 184:08ed48f1de7f 34
AnnaBridge 184:08ed48f1de7f 35 /** Sleep manager API
AnnaBridge 184:08ed48f1de7f 36 * The sleep manager provides API to automatically select sleep mode.
AnnaBridge 184:08ed48f1de7f 37 *
AnnaBridge 184:08ed48f1de7f 38 * There are two sleep modes:
AnnaBridge 184:08ed48f1de7f 39 * - sleep
AnnaBridge 184:08ed48f1de7f 40 * - deepsleep
AnnaBridge 184:08ed48f1de7f 41 *
AnnaBridge 184:08ed48f1de7f 42 * Use locking/unlocking deepsleep for drivers that depend on features that
AnnaBridge 184:08ed48f1de7f 43 * are not allowed (=disabled) during the deepsleep. For instance, high frequency
AnnaBridge 184:08ed48f1de7f 44 * clocks.
AnnaBridge 184:08ed48f1de7f 45 *
AnnaBridge 184:08ed48f1de7f 46 * Example:
AnnaBridge 184:08ed48f1de7f 47 * @code
AnnaBridge 184:08ed48f1de7f 48 *
AnnaBridge 184:08ed48f1de7f 49 * void driver::handler()
AnnaBridge 184:08ed48f1de7f 50 * {
AnnaBridge 184:08ed48f1de7f 51 * if (_sensor.get_event()) {
AnnaBridge 184:08ed48f1de7f 52 * // any event - we are finished, unlock the deepsleep
AnnaBridge 184:08ed48f1de7f 53 * sleep_manager_unlock_deep_sleep();
AnnaBridge 184:08ed48f1de7f 54 * _callback();
AnnaBridge 184:08ed48f1de7f 55 * }
AnnaBridge 184:08ed48f1de7f 56 * }
AnnaBridge 184:08ed48f1de7f 57 *
AnnaBridge 184:08ed48f1de7f 58 * int driver::measure(event_t event, callback_t& callback)
AnnaBridge 184:08ed48f1de7f 59 * {
AnnaBridge 184:08ed48f1de7f 60 * _callback = callback;
AnnaBridge 184:08ed48f1de7f 61 * sleep_manager_lock_deep_sleep();
AnnaBridge 184:08ed48f1de7f 62 * // start async transaction, we are waiting for an event
AnnaBridge 184:08ed48f1de7f 63 * return _sensor.start(event, callback);
AnnaBridge 184:08ed48f1de7f 64 * }
AnnaBridge 184:08ed48f1de7f 65 * @endcode
AnnaBridge 184:08ed48f1de7f 66 */
AnnaBridge 184:08ed48f1de7f 67 #ifdef MBED_SLEEP_TRACING_ENABLED
AnnaBridge 184:08ed48f1de7f 68
AnnaBridge 184:08ed48f1de7f 69 void sleep_tracker_lock(const char *const filename, int line);
AnnaBridge 184:08ed48f1de7f 70 void sleep_tracker_unlock(const char *const filename, int line);
AnnaBridge 184:08ed48f1de7f 71
AnnaBridge 184:08ed48f1de7f 72 #define sleep_manager_lock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 73 do \
AnnaBridge 184:08ed48f1de7f 74 { \
AnnaBridge 184:08ed48f1de7f 75 sleep_manager_lock_deep_sleep_internal(); \
AnnaBridge 184:08ed48f1de7f 76 sleep_tracker_lock(MBED_FILENAME, __LINE__); \
AnnaBridge 184:08ed48f1de7f 77 } while (0);
AnnaBridge 184:08ed48f1de7f 78
AnnaBridge 184:08ed48f1de7f 79 #define sleep_manager_unlock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 80 do \
AnnaBridge 184:08ed48f1de7f 81 { \
AnnaBridge 184:08ed48f1de7f 82 sleep_manager_unlock_deep_sleep_internal(); \
AnnaBridge 184:08ed48f1de7f 83 sleep_tracker_unlock(MBED_FILENAME, __LINE__); \
AnnaBridge 184:08ed48f1de7f 84 } while (0);
AnnaBridge 184:08ed48f1de7f 85
AnnaBridge 184:08ed48f1de7f 86 #else
AnnaBridge 184:08ed48f1de7f 87
AnnaBridge 184:08ed48f1de7f 88 #define sleep_manager_lock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 89 sleep_manager_lock_deep_sleep_internal()
AnnaBridge 184:08ed48f1de7f 90
AnnaBridge 184:08ed48f1de7f 91 #define sleep_manager_unlock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 92 sleep_manager_unlock_deep_sleep_internal()
AnnaBridge 184:08ed48f1de7f 93
AnnaBridge 184:08ed48f1de7f 94 #endif // MBED_SLEEP_TRACING_ENABLED
AnnaBridge 184:08ed48f1de7f 95
AnnaBridge 184:08ed48f1de7f 96 /** Lock the deep sleep mode
AnnaBridge 184:08ed48f1de7f 97 *
AnnaBridge 184:08ed48f1de7f 98 * This locks the automatic deep mode selection.
AnnaBridge 184:08ed48f1de7f 99 * sleep_manager_sleep_auto() will ignore deepsleep mode if
AnnaBridge 184:08ed48f1de7f 100 * this function is invoked at least once (the internal counter is non-zero)
AnnaBridge 184:08ed48f1de7f 101 *
AnnaBridge 184:08ed48f1de7f 102 * Use this locking mechanism for interrupt driven API that are
AnnaBridge 184:08ed48f1de7f 103 * running in the background and deepsleep could affect their functionality
AnnaBridge 184:08ed48f1de7f 104 *
AnnaBridge 184:08ed48f1de7f 105 * The lock is a counter, can be locked up to USHRT_MAX
AnnaBridge 184:08ed48f1de7f 106 * This function is IRQ and thread safe
AnnaBridge 184:08ed48f1de7f 107 */
AnnaBridge 184:08ed48f1de7f 108 void sleep_manager_lock_deep_sleep_internal(void);
AnnaBridge 184:08ed48f1de7f 109
AnnaBridge 184:08ed48f1de7f 110 /** Unlock the deep sleep mode
AnnaBridge 184:08ed48f1de7f 111 *
AnnaBridge 184:08ed48f1de7f 112 * Use unlocking in pair with sleep_manager_lock_deep_sleep().
AnnaBridge 184:08ed48f1de7f 113 *
AnnaBridge 184:08ed48f1de7f 114 * The lock is a counter, should be equally unlocked as locked
AnnaBridge 184:08ed48f1de7f 115 * This function is IRQ and thread safe
AnnaBridge 184:08ed48f1de7f 116 */
AnnaBridge 184:08ed48f1de7f 117 void sleep_manager_unlock_deep_sleep_internal(void);
AnnaBridge 184:08ed48f1de7f 118
AnnaBridge 184:08ed48f1de7f 119 /** Get the status of deep sleep allowance for a target
AnnaBridge 184:08ed48f1de7f 120 *
AnnaBridge 184:08ed48f1de7f 121 * @return true if a target can go to deepsleep, false otherwise
AnnaBridge 184:08ed48f1de7f 122 */
AnnaBridge 184:08ed48f1de7f 123 bool sleep_manager_can_deep_sleep(void);
AnnaBridge 184:08ed48f1de7f 124
AnnaBridge 184:08ed48f1de7f 125 /** Enter auto selected sleep mode. It chooses the sleep or deeepsleep modes based
AnnaBridge 184:08ed48f1de7f 126 * on the deepsleep locking counter
AnnaBridge 184:08ed48f1de7f 127 *
AnnaBridge 184:08ed48f1de7f 128 * This function is IRQ and thread safe
AnnaBridge 184:08ed48f1de7f 129 *
AnnaBridge 184:08ed48f1de7f 130 * @note
AnnaBridge 184:08ed48f1de7f 131 * If MBED_DEBUG is defined, only hal_sleep is allowed. This ensures the debugger
AnnaBridge 184:08ed48f1de7f 132 * to be active for debug modes.
AnnaBridge 184:08ed48f1de7f 133 *
AnnaBridge 184:08ed48f1de7f 134 */
AnnaBridge 184:08ed48f1de7f 135 void sleep_manager_sleep_auto(void);
AnnaBridge 184:08ed48f1de7f 136
AnnaBridge 184:08ed48f1de7f 137 /** Send the microcontroller to sleep
AnnaBridge 184:08ed48f1de7f 138 *
AnnaBridge 184:08ed48f1de7f 139 * @note This function can be a noop if not implemented by the platform.
AnnaBridge 184:08ed48f1de7f 140 * @note This function will be a noop in debug mode (debug build profile when MBED_DEBUG is defined).
AnnaBridge 184:08ed48f1de7f 141 * @note This function will be a noop while uVisor is in use.
AnnaBridge 184:08ed48f1de7f 142 * @note This function will be a noop if the following conditions are met:
AnnaBridge 184:08ed48f1de7f 143 * - The RTOS is present
AnnaBridge 184:08ed48f1de7f 144 * - The processor turn off the Systick clock during sleep
AnnaBridge 184:08ed48f1de7f 145 * - The target does not implement tickless mode
AnnaBridge 184:08ed48f1de7f 146 *
AnnaBridge 184:08ed48f1de7f 147 * The processor is setup ready for sleep, and sent to sleep using __WFI(). In this mode, the
AnnaBridge 184:08ed48f1de7f 148 * system clock to the core is stopped until a reset or an interrupt occurs. This eliminates
AnnaBridge 184:08ed48f1de7f 149 * dynamic power used by the processor, memory systems and buses. The processor, peripheral and
AnnaBridge 184:08ed48f1de7f 150 * memory state are maintained, and the peripherals continue to work and can generate interrupts.
AnnaBridge 184:08ed48f1de7f 151 *
AnnaBridge 184:08ed48f1de7f 152 * The processor can be woken up by any internal peripheral interrupt or external pin interrupt.
AnnaBridge 184:08ed48f1de7f 153 *
AnnaBridge 184:08ed48f1de7f 154 * @note
AnnaBridge 184:08ed48f1de7f 155 * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored.
AnnaBridge 184:08ed48f1de7f 156 * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be
AnnaBridge 184:08ed48f1de7f 157 * able to access the LocalFileSystem
AnnaBridge 184:08ed48f1de7f 158 */
AnnaBridge 184:08ed48f1de7f 159 static inline void sleep(void)
AnnaBridge 184:08ed48f1de7f 160 {
AnnaBridge 184:08ed48f1de7f 161 #if !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED))
AnnaBridge 184:08ed48f1de7f 162 #if DEVICE_SLEEP
AnnaBridge 184:08ed48f1de7f 163 #if (MBED_CONF_RTOS_PRESENT == 0) || (DEVICE_STCLK_OFF_DURING_SLEEP == 0) || defined(MBED_TICKLESS)
AnnaBridge 184:08ed48f1de7f 164 sleep_manager_sleep_auto();
AnnaBridge 184:08ed48f1de7f 165 #endif /* (MBED_CONF_RTOS_PRESENT == 0) || (DEVICE_STCLK_OFF_DURING_SLEEP == 0) || defined(MBED_TICKLESS) */
AnnaBridge 184:08ed48f1de7f 166 #endif /* DEVICE_SLEEP */
AnnaBridge 184:08ed48f1de7f 167 #endif /* !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED)) */
AnnaBridge 184:08ed48f1de7f 168 }
AnnaBridge 184:08ed48f1de7f 169
AnnaBridge 184:08ed48f1de7f 170 /** Send the microcontroller to deep sleep
AnnaBridge 184:08ed48f1de7f 171 *
AnnaBridge 184:08ed48f1de7f 172 * @deprecated
AnnaBridge 184:08ed48f1de7f 173 * Do not use this function. Applications should use sleep() API which puts the system in deepsleep mode if supported.
AnnaBridge 184:08ed48f1de7f 174 *
AnnaBridge 184:08ed48f1de7f 175 * @note This function can be a noop if not implemented by the platform.
AnnaBridge 184:08ed48f1de7f 176 * @note This function will be a noop in debug mode (debug build profile when MBED_DEBUG is defined)
AnnaBridge 184:08ed48f1de7f 177 * @note This function will be a noop while uVisor is in use.
AnnaBridge 184:08ed48f1de7f 178 *
AnnaBridge 184:08ed48f1de7f 179 * This processor is setup ready for deep sleep, and sent to sleep. This mode
AnnaBridge 184:08ed48f1de7f 180 * has the same sleep features as sleep plus it powers down peripherals and clocks. All state
AnnaBridge 184:08ed48f1de7f 181 * is still maintained.
AnnaBridge 184:08ed48f1de7f 182 *
AnnaBridge 184:08ed48f1de7f 183 * The processor can only be woken up by an external interrupt on a pin or a watchdog timer.
AnnaBridge 184:08ed48f1de7f 184 *
AnnaBridge 184:08ed48f1de7f 185 * @note
AnnaBridge 184:08ed48f1de7f 186 * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored.
AnnaBridge 184:08ed48f1de7f 187 * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be
AnnaBridge 184:08ed48f1de7f 188 * able to access the LocalFileSystem
AnnaBridge 184:08ed48f1de7f 189 */
AnnaBridge 184:08ed48f1de7f 190
AnnaBridge 184:08ed48f1de7f 191 MBED_DEPRECATED_SINCE("mbed-os-5.6", "One entry point for an application, use sleep()")
AnnaBridge 184:08ed48f1de7f 192 static inline void deepsleep(void)
AnnaBridge 184:08ed48f1de7f 193 {
AnnaBridge 184:08ed48f1de7f 194 #if !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED))
AnnaBridge 184:08ed48f1de7f 195 #if DEVICE_SLEEP
AnnaBridge 184:08ed48f1de7f 196 sleep_manager_sleep_auto();
AnnaBridge 184:08ed48f1de7f 197 #endif /* DEVICE_SLEEP */
AnnaBridge 184:08ed48f1de7f 198 #endif /* !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED)) */
AnnaBridge 184:08ed48f1de7f 199 }
AnnaBridge 184:08ed48f1de7f 200
AnnaBridge 184:08ed48f1de7f 201 /** Resets the processor and most of the sub-system
AnnaBridge 184:08ed48f1de7f 202 *
AnnaBridge 184:08ed48f1de7f 203 * @note Does not affect the debug sub-system
AnnaBridge 184:08ed48f1de7f 204 */
AnnaBridge 184:08ed48f1de7f 205 static inline void system_reset(void)
AnnaBridge 184:08ed48f1de7f 206 {
AnnaBridge 184:08ed48f1de7f 207 NVIC_SystemReset();
AnnaBridge 184:08ed48f1de7f 208 }
Anna Bridge 186:707f6e361f3e 209
Anna Bridge 186:707f6e361f3e 210 /** Provides the time spent in sleep mode since boot.
Anna Bridge 186:707f6e361f3e 211 *
Anna Bridge 186:707f6e361f3e 212 * @return Time spent in sleep
Anna Bridge 186:707f6e361f3e 213 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 214 */
Anna Bridge 186:707f6e361f3e 215 us_timestamp_t mbed_time_sleep(void);
Anna Bridge 186:707f6e361f3e 216
Anna Bridge 186:707f6e361f3e 217 /** Provides the time spent in deep sleep mode since boot.
Anna Bridge 186:707f6e361f3e 218 *
Anna Bridge 186:707f6e361f3e 219 * @return Time spent in deep sleep
Anna Bridge 186:707f6e361f3e 220 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 221 */
Anna Bridge 186:707f6e361f3e 222 us_timestamp_t mbed_time_deepsleep(void);
Anna Bridge 186:707f6e361f3e 223
Anna Bridge 186:707f6e361f3e 224 /** Provides the time spent in idle mode since boot.
Anna Bridge 186:707f6e361f3e 225 *
Anna Bridge 186:707f6e361f3e 226 * @return Idle thread time.
Anna Bridge 186:707f6e361f3e 227 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 228 */
Anna Bridge 186:707f6e361f3e 229 us_timestamp_t mbed_time_idle(void);
Anna Bridge 186:707f6e361f3e 230
Anna Bridge 186:707f6e361f3e 231 /** Provides the time since the system is up i.e. boot.
Anna Bridge 186:707f6e361f3e 232 *
Anna Bridge 186:707f6e361f3e 233 * @return System uptime.
Anna Bridge 186:707f6e361f3e 234 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 235 */
Anna Bridge 186:707f6e361f3e 236 us_timestamp_t mbed_uptime(void);
AnnaBridge 184:08ed48f1de7f 237
AnnaBridge 184:08ed48f1de7f 238 #ifdef __cplusplus
AnnaBridge 184:08ed48f1de7f 239 }
AnnaBridge 184:08ed48f1de7f 240 #endif
AnnaBridge 184:08ed48f1de7f 241
AnnaBridge 184:08ed48f1de7f 242 #endif
AnnaBridge 184:08ed48f1de7f 243
AnnaBridge 184:08ed48f1de7f 244 /** @}*/
AnnaBridge 184:08ed48f1de7f 245 /** @}*/