mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
fwndz
Date:
Thu Dec 22 05:12:40 2016 +0000
Revision:
153:9398a535854b
Parent:
150:02e0a0aed4ec
device target maximize

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 150:02e0a0aed4ec 1 /***************************************************************************//**
<> 150:02e0a0aed4ec 2 * @file system_efm32wg.c
<> 150:02e0a0aed4ec 3 * @brief CMSIS Cortex-M4 System Layer for EFM32WG devices.
<> 150:02e0a0aed4ec 4 * @version 5.0.0
<> 150:02e0a0aed4ec 5 ******************************************************************************
<> 150:02e0a0aed4ec 6 * @section License
<> 150:02e0a0aed4ec 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
<> 150:02e0a0aed4ec 8 ******************************************************************************
<> 150:02e0a0aed4ec 9 *
<> 150:02e0a0aed4ec 10 * Permission is granted to anyone to use this software for any purpose,
<> 150:02e0a0aed4ec 11 * including commercial applications, and to alter it and redistribute it
<> 150:02e0a0aed4ec 12 * freely, subject to the following restrictions:
<> 150:02e0a0aed4ec 13 *
<> 150:02e0a0aed4ec 14 * 1. The origin of this software must not be misrepresented; you must not
<> 150:02e0a0aed4ec 15 * claim that you wrote the original software.@n
<> 150:02e0a0aed4ec 16 * 2. Altered source versions must be plainly marked as such, and must not be
<> 150:02e0a0aed4ec 17 * misrepresented as being the original software.@n
<> 150:02e0a0aed4ec 18 * 3. This notice may not be removed or altered from any source distribution.
<> 150:02e0a0aed4ec 19 *
<> 150:02e0a0aed4ec 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Laboratories, Inc.
<> 150:02e0a0aed4ec 21 * has no obligation to support this Software. Silicon Laboratories, Inc. is
<> 150:02e0a0aed4ec 22 * providing the Software "AS IS", with no express or implied warranties of any
<> 150:02e0a0aed4ec 23 * kind, including, but not limited to, any implied warranties of
<> 150:02e0a0aed4ec 24 * merchantability or fitness for any particular purpose or warranties against
<> 150:02e0a0aed4ec 25 * infringement of any proprietary rights of a third party.
<> 150:02e0a0aed4ec 26 *
<> 150:02e0a0aed4ec 27 * Silicon Laboratories, Inc. will not be liable for any consequential,
<> 150:02e0a0aed4ec 28 * incidental, or special damages, or any other relief, or for any claim by
<> 150:02e0a0aed4ec 29 * any third party, arising from your use of this Software.
<> 150:02e0a0aed4ec 30 *
<> 150:02e0a0aed4ec 31 *****************************************************************************/
<> 150:02e0a0aed4ec 32
<> 150:02e0a0aed4ec 33 #include <stdint.h>
<> 150:02e0a0aed4ec 34 #include "em_device.h"
<> 150:02e0a0aed4ec 35
<> 150:02e0a0aed4ec 36 /*******************************************************************************
<> 150:02e0a0aed4ec 37 ****************************** DEFINES ************************************
<> 150:02e0a0aed4ec 38 ******************************************************************************/
<> 150:02e0a0aed4ec 39
<> 150:02e0a0aed4ec 40 /** LFRCO frequency, tuned to below frequency during manufacturing. */
<> 150:02e0a0aed4ec 41 #define EFM32_LFRCO_FREQ (32768UL)
<> 150:02e0a0aed4ec 42 #define EFM32_ULFRCO_FREQ (1000UL)
<> 150:02e0a0aed4ec 43
<> 150:02e0a0aed4ec 44 /*******************************************************************************
<> 150:02e0a0aed4ec 45 ************************** LOCAL VARIABLES ********************************
<> 150:02e0a0aed4ec 46 ******************************************************************************/
<> 150:02e0a0aed4ec 47
<> 150:02e0a0aed4ec 48 /* System oscillator frequencies. These frequencies are normally constant */
<> 150:02e0a0aed4ec 49 /* for a target, but they are made configurable in order to allow run-time */
<> 150:02e0a0aed4ec 50 /* handling of different boards. The crystal oscillator clocks can be set */
<> 150:02e0a0aed4ec 51 /* compile time to a non-default value by defining respective EFM32_nFXO_FREQ */
<> 150:02e0a0aed4ec 52 /* values according to board design. By defining the EFM32_nFXO_FREQ to 0, */
<> 150:02e0a0aed4ec 53 /* one indicates that the oscillator is not present, in order to save some */
<> 150:02e0a0aed4ec 54 /* SW footprint. */
<> 150:02e0a0aed4ec 55
<> 150:02e0a0aed4ec 56 #ifndef EFM32_HFXO_FREQ
<> 150:02e0a0aed4ec 57 #define EFM32_HFXO_FREQ (48000000UL)
<> 150:02e0a0aed4ec 58 #endif
<> 150:02e0a0aed4ec 59
<> 150:02e0a0aed4ec 60 #define EFM32_HFRCO_MAX_FREQ (28000000UL)
<> 150:02e0a0aed4ec 61
<> 150:02e0a0aed4ec 62 /* Do not define variable if HF crystal oscillator not present */
<> 150:02e0a0aed4ec 63 #if (EFM32_HFXO_FREQ > 0)
<> 150:02e0a0aed4ec 64 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
<> 150:02e0a0aed4ec 65 /** System HFXO clock. */
<> 150:02e0a0aed4ec 66 static uint32_t SystemHFXOClock = EFM32_HFXO_FREQ;
<> 150:02e0a0aed4ec 67 /** @endcond (DO_NOT_INCLUDE_WITH_DOXYGEN) */
<> 150:02e0a0aed4ec 68 #endif
<> 150:02e0a0aed4ec 69
<> 150:02e0a0aed4ec 70 #ifndef EFM32_LFXO_FREQ
<> 150:02e0a0aed4ec 71 #define EFM32_LFXO_FREQ (EFM32_LFRCO_FREQ)
<> 150:02e0a0aed4ec 72 #endif
<> 150:02e0a0aed4ec 73
<> 150:02e0a0aed4ec 74 /* Do not define variable if LF crystal oscillator not present */
<> 150:02e0a0aed4ec 75 #if (EFM32_LFXO_FREQ > 0)
<> 150:02e0a0aed4ec 76 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
<> 150:02e0a0aed4ec 77 /** System LFXO clock. */
<> 150:02e0a0aed4ec 78 static uint32_t SystemLFXOClock = EFM32_LFXO_FREQ;
<> 150:02e0a0aed4ec 79 /** @endcond (DO_NOT_INCLUDE_WITH_DOXYGEN) */
<> 150:02e0a0aed4ec 80 #endif
<> 150:02e0a0aed4ec 81
<> 150:02e0a0aed4ec 82 /* Inline function to get the chip's Production Revision. */
<> 150:02e0a0aed4ec 83 __STATIC_INLINE uint8_t GetProdRev(void)
<> 150:02e0a0aed4ec 84 {
<> 150:02e0a0aed4ec 85 return ((DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK)
<> 150:02e0a0aed4ec 86 >> _DEVINFO_PART_PROD_REV_SHIFT);
<> 150:02e0a0aed4ec 87 }
<> 150:02e0a0aed4ec 88
<> 150:02e0a0aed4ec 89 /*******************************************************************************
<> 150:02e0a0aed4ec 90 ************************** GLOBAL VARIABLES *******************************
<> 150:02e0a0aed4ec 91 ******************************************************************************/
<> 150:02e0a0aed4ec 92
<> 150:02e0a0aed4ec 93 /**
<> 150:02e0a0aed4ec 94 * @brief
<> 150:02e0a0aed4ec 95 * System System Clock Frequency (Core Clock).
<> 150:02e0a0aed4ec 96 *
<> 150:02e0a0aed4ec 97 * @details
<> 150:02e0a0aed4ec 98 * Required CMSIS global variable that must be kept up-to-date.
<> 150:02e0a0aed4ec 99 */
<> 150:02e0a0aed4ec 100 uint32_t SystemCoreClock;
<> 150:02e0a0aed4ec 101
<> 150:02e0a0aed4ec 102 /*******************************************************************************
<> 150:02e0a0aed4ec 103 ************************** GLOBAL FUNCTIONS *******************************
<> 150:02e0a0aed4ec 104 ******************************************************************************/
<> 150:02e0a0aed4ec 105
<> 150:02e0a0aed4ec 106 /***************************************************************************//**
<> 150:02e0a0aed4ec 107 * @brief
<> 150:02e0a0aed4ec 108 * Get the current core clock frequency.
<> 150:02e0a0aed4ec 109 *
<> 150:02e0a0aed4ec 110 * @details
<> 150:02e0a0aed4ec 111 * Calculate and get the current core clock frequency based on the current
<> 150:02e0a0aed4ec 112 * configuration. Assuming that the SystemCoreClock global variable is
<> 150:02e0a0aed4ec 113 * maintained, the core clock frequency is stored in that variable as well.
<> 150:02e0a0aed4ec 114 * This function will however calculate the core clock based on actual HW
<> 150:02e0a0aed4ec 115 * configuration. It will also update the SystemCoreClock global variable.
<> 150:02e0a0aed4ec 116 *
<> 150:02e0a0aed4ec 117 * @note
<> 150:02e0a0aed4ec 118 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 119 *
<> 150:02e0a0aed4ec 120 * @return
<> 150:02e0a0aed4ec 121 * The current core clock frequency in Hz.
<> 150:02e0a0aed4ec 122 ******************************************************************************/
<> 150:02e0a0aed4ec 123 uint32_t SystemCoreClockGet(void)
<> 150:02e0a0aed4ec 124 {
<> 150:02e0a0aed4ec 125 uint32_t ret;
<> 150:02e0a0aed4ec 126
<> 150:02e0a0aed4ec 127 ret = SystemHFClockGet();
<> 150:02e0a0aed4ec 128 ret >>= (CMU->HFCORECLKDIV & _CMU_HFCORECLKDIV_HFCORECLKDIV_MASK) >>
<> 150:02e0a0aed4ec 129 _CMU_HFCORECLKDIV_HFCORECLKDIV_SHIFT;
<> 150:02e0a0aed4ec 130
<> 150:02e0a0aed4ec 131 /* Keep CMSIS variable up-to-date just in case */
<> 150:02e0a0aed4ec 132 SystemCoreClock = ret;
<> 150:02e0a0aed4ec 133
<> 150:02e0a0aed4ec 134 return ret;
<> 150:02e0a0aed4ec 135 }
<> 150:02e0a0aed4ec 136
<> 150:02e0a0aed4ec 137
<> 150:02e0a0aed4ec 138 /***************************************************************************//**
<> 150:02e0a0aed4ec 139 * @brief
<> 150:02e0a0aed4ec 140 * Get the maximum core clock frequency.
<> 150:02e0a0aed4ec 141 *
<> 150:02e0a0aed4ec 142 * @note
<> 150:02e0a0aed4ec 143 * This is an EFR32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 144 *
<> 150:02e0a0aed4ec 145 * @return
<> 150:02e0a0aed4ec 146 * The maximum core clock frequency in Hz.
<> 150:02e0a0aed4ec 147 ******************************************************************************/
<> 150:02e0a0aed4ec 148 uint32_t SystemMaxCoreClockGet(void)
<> 150:02e0a0aed4ec 149 {
<> 150:02e0a0aed4ec 150 return (EFM32_HFRCO_MAX_FREQ > EFM32_HFXO_FREQ ? \
<> 150:02e0a0aed4ec 151 EFM32_HFRCO_MAX_FREQ : EFM32_HFXO_FREQ);
<> 150:02e0a0aed4ec 152 }
<> 150:02e0a0aed4ec 153
<> 150:02e0a0aed4ec 154
<> 150:02e0a0aed4ec 155 /***************************************************************************//**
<> 150:02e0a0aed4ec 156 * @brief
<> 150:02e0a0aed4ec 157 * Get the current HFCLK frequency.
<> 150:02e0a0aed4ec 158 *
<> 150:02e0a0aed4ec 159 * @note
<> 150:02e0a0aed4ec 160 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 161 *
<> 150:02e0a0aed4ec 162 * @return
<> 150:02e0a0aed4ec 163 * The current HFCLK frequency in Hz.
<> 150:02e0a0aed4ec 164 ******************************************************************************/
<> 150:02e0a0aed4ec 165 uint32_t SystemHFClockGet(void)
<> 150:02e0a0aed4ec 166 {
<> 150:02e0a0aed4ec 167 uint32_t ret;
<> 150:02e0a0aed4ec 168
<> 150:02e0a0aed4ec 169 switch (CMU->STATUS & (CMU_STATUS_HFRCOSEL | CMU_STATUS_HFXOSEL |
<> 150:02e0a0aed4ec 170 CMU_STATUS_LFRCOSEL | CMU_STATUS_LFXOSEL))
<> 150:02e0a0aed4ec 171 {
<> 150:02e0a0aed4ec 172 case CMU_STATUS_LFXOSEL:
<> 150:02e0a0aed4ec 173 #if (EFM32_LFXO_FREQ > 0)
<> 150:02e0a0aed4ec 174 ret = SystemLFXOClock;
<> 150:02e0a0aed4ec 175 #else
<> 150:02e0a0aed4ec 176 /* We should not get here, since core should not be clocked. May */
<> 150:02e0a0aed4ec 177 /* be caused by a misconfiguration though. */
<> 150:02e0a0aed4ec 178 ret = 0;
<> 150:02e0a0aed4ec 179 #endif
<> 150:02e0a0aed4ec 180 break;
<> 150:02e0a0aed4ec 181
<> 150:02e0a0aed4ec 182 case CMU_STATUS_LFRCOSEL:
<> 150:02e0a0aed4ec 183 ret = EFM32_LFRCO_FREQ;
<> 150:02e0a0aed4ec 184 break;
<> 150:02e0a0aed4ec 185
<> 150:02e0a0aed4ec 186 case CMU_STATUS_HFXOSEL:
<> 150:02e0a0aed4ec 187 #if (EFM32_HFXO_FREQ > 0)
<> 150:02e0a0aed4ec 188 ret = SystemHFXOClock;
<> 150:02e0a0aed4ec 189 #else
<> 150:02e0a0aed4ec 190 /* We should not get here, since core should not be clocked. May */
<> 150:02e0a0aed4ec 191 /* be caused by a misconfiguration though. */
<> 150:02e0a0aed4ec 192 ret = 0;
<> 150:02e0a0aed4ec 193 #endif
<> 150:02e0a0aed4ec 194 break;
<> 150:02e0a0aed4ec 195
<> 150:02e0a0aed4ec 196 default: /* CMU_STATUS_HFRCOSEL */
<> 150:02e0a0aed4ec 197 switch (CMU->HFRCOCTRL & _CMU_HFRCOCTRL_BAND_MASK)
<> 150:02e0a0aed4ec 198 {
<> 150:02e0a0aed4ec 199 case CMU_HFRCOCTRL_BAND_28MHZ:
<> 150:02e0a0aed4ec 200 ret = 28000000;
<> 150:02e0a0aed4ec 201 break;
<> 150:02e0a0aed4ec 202
<> 150:02e0a0aed4ec 203 case CMU_HFRCOCTRL_BAND_21MHZ:
<> 150:02e0a0aed4ec 204 ret = 21000000;
<> 150:02e0a0aed4ec 205 break;
<> 150:02e0a0aed4ec 206
<> 150:02e0a0aed4ec 207 case CMU_HFRCOCTRL_BAND_14MHZ:
<> 150:02e0a0aed4ec 208 ret = 14000000;
<> 150:02e0a0aed4ec 209 break;
<> 150:02e0a0aed4ec 210
<> 150:02e0a0aed4ec 211 case CMU_HFRCOCTRL_BAND_11MHZ:
<> 150:02e0a0aed4ec 212 ret = 11000000;
<> 150:02e0a0aed4ec 213 break;
<> 150:02e0a0aed4ec 214
<> 150:02e0a0aed4ec 215 case CMU_HFRCOCTRL_BAND_7MHZ:
<> 150:02e0a0aed4ec 216 if ( GetProdRev() >= 19 )
<> 150:02e0a0aed4ec 217 ret = 6600000;
<> 150:02e0a0aed4ec 218 else
<> 150:02e0a0aed4ec 219 ret = 7000000;
<> 150:02e0a0aed4ec 220 break;
<> 150:02e0a0aed4ec 221
<> 150:02e0a0aed4ec 222 case CMU_HFRCOCTRL_BAND_1MHZ:
<> 150:02e0a0aed4ec 223 if ( GetProdRev() >= 19 )
<> 150:02e0a0aed4ec 224 ret = 1200000;
<> 150:02e0a0aed4ec 225 else
<> 150:02e0a0aed4ec 226 ret = 1000000;
<> 150:02e0a0aed4ec 227 break;
<> 150:02e0a0aed4ec 228
<> 150:02e0a0aed4ec 229 default:
<> 150:02e0a0aed4ec 230 ret = 0;
<> 150:02e0a0aed4ec 231 break;
<> 150:02e0a0aed4ec 232 }
<> 150:02e0a0aed4ec 233 break;
<> 150:02e0a0aed4ec 234 }
<> 150:02e0a0aed4ec 235
<> 150:02e0a0aed4ec 236 return ret / (1U + ((CMU->CTRL & _CMU_CTRL_HFCLKDIV_MASK)
<> 150:02e0a0aed4ec 237 >> _CMU_CTRL_HFCLKDIV_SHIFT));
<> 150:02e0a0aed4ec 238 }
<> 150:02e0a0aed4ec 239
<> 150:02e0a0aed4ec 240
<> 150:02e0a0aed4ec 241 /**************************************************************************//**
<> 150:02e0a0aed4ec 242 * @brief
<> 150:02e0a0aed4ec 243 * Get high frequency crystal oscillator clock frequency for target system.
<> 150:02e0a0aed4ec 244 *
<> 150:02e0a0aed4ec 245 * @note
<> 150:02e0a0aed4ec 246 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 247 *
<> 150:02e0a0aed4ec 248 * @return
<> 150:02e0a0aed4ec 249 * HFXO frequency in Hz.
<> 150:02e0a0aed4ec 250 *****************************************************************************/
<> 150:02e0a0aed4ec 251 uint32_t SystemHFXOClockGet(void)
<> 150:02e0a0aed4ec 252 {
<> 150:02e0a0aed4ec 253 /* External crystal oscillator present? */
<> 150:02e0a0aed4ec 254 #if (EFM32_HFXO_FREQ > 0)
<> 150:02e0a0aed4ec 255 return SystemHFXOClock;
<> 150:02e0a0aed4ec 256 #else
<> 150:02e0a0aed4ec 257 return 0;
<> 150:02e0a0aed4ec 258 #endif
<> 150:02e0a0aed4ec 259 }
<> 150:02e0a0aed4ec 260
<> 150:02e0a0aed4ec 261
<> 150:02e0a0aed4ec 262 /**************************************************************************//**
<> 150:02e0a0aed4ec 263 * @brief
<> 150:02e0a0aed4ec 264 * Set high frequency crystal oscillator clock frequency for target system.
<> 150:02e0a0aed4ec 265 *
<> 150:02e0a0aed4ec 266 * @note
<> 150:02e0a0aed4ec 267 * This function is mainly provided for being able to handle target systems
<> 150:02e0a0aed4ec 268 * with different HF crystal oscillator frequencies run-time. If used, it
<> 150:02e0a0aed4ec 269 * should probably only be used once during system startup.
<> 150:02e0a0aed4ec 270 *
<> 150:02e0a0aed4ec 271 * @note
<> 150:02e0a0aed4ec 272 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 273 *
<> 150:02e0a0aed4ec 274 * @param[in] freq
<> 150:02e0a0aed4ec 275 * HFXO frequency in Hz used for target.
<> 150:02e0a0aed4ec 276 *****************************************************************************/
<> 150:02e0a0aed4ec 277 void SystemHFXOClockSet(uint32_t freq)
<> 150:02e0a0aed4ec 278 {
<> 150:02e0a0aed4ec 279 /* External crystal oscillator present? */
<> 150:02e0a0aed4ec 280 #if (EFM32_HFXO_FREQ > 0)
<> 150:02e0a0aed4ec 281 SystemHFXOClock = freq;
<> 150:02e0a0aed4ec 282
<> 150:02e0a0aed4ec 283 /* Update core clock frequency if HFXO is used to clock core */
<> 150:02e0a0aed4ec 284 if (CMU->STATUS & CMU_STATUS_HFXOSEL)
<> 150:02e0a0aed4ec 285 {
<> 150:02e0a0aed4ec 286 /* The function will update the global variable */
<> 150:02e0a0aed4ec 287 SystemCoreClockGet();
<> 150:02e0a0aed4ec 288 }
<> 150:02e0a0aed4ec 289 #else
<> 150:02e0a0aed4ec 290 (void)freq; /* Unused parameter */
<> 150:02e0a0aed4ec 291 #endif
<> 150:02e0a0aed4ec 292 }
<> 150:02e0a0aed4ec 293
<> 150:02e0a0aed4ec 294
<> 150:02e0a0aed4ec 295 /**************************************************************************//**
<> 150:02e0a0aed4ec 296 * @brief
<> 150:02e0a0aed4ec 297 * Initialize the system.
<> 150:02e0a0aed4ec 298 *
<> 150:02e0a0aed4ec 299 * @details
<> 150:02e0a0aed4ec 300 * Do required generic HW system init.
<> 150:02e0a0aed4ec 301 *
<> 150:02e0a0aed4ec 302 * @note
<> 150:02e0a0aed4ec 303 * This function is invoked during system init, before the main() routine
<> 150:02e0a0aed4ec 304 * and any data has been initialized. For this reason, it cannot do any
<> 150:02e0a0aed4ec 305 * initialization of variables etc.
<> 150:02e0a0aed4ec 306 *****************************************************************************/
<> 150:02e0a0aed4ec 307 void SystemInit(void)
<> 150:02e0a0aed4ec 308 {
<> 150:02e0a0aed4ec 309 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
<> 150:02e0a0aed4ec 310 /* Set floating point coprosessor access mode. */
<> 150:02e0a0aed4ec 311 SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */
<> 150:02e0a0aed4ec 312 (3UL << 11*2) ); /* set CP11 Full Access */
<> 150:02e0a0aed4ec 313 #endif
<> 150:02e0a0aed4ec 314 }
<> 150:02e0a0aed4ec 315
<> 150:02e0a0aed4ec 316
<> 150:02e0a0aed4ec 317 /**************************************************************************//**
<> 150:02e0a0aed4ec 318 * @brief
<> 150:02e0a0aed4ec 319 * Get low frequency RC oscillator clock frequency for target system.
<> 150:02e0a0aed4ec 320 *
<> 150:02e0a0aed4ec 321 * @note
<> 150:02e0a0aed4ec 322 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 323 *
<> 150:02e0a0aed4ec 324 * @return
<> 150:02e0a0aed4ec 325 * LFRCO frequency in Hz.
<> 150:02e0a0aed4ec 326 *****************************************************************************/
<> 150:02e0a0aed4ec 327 uint32_t SystemLFRCOClockGet(void)
<> 150:02e0a0aed4ec 328 {
<> 150:02e0a0aed4ec 329 /* Currently we assume that this frequency is properly tuned during */
<> 150:02e0a0aed4ec 330 /* manufacturing and is not changed after reset. If future requirements */
<> 150:02e0a0aed4ec 331 /* for re-tuning by user, we can add support for that. */
<> 150:02e0a0aed4ec 332 return EFM32_LFRCO_FREQ;
<> 150:02e0a0aed4ec 333 }
<> 150:02e0a0aed4ec 334
<> 150:02e0a0aed4ec 335
<> 150:02e0a0aed4ec 336 /**************************************************************************//**
<> 150:02e0a0aed4ec 337 * @brief
<> 150:02e0a0aed4ec 338 * Get ultra low frequency RC oscillator clock frequency for target system.
<> 150:02e0a0aed4ec 339 *
<> 150:02e0a0aed4ec 340 * @note
<> 150:02e0a0aed4ec 341 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 342 *
<> 150:02e0a0aed4ec 343 * @return
<> 150:02e0a0aed4ec 344 * ULFRCO frequency in Hz.
<> 150:02e0a0aed4ec 345 *****************************************************************************/
<> 150:02e0a0aed4ec 346 uint32_t SystemULFRCOClockGet(void)
<> 150:02e0a0aed4ec 347 {
<> 150:02e0a0aed4ec 348 /* The ULFRCO frequency is not tuned, and can be very inaccurate */
<> 150:02e0a0aed4ec 349 return EFM32_ULFRCO_FREQ;
<> 150:02e0a0aed4ec 350 }
<> 150:02e0a0aed4ec 351
<> 150:02e0a0aed4ec 352
<> 150:02e0a0aed4ec 353 /**************************************************************************//**
<> 150:02e0a0aed4ec 354 * @brief
<> 150:02e0a0aed4ec 355 * Get low frequency crystal oscillator clock frequency for target system.
<> 150:02e0a0aed4ec 356 *
<> 150:02e0a0aed4ec 357 * @note
<> 150:02e0a0aed4ec 358 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 359 *
<> 150:02e0a0aed4ec 360 * @return
<> 150:02e0a0aed4ec 361 * LFXO frequency in Hz.
<> 150:02e0a0aed4ec 362 *****************************************************************************/
<> 150:02e0a0aed4ec 363 uint32_t SystemLFXOClockGet(void)
<> 150:02e0a0aed4ec 364 {
<> 150:02e0a0aed4ec 365 /* External crystal oscillator present? */
<> 150:02e0a0aed4ec 366 #if (EFM32_LFXO_FREQ > 0)
<> 150:02e0a0aed4ec 367 return SystemLFXOClock;
<> 150:02e0a0aed4ec 368 #else
<> 150:02e0a0aed4ec 369 return 0;
<> 150:02e0a0aed4ec 370 #endif
<> 150:02e0a0aed4ec 371 }
<> 150:02e0a0aed4ec 372
<> 150:02e0a0aed4ec 373
<> 150:02e0a0aed4ec 374 /**************************************************************************//**
<> 150:02e0a0aed4ec 375 * @brief
<> 150:02e0a0aed4ec 376 * Set low frequency crystal oscillator clock frequency for target system.
<> 150:02e0a0aed4ec 377 *
<> 150:02e0a0aed4ec 378 * @note
<> 150:02e0a0aed4ec 379 * This function is mainly provided for being able to handle target systems
<> 150:02e0a0aed4ec 380 * with different HF crystal oscillator frequencies run-time. If used, it
<> 150:02e0a0aed4ec 381 * should probably only be used once during system startup.
<> 150:02e0a0aed4ec 382 *
<> 150:02e0a0aed4ec 383 * @note
<> 150:02e0a0aed4ec 384 * This is an EFM32 proprietary function, not part of the CMSIS definition.
<> 150:02e0a0aed4ec 385 *
<> 150:02e0a0aed4ec 386 * @param[in] freq
<> 150:02e0a0aed4ec 387 * LFXO frequency in Hz used for target.
<> 150:02e0a0aed4ec 388 *****************************************************************************/
<> 150:02e0a0aed4ec 389 void SystemLFXOClockSet(uint32_t freq)
<> 150:02e0a0aed4ec 390 {
<> 150:02e0a0aed4ec 391 /* External crystal oscillator present? */
<> 150:02e0a0aed4ec 392 #if (EFM32_LFXO_FREQ > 0)
<> 150:02e0a0aed4ec 393 SystemLFXOClock = freq;
<> 150:02e0a0aed4ec 394
<> 150:02e0a0aed4ec 395 /* Update core clock frequency if LFXO is used to clock core */
<> 150:02e0a0aed4ec 396 if (CMU->STATUS & CMU_STATUS_LFXOSEL)
<> 150:02e0a0aed4ec 397 {
<> 150:02e0a0aed4ec 398 /* The function will update the global variable */
<> 150:02e0a0aed4ec 399 SystemCoreClockGet();
<> 150:02e0a0aed4ec 400 }
<> 150:02e0a0aed4ec 401 #else
<> 150:02e0a0aed4ec 402 (void)freq; /* Unused parameter */
<> 150:02e0a0aed4ec 403 #endif
<> 150:02e0a0aed4ec 404 }