Julien Cassette / mbed-dev

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Fri Jan 15 07:45:16 2016 +0000
Revision:
50:a417edff4437
Parent:
0:9b334a45a8ff
Synchronized with git revision 6010f32619bfcbb01cc73747d4ff9040863482d9

Full URL: https://github.com/mbedmicro/mbed/commit/6010f32619bfcbb01cc73747d4ff9040863482d9/

Remove doubling of buffer size in realiseEndpoint()

Who changed what in which revision?

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