mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Thu Nov 08 11:46:34 2018 +0000
Revision:
188:bcfe06ba3d64
Parent:
187:0387e8f68319
Child:
189:f392fc9709a3
mbed-dev library. Release version 164

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 188:bcfe06ba3d64 26 #include "hal/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 188:bcfe06ba3d64 35 /**
AnnaBridge 188:bcfe06ba3d64 36 * @defgroup hal_sleep_manager Sleep manager API
AnnaBridge 184:08ed48f1de7f 37 * The sleep manager provides API to automatically select sleep mode.
AnnaBridge 184:08ed48f1de7f 38 *
AnnaBridge 184:08ed48f1de7f 39 * There are two sleep modes:
AnnaBridge 184:08ed48f1de7f 40 * - sleep
AnnaBridge 184:08ed48f1de7f 41 * - deepsleep
AnnaBridge 184:08ed48f1de7f 42 *
AnnaBridge 184:08ed48f1de7f 43 * Use locking/unlocking deepsleep for drivers that depend on features that
AnnaBridge 184:08ed48f1de7f 44 * are not allowed (=disabled) during the deepsleep. For instance, high frequency
AnnaBridge 184:08ed48f1de7f 45 * clocks.
AnnaBridge 184:08ed48f1de7f 46 *
AnnaBridge 188:bcfe06ba3d64 47 * # Defined behavior
AnnaBridge 188:bcfe06ba3d64 48 * * The lock is a counter
AnnaBridge 188:bcfe06ba3d64 49 * * The lock can be locked up to USHRT_MAX - Verified by ::test_lock_eq_ushrt_max and ::test_lock_gt_ushrt_max
AnnaBridge 188:bcfe06ba3d64 50 * * The lock has to be equally unlocked as locked - Verified by ::test_lone_unlock and ::test_lock_eq_ushrt_max
AnnaBridge 188:bcfe06ba3d64 51 * * The function sleep_manager_lock_deep_sleep_internal() locks the automatic deep mode selection - Verified by ::test_lock_unlock
AnnaBridge 188:bcfe06ba3d64 52 * * The function sleep_manager_unlock_deep_sleep_internal() unlocks the automatic deep mode selection - Verified by ::test_lock_unlock
AnnaBridge 188:bcfe06ba3d64 53 * * The function sleep_manager_sleep_auto() chooses the sleep or deep sleep modes based on the lock - Verified by ::test_sleep_auto
AnnaBridge 188:bcfe06ba3d64 54 * * The function sleep_manager_lock_deep_sleep_internal() is IRQ and thread safe - Verified by ::sleep_manager_multithread_test and ::sleep_manager_irq_test
AnnaBridge 188:bcfe06ba3d64 55 * * The function sleep_manager_unlock_deep_sleep_internal() is IRQ and thread safe - Verified by ::sleep_manager_multithread_test and ::sleep_manager_irq_test
AnnaBridge 188:bcfe06ba3d64 56 * * The function sleep_manager_sleep_auto() is IRQ and thread safe
AnnaBridge 188:bcfe06ba3d64 57 *
AnnaBridge 184:08ed48f1de7f 58 * Example:
AnnaBridge 184:08ed48f1de7f 59 * @code
AnnaBridge 184:08ed48f1de7f 60 *
AnnaBridge 184:08ed48f1de7f 61 * void driver::handler()
AnnaBridge 184:08ed48f1de7f 62 * {
AnnaBridge 184:08ed48f1de7f 63 * if (_sensor.get_event()) {
AnnaBridge 184:08ed48f1de7f 64 * // any event - we are finished, unlock the deepsleep
AnnaBridge 184:08ed48f1de7f 65 * sleep_manager_unlock_deep_sleep();
AnnaBridge 184:08ed48f1de7f 66 * _callback();
AnnaBridge 184:08ed48f1de7f 67 * }
AnnaBridge 184:08ed48f1de7f 68 * }
AnnaBridge 184:08ed48f1de7f 69 *
AnnaBridge 184:08ed48f1de7f 70 * int driver::measure(event_t event, callback_t& callback)
AnnaBridge 184:08ed48f1de7f 71 * {
AnnaBridge 184:08ed48f1de7f 72 * _callback = callback;
AnnaBridge 184:08ed48f1de7f 73 * sleep_manager_lock_deep_sleep();
AnnaBridge 184:08ed48f1de7f 74 * // start async transaction, we are waiting for an event
AnnaBridge 184:08ed48f1de7f 75 * return _sensor.start(event, callback);
AnnaBridge 184:08ed48f1de7f 76 * }
AnnaBridge 184:08ed48f1de7f 77 * @endcode
AnnaBridge 188:bcfe06ba3d64 78 * @{
AnnaBridge 184:08ed48f1de7f 79 */
AnnaBridge 188:bcfe06ba3d64 80
AnnaBridge 188:bcfe06ba3d64 81 /**
AnnaBridge 188:bcfe06ba3d64 82 * @defgroup hal_sleep_manager_tests Sleep manager API tests
AnnaBridge 188:bcfe06ba3d64 83 * Tests to validate the proper implementation of the sleep manager
AnnaBridge 188:bcfe06ba3d64 84 *
AnnaBridge 188:bcfe06ba3d64 85 * To run the sleep manager hal tests use the command:
AnnaBridge 188:bcfe06ba3d64 86 *
AnnaBridge 188:bcfe06ba3d64 87 * mbed test -t <toolchain> -m <target> -n tests-mbed_hal-sleep_manager*
AnnaBridge 188:bcfe06ba3d64 88 *
AnnaBridge 188:bcfe06ba3d64 89 */
AnnaBridge 188:bcfe06ba3d64 90
AnnaBridge 184:08ed48f1de7f 91 #ifdef MBED_SLEEP_TRACING_ENABLED
AnnaBridge 184:08ed48f1de7f 92
AnnaBridge 184:08ed48f1de7f 93 void sleep_tracker_lock(const char *const filename, int line);
AnnaBridge 184:08ed48f1de7f 94 void sleep_tracker_unlock(const char *const filename, int line);
AnnaBridge 184:08ed48f1de7f 95
AnnaBridge 184:08ed48f1de7f 96 #define sleep_manager_lock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 97 do \
AnnaBridge 184:08ed48f1de7f 98 { \
AnnaBridge 184:08ed48f1de7f 99 sleep_manager_lock_deep_sleep_internal(); \
AnnaBridge 184:08ed48f1de7f 100 sleep_tracker_lock(MBED_FILENAME, __LINE__); \
AnnaBridge 184:08ed48f1de7f 101 } while (0);
AnnaBridge 184:08ed48f1de7f 102
AnnaBridge 184:08ed48f1de7f 103 #define sleep_manager_unlock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 104 do \
AnnaBridge 184:08ed48f1de7f 105 { \
AnnaBridge 184:08ed48f1de7f 106 sleep_manager_unlock_deep_sleep_internal(); \
AnnaBridge 184:08ed48f1de7f 107 sleep_tracker_unlock(MBED_FILENAME, __LINE__); \
AnnaBridge 184:08ed48f1de7f 108 } while (0);
AnnaBridge 184:08ed48f1de7f 109
AnnaBridge 184:08ed48f1de7f 110 #else
AnnaBridge 184:08ed48f1de7f 111
AnnaBridge 184:08ed48f1de7f 112 #define sleep_manager_lock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 113 sleep_manager_lock_deep_sleep_internal()
AnnaBridge 184:08ed48f1de7f 114
AnnaBridge 184:08ed48f1de7f 115 #define sleep_manager_unlock_deep_sleep() \
AnnaBridge 184:08ed48f1de7f 116 sleep_manager_unlock_deep_sleep_internal()
AnnaBridge 184:08ed48f1de7f 117
AnnaBridge 184:08ed48f1de7f 118 #endif // MBED_SLEEP_TRACING_ENABLED
AnnaBridge 184:08ed48f1de7f 119
AnnaBridge 184:08ed48f1de7f 120 /** Lock the deep sleep mode
AnnaBridge 184:08ed48f1de7f 121 *
AnnaBridge 184:08ed48f1de7f 122 * This locks the automatic deep mode selection.
AnnaBridge 184:08ed48f1de7f 123 * sleep_manager_sleep_auto() will ignore deepsleep mode if
AnnaBridge 184:08ed48f1de7f 124 * this function is invoked at least once (the internal counter is non-zero)
AnnaBridge 184:08ed48f1de7f 125 *
AnnaBridge 184:08ed48f1de7f 126 * Use this locking mechanism for interrupt driven API that are
AnnaBridge 184:08ed48f1de7f 127 * running in the background and deepsleep could affect their functionality
AnnaBridge 184:08ed48f1de7f 128 *
AnnaBridge 184:08ed48f1de7f 129 * The lock is a counter, can be locked up to USHRT_MAX
AnnaBridge 184:08ed48f1de7f 130 * This function is IRQ and thread safe
AnnaBridge 184:08ed48f1de7f 131 */
AnnaBridge 184:08ed48f1de7f 132 void sleep_manager_lock_deep_sleep_internal(void);
AnnaBridge 184:08ed48f1de7f 133
AnnaBridge 184:08ed48f1de7f 134 /** Unlock the deep sleep mode
AnnaBridge 184:08ed48f1de7f 135 *
AnnaBridge 184:08ed48f1de7f 136 * Use unlocking in pair with sleep_manager_lock_deep_sleep().
AnnaBridge 184:08ed48f1de7f 137 *
AnnaBridge 184:08ed48f1de7f 138 * The lock is a counter, should be equally unlocked as locked
AnnaBridge 184:08ed48f1de7f 139 * This function is IRQ and thread safe
AnnaBridge 184:08ed48f1de7f 140 */
AnnaBridge 184:08ed48f1de7f 141 void sleep_manager_unlock_deep_sleep_internal(void);
AnnaBridge 184:08ed48f1de7f 142
AnnaBridge 184:08ed48f1de7f 143 /** Get the status of deep sleep allowance for a target
AnnaBridge 184:08ed48f1de7f 144 *
AnnaBridge 184:08ed48f1de7f 145 * @return true if a target can go to deepsleep, false otherwise
AnnaBridge 184:08ed48f1de7f 146 */
AnnaBridge 184:08ed48f1de7f 147 bool sleep_manager_can_deep_sleep(void);
AnnaBridge 184:08ed48f1de7f 148
AnnaBridge 188:bcfe06ba3d64 149 /** Check if the target can deep sleep within a period of time
AnnaBridge 188:bcfe06ba3d64 150 *
AnnaBridge 188:bcfe06ba3d64 151 * This function in intended for use in testing. The amount
AnnaBridge 188:bcfe06ba3d64 152 * of time this functions waits for deeps sleep to be available
AnnaBridge 188:bcfe06ba3d64 153 * is currently 2ms. This may change in the future depending
AnnaBridge 188:bcfe06ba3d64 154 * on testing requirements.
AnnaBridge 188:bcfe06ba3d64 155 *
AnnaBridge 188:bcfe06ba3d64 156 * @return true if a target can go to deepsleep, false otherwise
AnnaBridge 188:bcfe06ba3d64 157 */
AnnaBridge 188:bcfe06ba3d64 158 bool sleep_manager_can_deep_sleep_test_check(void);
AnnaBridge 188:bcfe06ba3d64 159
AnnaBridge 188:bcfe06ba3d64 160 /** Enter auto selected sleep mode. It chooses the sleep or deepsleep modes based
AnnaBridge 184:08ed48f1de7f 161 * on the deepsleep locking counter
AnnaBridge 184:08ed48f1de7f 162 *
AnnaBridge 184:08ed48f1de7f 163 * This function is IRQ and thread safe
AnnaBridge 184:08ed48f1de7f 164 *
AnnaBridge 184:08ed48f1de7f 165 * @note
AnnaBridge 184:08ed48f1de7f 166 * If MBED_DEBUG is defined, only hal_sleep is allowed. This ensures the debugger
AnnaBridge 184:08ed48f1de7f 167 * to be active for debug modes.
AnnaBridge 184:08ed48f1de7f 168 *
AnnaBridge 184:08ed48f1de7f 169 */
AnnaBridge 184:08ed48f1de7f 170 void sleep_manager_sleep_auto(void);
AnnaBridge 184:08ed48f1de7f 171
AnnaBridge 184:08ed48f1de7f 172 /** Send the microcontroller to sleep
AnnaBridge 184:08ed48f1de7f 173 *
AnnaBridge 184:08ed48f1de7f 174 * @note This function can be a noop if not implemented by the platform.
AnnaBridge 184:08ed48f1de7f 175 * @note This function will be a noop in debug mode (debug build profile when MBED_DEBUG is defined).
AnnaBridge 184:08ed48f1de7f 176 * @note This function will be a noop if the following conditions are met:
AnnaBridge 184:08ed48f1de7f 177 * - The RTOS is present
AnnaBridge 184:08ed48f1de7f 178 * - The processor turn off the Systick clock during sleep
AnnaBridge 184:08ed48f1de7f 179 * - The target does not implement tickless mode
AnnaBridge 184:08ed48f1de7f 180 *
AnnaBridge 184:08ed48f1de7f 181 * The processor is setup ready for sleep, and sent to sleep using __WFI(). In this mode, the
AnnaBridge 184:08ed48f1de7f 182 * system clock to the core is stopped until a reset or an interrupt occurs. This eliminates
AnnaBridge 184:08ed48f1de7f 183 * dynamic power used by the processor, memory systems and buses. The processor, peripheral and
AnnaBridge 184:08ed48f1de7f 184 * memory state are maintained, and the peripherals continue to work and can generate interrupts.
AnnaBridge 184:08ed48f1de7f 185 *
AnnaBridge 184:08ed48f1de7f 186 * The processor can be woken up by any internal peripheral interrupt or external pin interrupt.
AnnaBridge 184:08ed48f1de7f 187 *
AnnaBridge 184:08ed48f1de7f 188 * @note
AnnaBridge 184:08ed48f1de7f 189 * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored.
AnnaBridge 184:08ed48f1de7f 190 * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be
AnnaBridge 184:08ed48f1de7f 191 * able to access the LocalFileSystem
AnnaBridge 184:08ed48f1de7f 192 */
AnnaBridge 184:08ed48f1de7f 193 static inline void sleep(void)
AnnaBridge 184:08ed48f1de7f 194 {
AnnaBridge 184:08ed48f1de7f 195 #if DEVICE_SLEEP
AnnaBridge 188:bcfe06ba3d64 196 #if (MBED_CONF_RTOS_PRESENT == 0) || (DEVICE_SYSTICK_CLK_OFF_DURING_SLEEP == 0) || defined(MBED_TICKLESS)
AnnaBridge 184:08ed48f1de7f 197 sleep_manager_sleep_auto();
AnnaBridge 188:bcfe06ba3d64 198 #endif /* (MBED_CONF_RTOS_PRESENT == 0) || (DEVICE_SYSTICK_CLK_OFF_DURING_SLEEP == 0) || defined(MBED_TICKLESS) */
AnnaBridge 184:08ed48f1de7f 199 #endif /* DEVICE_SLEEP */
AnnaBridge 184:08ed48f1de7f 200 }
AnnaBridge 184:08ed48f1de7f 201
AnnaBridge 184:08ed48f1de7f 202 /** Send the microcontroller to deep sleep
AnnaBridge 184:08ed48f1de7f 203 *
AnnaBridge 184:08ed48f1de7f 204 * @deprecated
AnnaBridge 187:0387e8f68319 205 * Do not use this function. Applications should use sleep() API which puts the system in deepsleep mode if supported.
AnnaBridge 184:08ed48f1de7f 206 *
AnnaBridge 184:08ed48f1de7f 207 * @note This function can be a noop if not implemented by the platform.
AnnaBridge 184:08ed48f1de7f 208 * @note This function will be a noop in debug mode (debug build profile when MBED_DEBUG is defined)
AnnaBridge 184:08ed48f1de7f 209 *
AnnaBridge 184:08ed48f1de7f 210 * This processor is setup ready for deep sleep, and sent to sleep. This mode
AnnaBridge 184:08ed48f1de7f 211 * has the same sleep features as sleep plus it powers down peripherals and clocks. All state
AnnaBridge 184:08ed48f1de7f 212 * is still maintained.
AnnaBridge 184:08ed48f1de7f 213 *
AnnaBridge 184:08ed48f1de7f 214 * The processor can only be woken up by an external interrupt on a pin or a watchdog timer.
AnnaBridge 184:08ed48f1de7f 215 *
AnnaBridge 184:08ed48f1de7f 216 * @note
AnnaBridge 184:08ed48f1de7f 217 * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored.
AnnaBridge 184:08ed48f1de7f 218 * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be
AnnaBridge 184:08ed48f1de7f 219 * able to access the LocalFileSystem
AnnaBridge 184:08ed48f1de7f 220 */
AnnaBridge 184:08ed48f1de7f 221
AnnaBridge 184:08ed48f1de7f 222 MBED_DEPRECATED_SINCE("mbed-os-5.6", "One entry point for an application, use sleep()")
AnnaBridge 184:08ed48f1de7f 223 static inline void deepsleep(void)
AnnaBridge 184:08ed48f1de7f 224 {
AnnaBridge 184:08ed48f1de7f 225 #if DEVICE_SLEEP
AnnaBridge 184:08ed48f1de7f 226 sleep_manager_sleep_auto();
AnnaBridge 184:08ed48f1de7f 227 #endif /* DEVICE_SLEEP */
AnnaBridge 184:08ed48f1de7f 228 }
AnnaBridge 187:0387e8f68319 229
Anna Bridge 186:707f6e361f3e 230 /** Provides the time spent in sleep mode since boot.
Anna Bridge 186:707f6e361f3e 231 *
Anna Bridge 186:707f6e361f3e 232 * @return Time spent in sleep
Anna Bridge 186:707f6e361f3e 233 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 234 */
Anna Bridge 186:707f6e361f3e 235 us_timestamp_t mbed_time_sleep(void);
Anna Bridge 186:707f6e361f3e 236
Anna Bridge 186:707f6e361f3e 237 /** Provides the time spent in deep sleep mode since boot.
Anna Bridge 186:707f6e361f3e 238 *
Anna Bridge 186:707f6e361f3e 239 * @return Time spent in deep sleep
Anna Bridge 186:707f6e361f3e 240 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 241 */
Anna Bridge 186:707f6e361f3e 242 us_timestamp_t mbed_time_deepsleep(void);
Anna Bridge 186:707f6e361f3e 243
Anna Bridge 186:707f6e361f3e 244 /** Provides the time spent in idle mode since boot.
Anna Bridge 186:707f6e361f3e 245 *
Anna Bridge 186:707f6e361f3e 246 * @return Idle thread time.
Anna Bridge 186:707f6e361f3e 247 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 248 */
Anna Bridge 186:707f6e361f3e 249 us_timestamp_t mbed_time_idle(void);
Anna Bridge 186:707f6e361f3e 250
Anna Bridge 186:707f6e361f3e 251 /** Provides the time since the system is up i.e. boot.
Anna Bridge 186:707f6e361f3e 252 *
Anna Bridge 186:707f6e361f3e 253 * @return System uptime.
Anna Bridge 186:707f6e361f3e 254 * @note Works only if platform supports LP ticker.
Anna Bridge 186:707f6e361f3e 255 */
Anna Bridge 186:707f6e361f3e 256 us_timestamp_t mbed_uptime(void);
AnnaBridge 184:08ed48f1de7f 257
AnnaBridge 188:bcfe06ba3d64 258 /** @}*/
AnnaBridge 188:bcfe06ba3d64 259
AnnaBridge 188:bcfe06ba3d64 260 /** Resets the processor and most of the sub-system
AnnaBridge 188:bcfe06ba3d64 261 *
AnnaBridge 188:bcfe06ba3d64 262 * @note Does not affect the debug sub-system
AnnaBridge 188:bcfe06ba3d64 263 */
AnnaBridge 188:bcfe06ba3d64 264 static inline void system_reset(void)
AnnaBridge 188:bcfe06ba3d64 265 {
AnnaBridge 188:bcfe06ba3d64 266 NVIC_SystemReset();
AnnaBridge 188:bcfe06ba3d64 267 }
AnnaBridge 188:bcfe06ba3d64 268
AnnaBridge 184:08ed48f1de7f 269 #ifdef __cplusplus
AnnaBridge 184:08ed48f1de7f 270 }
AnnaBridge 184:08ed48f1de7f 271 #endif
AnnaBridge 184:08ed48f1de7f 272
AnnaBridge 184:08ed48f1de7f 273 #endif
AnnaBridge 184:08ed48f1de7f 274
AnnaBridge 184:08ed48f1de7f 275 /** @}*/
AnnaBridge 184:08ed48f1de7f 276 /** @}*/