The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 111:4336505e4b1c 1 /**
Kojto 111:4336505e4b1c 2 * \file
Kojto 111:4336505e4b1c 3 *
Kojto 111:4336505e4b1c 4 * \brief SAM Power related functionality
Kojto 111:4336505e4b1c 5 *
Kojto 111:4336505e4b1c 6 * Copyright (C) 2014-2015 Atmel Corporation. All rights reserved.
Kojto 111:4336505e4b1c 7 *
Kojto 111:4336505e4b1c 8 * \asf_license_start
Kojto 111:4336505e4b1c 9 *
Kojto 111:4336505e4b1c 10 * \page License
Kojto 111:4336505e4b1c 11 *
Kojto 111:4336505e4b1c 12 * Redistribution and use in source and binary forms, with or without
Kojto 111:4336505e4b1c 13 * modification, are permitted provided that the following conditions are met:
Kojto 111:4336505e4b1c 14 *
Kojto 111:4336505e4b1c 15 * 1. Redistributions of source code must retain the above copyright notice,
Kojto 111:4336505e4b1c 16 * this list of conditions and the following disclaimer.
Kojto 111:4336505e4b1c 17 *
Kojto 111:4336505e4b1c 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Kojto 111:4336505e4b1c 19 * this list of conditions and the following disclaimer in the documentation
Kojto 111:4336505e4b1c 20 * and/or other materials provided with the distribution.
Kojto 111:4336505e4b1c 21 *
Kojto 111:4336505e4b1c 22 * 3. The name of Atmel may not be used to endorse or promote products derived
Kojto 111:4336505e4b1c 23 * from this software without specific prior written permission.
Kojto 111:4336505e4b1c 24 *
Kojto 111:4336505e4b1c 25 * 4. This software may only be redistributed and used in connection with an
Kojto 111:4336505e4b1c 26 * Atmel microcontroller product.
Kojto 111:4336505e4b1c 27 *
Kojto 111:4336505e4b1c 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
Kojto 111:4336505e4b1c 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Kojto 111:4336505e4b1c 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
Kojto 111:4336505e4b1c 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
Kojto 111:4336505e4b1c 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Kojto 111:4336505e4b1c 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Kojto 111:4336505e4b1c 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Kojto 111:4336505e4b1c 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Kojto 111:4336505e4b1c 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
Kojto 111:4336505e4b1c 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Kojto 111:4336505e4b1c 38 * POSSIBILITY OF SUCH DAMAGE.
Kojto 111:4336505e4b1c 39 *
Kojto 111:4336505e4b1c 40 * \asf_license_stop
Kojto 111:4336505e4b1c 41 *
Kojto 111:4336505e4b1c 42 */
Kojto 111:4336505e4b1c 43 /*
Kojto 111:4336505e4b1c 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
Kojto 111:4336505e4b1c 45 */
Kojto 111:4336505e4b1c 46 #ifndef POWER_H_INCLUDED
Kojto 111:4336505e4b1c 47 #define POWER_H_INCLUDED
Kojto 111:4336505e4b1c 48
Kojto 111:4336505e4b1c 49 #include <compiler.h>
Kojto 111:4336505e4b1c 50
Kojto 111:4336505e4b1c 51 #ifdef __cplusplus
Kojto 111:4336505e4b1c 52 extern "C" {
Kojto 111:4336505e4b1c 53 #endif
Kojto 111:4336505e4b1c 54
Kojto 111:4336505e4b1c 55 /**
Kojto 111:4336505e4b1c 56 * \addtogroup asfdoc_sam0_system_group
Kojto 111:4336505e4b1c 57 * @{
Kojto 111:4336505e4b1c 58 */
Kojto 111:4336505e4b1c 59
Kojto 111:4336505e4b1c 60 /**
Kojto 111:4336505e4b1c 61 * \brief Voltage references within the device.
Kojto 111:4336505e4b1c 62 *
Kojto 111:4336505e4b1c 63 * List of available voltage references (VREF) that may be used within the
Kojto 111:4336505e4b1c 64 * device.
Kojto 111:4336505e4b1c 65 */
Kojto 111:4336505e4b1c 66 enum system_voltage_reference {
Kojto 111:4336505e4b1c 67 /** Temperature sensor voltage reference. */
Kojto 111:4336505e4b1c 68 SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE,
Kojto 111:4336505e4b1c 69 /** Bandgap voltage reference. */
Kojto 111:4336505e4b1c 70 SYSTEM_VOLTAGE_REFERENCE_BANDGAP,
Kojto 111:4336505e4b1c 71 };
Kojto 111:4336505e4b1c 72
Kojto 111:4336505e4b1c 73 /**
Kojto 111:4336505e4b1c 74 * \brief Device sleep modes.
Kojto 111:4336505e4b1c 75 *
Kojto 111:4336505e4b1c 76 * List of available sleep modes in the device. A table of clocks available in
Kojto 111:4336505e4b1c 77 * different sleep modes can be found in \ref asfdoc_sam0_system_module_overview_sleep_mode.
Kojto 111:4336505e4b1c 78 */
Kojto 111:4336505e4b1c 79 enum system_sleepmode {
Kojto 111:4336505e4b1c 80 /** IDLE 0 sleep mode. */
Kojto 111:4336505e4b1c 81 SYSTEM_SLEEPMODE_IDLE_0,
Kojto 111:4336505e4b1c 82 /** IDLE 1 sleep mode. */
Kojto 111:4336505e4b1c 83 SYSTEM_SLEEPMODE_IDLE_1,
Kojto 111:4336505e4b1c 84 /** IDLE 2 sleep mode. */
Kojto 111:4336505e4b1c 85 SYSTEM_SLEEPMODE_IDLE_2,
Kojto 111:4336505e4b1c 86 /** Standby sleep mode. */
Kojto 111:4336505e4b1c 87 SYSTEM_SLEEPMODE_STANDBY,
Kojto 111:4336505e4b1c 88 };
Kojto 111:4336505e4b1c 89
Kojto 111:4336505e4b1c 90
Kojto 111:4336505e4b1c 91
Kojto 111:4336505e4b1c 92 /**
Kojto 111:4336505e4b1c 93 * \name Voltage References
Kojto 111:4336505e4b1c 94 * @{
Kojto 111:4336505e4b1c 95 */
Kojto 111:4336505e4b1c 96
Kojto 111:4336505e4b1c 97 /**
Kojto 111:4336505e4b1c 98 * \brief Enable the selected voltage reference
Kojto 111:4336505e4b1c 99 *
Kojto 111:4336505e4b1c 100 * Enables the selected voltage reference source, making the voltage reference
Kojto 111:4336505e4b1c 101 * available on a pin as well as an input source to the analog peripherals.
Kojto 111:4336505e4b1c 102 *
Kojto 111:4336505e4b1c 103 * \param[in] vref Voltage reference to enable
Kojto 111:4336505e4b1c 104 */
Kojto 111:4336505e4b1c 105 static inline void system_voltage_reference_enable(
Kojto 111:4336505e4b1c 106 const enum system_voltage_reference vref)
Kojto 111:4336505e4b1c 107 {
Kojto 111:4336505e4b1c 108 switch (vref) {
Kojto 111:4336505e4b1c 109 case SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE:
Kojto 111:4336505e4b1c 110 SYSCTRL->VREF.reg |= SYSCTRL_VREF_TSEN;
Kojto 111:4336505e4b1c 111 break;
Kojto 111:4336505e4b1c 112
Kojto 111:4336505e4b1c 113 case SYSTEM_VOLTAGE_REFERENCE_BANDGAP:
Kojto 111:4336505e4b1c 114 SYSCTRL->VREF.reg |= SYSCTRL_VREF_BGOUTEN;
Kojto 111:4336505e4b1c 115 break;
Kojto 111:4336505e4b1c 116
Kojto 111:4336505e4b1c 117 default:
Kojto 111:4336505e4b1c 118 Assert(false);
Kojto 111:4336505e4b1c 119 return;
Kojto 111:4336505e4b1c 120 }
Kojto 111:4336505e4b1c 121 }
Kojto 111:4336505e4b1c 122
Kojto 111:4336505e4b1c 123 /**
Kojto 111:4336505e4b1c 124 * \brief Disable the selected voltage reference
Kojto 111:4336505e4b1c 125 *
Kojto 111:4336505e4b1c 126 * Disables the selected voltage reference source.
Kojto 111:4336505e4b1c 127 *
Kojto 111:4336505e4b1c 128 * \param[in] vref Voltage reference to disable
Kojto 111:4336505e4b1c 129 */
Kojto 111:4336505e4b1c 130 static inline void system_voltage_reference_disable(
Kojto 111:4336505e4b1c 131 const enum system_voltage_reference vref)
Kojto 111:4336505e4b1c 132 {
Kojto 111:4336505e4b1c 133 switch (vref) {
Kojto 111:4336505e4b1c 134 case SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE:
Kojto 111:4336505e4b1c 135 SYSCTRL->VREF.reg &= ~SYSCTRL_VREF_TSEN;
Kojto 111:4336505e4b1c 136 break;
Kojto 111:4336505e4b1c 137
Kojto 111:4336505e4b1c 138 case SYSTEM_VOLTAGE_REFERENCE_BANDGAP:
Kojto 111:4336505e4b1c 139 SYSCTRL->VREF.reg &= ~SYSCTRL_VREF_BGOUTEN;
Kojto 111:4336505e4b1c 140 break;
Kojto 111:4336505e4b1c 141
Kojto 111:4336505e4b1c 142 default:
Kojto 111:4336505e4b1c 143 Assert(false);
Kojto 111:4336505e4b1c 144 return;
Kojto 111:4336505e4b1c 145 }
Kojto 111:4336505e4b1c 146 }
Kojto 111:4336505e4b1c 147
Kojto 111:4336505e4b1c 148 /**
Kojto 111:4336505e4b1c 149 * @}
Kojto 111:4336505e4b1c 150 */
Kojto 111:4336505e4b1c 151
Kojto 111:4336505e4b1c 152
Kojto 111:4336505e4b1c 153 /**
Kojto 111:4336505e4b1c 154 * \name Device Sleep Control
Kojto 111:4336505e4b1c 155 * @{
Kojto 111:4336505e4b1c 156 */
Kojto 111:4336505e4b1c 157
Kojto 111:4336505e4b1c 158 /**
Kojto 111:4336505e4b1c 159 * \brief Set the sleep mode of the device
Kojto 111:4336505e4b1c 160 *
Kojto 111:4336505e4b1c 161 * Sets the sleep mode of the device; the configured sleep mode will be entered
Kojto 111:4336505e4b1c 162 * upon the next call of the \ref system_sleep() function.
Kojto 111:4336505e4b1c 163 *
Kojto 111:4336505e4b1c 164 * For an overview of which systems are disabled in sleep for the different
Kojto 111:4336505e4b1c 165 * sleep modes, see \ref asfdoc_sam0_system_module_overview_sleep_mode.
Kojto 111:4336505e4b1c 166 *
Kojto 111:4336505e4b1c 167 * \param[in] sleep_mode Sleep mode to configure for the next sleep operation
Kojto 111:4336505e4b1c 168 *
Kojto 111:4336505e4b1c 169 * \retval STATUS_OK Operation completed successfully
Kojto 111:4336505e4b1c 170 * \retval STATUS_ERR_INVALID_ARG The requested sleep mode was invalid or not
Kojto 111:4336505e4b1c 171 * available
Kojto 111:4336505e4b1c 172 */
Kojto 111:4336505e4b1c 173 static inline enum status_code system_set_sleepmode(
Kojto 111:4336505e4b1c 174 const enum system_sleepmode sleep_mode)
Kojto 111:4336505e4b1c 175 {
Kojto 111:4336505e4b1c 176 #if (SAMD20 || SAMD21)
Kojto 111:4336505e4b1c 177 /* Errata: Make sure that the Flash does not power all the way down
Kojto 111:4336505e4b1c 178 * when in sleep mode. */
Kojto 111:4336505e4b1c 179 NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_DISABLED_Val;
Kojto 111:4336505e4b1c 180 #endif
Kojto 111:4336505e4b1c 181
Kojto 111:4336505e4b1c 182 switch (sleep_mode) {
Kojto 111:4336505e4b1c 183 case SYSTEM_SLEEPMODE_IDLE_0:
Kojto 111:4336505e4b1c 184 case SYSTEM_SLEEPMODE_IDLE_1:
Kojto 111:4336505e4b1c 185 case SYSTEM_SLEEPMODE_IDLE_2:
Kojto 111:4336505e4b1c 186 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
Kojto 111:4336505e4b1c 187 PM->SLEEP.reg = sleep_mode;
Kojto 111:4336505e4b1c 188 break;
Kojto 111:4336505e4b1c 189
Kojto 111:4336505e4b1c 190 case SYSTEM_SLEEPMODE_STANDBY:
Kojto 111:4336505e4b1c 191 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
Kojto 111:4336505e4b1c 192 break;
Kojto 111:4336505e4b1c 193
Kojto 111:4336505e4b1c 194 default:
Kojto 111:4336505e4b1c 195 return STATUS_ERR_INVALID_ARG;
Kojto 111:4336505e4b1c 196 }
Kojto 111:4336505e4b1c 197
Kojto 111:4336505e4b1c 198 return STATUS_OK;
Kojto 111:4336505e4b1c 199 }
Kojto 111:4336505e4b1c 200
Kojto 111:4336505e4b1c 201 /**
Kojto 111:4336505e4b1c 202 * \brief Put the system to sleep waiting for interrupt
Kojto 111:4336505e4b1c 203 *
Kojto 111:4336505e4b1c 204 * Executes a device DSB (Data Synchronization Barrier) instruction to ensure
Kojto 111:4336505e4b1c 205 * all ongoing memory accesses have completed, then a WFI (Wait For Interrupt)
Kojto 111:4336505e4b1c 206 * instruction to place the device into the sleep mode specified by
Kojto 111:4336505e4b1c 207 * \ref system_set_sleepmode until woken by an interrupt.
Kojto 111:4336505e4b1c 208 */
Kojto 111:4336505e4b1c 209 static inline void system_sleep(void)
Kojto 111:4336505e4b1c 210 {
Kojto 111:4336505e4b1c 211 __DSB();
Kojto 111:4336505e4b1c 212 __WFI();
Kojto 111:4336505e4b1c 213 }
Kojto 111:4336505e4b1c 214
Kojto 111:4336505e4b1c 215 /**
Kojto 111:4336505e4b1c 216 * @}
Kojto 111:4336505e4b1c 217 */
Kojto 111:4336505e4b1c 218
Kojto 111:4336505e4b1c 219 /** @} */
Kojto 111:4336505e4b1c 220 #ifdef __cplusplus
Kojto 111:4336505e4b1c 221 }
Kojto 111:4336505e4b1c 222 #endif
Kojto 111:4336505e4b1c 223
Kojto 111:4336505e4b1c 224 #endif /* POWER_H_INCLUDED */