added prescaler for 16 bit pwm in LPC1347 target
Fork of mbed-dev by
targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_burtc.c@0:9b334a45a8ff, 2015-10-01 (annotated)
- Committer:
- bogdanm
- Date:
- Thu Oct 01 15:25:22 2015 +0300
- Revision:
- 0:9b334a45a8ff
- Child:
- 50:a417edff4437
Initial commit on mbed-dev
Replaces mbed-src (now inactive)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bogdanm | 0:9b334a45a8ff | 1 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 2 | * @file em_burtc.c |
bogdanm | 0:9b334a45a8ff | 3 | * @brief Backup Real Time Counter (BURTC) Peripheral API |
bogdanm | 0:9b334a45a8ff | 4 | * @version 3.20.12 |
bogdanm | 0:9b334a45a8ff | 5 | ******************************************************************************* |
bogdanm | 0:9b334a45a8ff | 6 | * @section License |
bogdanm | 0:9b334a45a8ff | 7 | * <b>(C) Copyright 2014 Silicon Labs, 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. |
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. |
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 Labs has no |
bogdanm | 0:9b334a45a8ff | 21 | * obligation to support this Software. Silicon Labs is providing the |
bogdanm | 0:9b334a45a8ff | 22 | * Software "AS IS", with no express or implied warranties of any kind, |
bogdanm | 0:9b334a45a8ff | 23 | * including, but not limited to, any implied warranties of merchantability |
bogdanm | 0:9b334a45a8ff | 24 | * or fitness for any particular purpose or warranties against infringement |
bogdanm | 0:9b334a45a8ff | 25 | * of any proprietary rights of a third party. |
bogdanm | 0:9b334a45a8ff | 26 | * |
bogdanm | 0:9b334a45a8ff | 27 | * Silicon Labs will not be liable for any consequential, incidental, or |
bogdanm | 0:9b334a45a8ff | 28 | * special damages, or any other relief, or for any claim by any third party, |
bogdanm | 0:9b334a45a8ff | 29 | * arising from your use of this Software. |
bogdanm | 0:9b334a45a8ff | 30 | * |
bogdanm | 0:9b334a45a8ff | 31 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 32 | |
bogdanm | 0:9b334a45a8ff | 33 | |
bogdanm | 0:9b334a45a8ff | 34 | #include "em_device.h" |
bogdanm | 0:9b334a45a8ff | 35 | #if defined(BURTC_PRESENT) |
bogdanm | 0:9b334a45a8ff | 36 | #include "em_burtc.h" |
bogdanm | 0:9b334a45a8ff | 37 | |
bogdanm | 0:9b334a45a8ff | 38 | #include "em_assert.h" |
bogdanm | 0:9b334a45a8ff | 39 | #include "em_bitband.h" |
bogdanm | 0:9b334a45a8ff | 40 | |
bogdanm | 0:9b334a45a8ff | 41 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 42 | * @addtogroup EM_Library |
bogdanm | 0:9b334a45a8ff | 43 | * @{ |
bogdanm | 0:9b334a45a8ff | 44 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 45 | |
bogdanm | 0:9b334a45a8ff | 46 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 47 | * @addtogroup BURTC |
bogdanm | 0:9b334a45a8ff | 48 | * @brief Backup Real Time Counter (BURTC) Peripheral API |
bogdanm | 0:9b334a45a8ff | 49 | * @{ |
bogdanm | 0:9b334a45a8ff | 50 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 51 | |
bogdanm | 0:9b334a45a8ff | 52 | /******************************************************************************* |
bogdanm | 0:9b334a45a8ff | 53 | ******************************* DEFINES *********************************** |
bogdanm | 0:9b334a45a8ff | 54 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 55 | |
bogdanm | 0:9b334a45a8ff | 56 | /******************************************************************************* |
bogdanm | 0:9b334a45a8ff | 57 | ************************** LOCAL FUNCTIONS ******************************** |
bogdanm | 0:9b334a45a8ff | 58 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 59 | |
bogdanm | 0:9b334a45a8ff | 60 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 61 | * @brief Convert dividend to prescaler logarithmic value. Only works for even |
bogdanm | 0:9b334a45a8ff | 62 | * numbers equal to 2^n |
bogdanm | 0:9b334a45a8ff | 63 | * @param[in] div Unscaled dividend, |
bogdanm | 0:9b334a45a8ff | 64 | * @return Base 2 logarithm of input, as used by fixed prescalers |
bogdanm | 0:9b334a45a8ff | 65 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 66 | __STATIC_INLINE uint32_t BURTC_DivToLog2(uint32_t div) |
bogdanm | 0:9b334a45a8ff | 67 | { |
bogdanm | 0:9b334a45a8ff | 68 | uint32_t log2; |
bogdanm | 0:9b334a45a8ff | 69 | |
bogdanm | 0:9b334a45a8ff | 70 | /* Prescaler accepts an argument of 128 or less, valid values being 2^n */ |
bogdanm | 0:9b334a45a8ff | 71 | EFM_ASSERT((div > 0) && (div <= 32768)); |
bogdanm | 0:9b334a45a8ff | 72 | |
bogdanm | 0:9b334a45a8ff | 73 | /* Count leading zeroes and "reverse" result, Cortex-M3 intrinsic */ |
bogdanm | 0:9b334a45a8ff | 74 | log2 = (31 - __CLZ(div)); |
bogdanm | 0:9b334a45a8ff | 75 | |
bogdanm | 0:9b334a45a8ff | 76 | return log2; |
bogdanm | 0:9b334a45a8ff | 77 | } |
bogdanm | 0:9b334a45a8ff | 78 | |
bogdanm | 0:9b334a45a8ff | 79 | |
bogdanm | 0:9b334a45a8ff | 80 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 81 | * @brief |
bogdanm | 0:9b334a45a8ff | 82 | * Wait for ongoing sync of register(s) to low frequency domain to complete. |
bogdanm | 0:9b334a45a8ff | 83 | * |
bogdanm | 0:9b334a45a8ff | 84 | * @param[in] mask |
bogdanm | 0:9b334a45a8ff | 85 | * Bitmask corresponding to SYNCBUSY register defined bits, indicating |
bogdanm | 0:9b334a45a8ff | 86 | * registers that must complete any ongoing synchronization. |
bogdanm | 0:9b334a45a8ff | 87 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 88 | __STATIC_INLINE void BURTC_Sync(uint32_t mask) |
bogdanm | 0:9b334a45a8ff | 89 | { |
bogdanm | 0:9b334a45a8ff | 90 | /* Avoid deadlock if modifying the same register twice when freeze mode is |
bogdanm | 0:9b334a45a8ff | 91 | activated, or when no clock is selected for the BURTC. If no clock is |
bogdanm | 0:9b334a45a8ff | 92 | selected, then the sync is done once the clock source is set. */ |
bogdanm | 0:9b334a45a8ff | 93 | if ((BURTC->FREEZE & BURTC_FREEZE_REGFREEZE) |
bogdanm | 0:9b334a45a8ff | 94 | || ((BURTC->CTRL & _BURTC_CTRL_CLKSEL_MASK) != _BURTC_CTRL_CLKSEL_NONE)) |
bogdanm | 0:9b334a45a8ff | 95 | { |
bogdanm | 0:9b334a45a8ff | 96 | return; |
bogdanm | 0:9b334a45a8ff | 97 | } |
bogdanm | 0:9b334a45a8ff | 98 | /* Wait for any pending previous write operation to have been completed */ |
bogdanm | 0:9b334a45a8ff | 99 | /* in low frequency domain. This is only required for the Gecko Family */ |
bogdanm | 0:9b334a45a8ff | 100 | while (BURTC->SYNCBUSY & mask) |
bogdanm | 0:9b334a45a8ff | 101 | ; |
bogdanm | 0:9b334a45a8ff | 102 | } |
bogdanm | 0:9b334a45a8ff | 103 | |
bogdanm | 0:9b334a45a8ff | 104 | |
bogdanm | 0:9b334a45a8ff | 105 | /******************************************************************************* |
bogdanm | 0:9b334a45a8ff | 106 | ************************** GLOBAL FUNCTIONS ******************************* |
bogdanm | 0:9b334a45a8ff | 107 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 108 | |
bogdanm | 0:9b334a45a8ff | 109 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 110 | * @brief Initialize BURTC |
bogdanm | 0:9b334a45a8ff | 111 | * |
bogdanm | 0:9b334a45a8ff | 112 | * @details |
bogdanm | 0:9b334a45a8ff | 113 | * Configures the BURTC peripheral. |
bogdanm | 0:9b334a45a8ff | 114 | * |
bogdanm | 0:9b334a45a8ff | 115 | * @note |
bogdanm | 0:9b334a45a8ff | 116 | * Before initialization, BURTC module must first be enabled by clearing the |
bogdanm | 0:9b334a45a8ff | 117 | * reset bit in the RMU, i.e. |
bogdanm | 0:9b334a45a8ff | 118 | * @verbatim |
bogdanm | 0:9b334a45a8ff | 119 | * RMU_ResetControl(rmuResetBU, false); |
bogdanm | 0:9b334a45a8ff | 120 | * @endverbatim |
bogdanm | 0:9b334a45a8ff | 121 | * Compare channel 0 must be configured outside this function, before |
bogdanm | 0:9b334a45a8ff | 122 | * initialization if enable is set to true. The counter will always be reset. |
bogdanm | 0:9b334a45a8ff | 123 | * |
bogdanm | 0:9b334a45a8ff | 124 | * @param[in] burtcInit |
bogdanm | 0:9b334a45a8ff | 125 | * Pointer to BURTC initialization structure |
bogdanm | 0:9b334a45a8ff | 126 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 127 | void BURTC_Init(const BURTC_Init_TypeDef *burtcInit) |
bogdanm | 0:9b334a45a8ff | 128 | { |
bogdanm | 0:9b334a45a8ff | 129 | uint32_t ctrl; |
bogdanm | 0:9b334a45a8ff | 130 | uint32_t presc; |
bogdanm | 0:9b334a45a8ff | 131 | |
bogdanm | 0:9b334a45a8ff | 132 | /* Check initializer structure integrity */ |
bogdanm | 0:9b334a45a8ff | 133 | EFM_ASSERT(burtcInit != (BURTC_Init_TypeDef *) 0); |
bogdanm | 0:9b334a45a8ff | 134 | /* Clock divider must be between 1 and 128, really on the form 2^n */ |
bogdanm | 0:9b334a45a8ff | 135 | EFM_ASSERT((burtcInit->clkDiv >= 1) && (burtcInit->clkDiv <= 128)); |
bogdanm | 0:9b334a45a8ff | 136 | /* Ignored compare bits during low power operation must be less than 7 */ |
bogdanm | 0:9b334a45a8ff | 137 | /* Note! Giant Gecko revision C errata, do NOT use LPCOMP=7 */ |
bogdanm | 0:9b334a45a8ff | 138 | EFM_ASSERT(burtcInit->lowPowerComp <= 6); |
bogdanm | 0:9b334a45a8ff | 139 | /* You cannot enable the BURTC if mode is set to disabled */ |
bogdanm | 0:9b334a45a8ff | 140 | EFM_ASSERT((burtcInit->enable == false) || |
bogdanm | 0:9b334a45a8ff | 141 | ((burtcInit->enable == true) && (burtcInit->mode != burtcModeDisable))); |
bogdanm | 0:9b334a45a8ff | 142 | /* Low power mode is only available with LFRCO or LFXO as clock source */ |
bogdanm | 0:9b334a45a8ff | 143 | EFM_ASSERT((burtcInit->clkSel != burtcClkSelULFRCO) || |
bogdanm | 0:9b334a45a8ff | 144 | ((burtcInit->clkSel == burtcClkSelULFRCO) && (burtcInit->lowPowerMode == burtcLPDisable))); |
bogdanm | 0:9b334a45a8ff | 145 | |
bogdanm | 0:9b334a45a8ff | 146 | /* Calculate prescaler value from clock divider input */ |
bogdanm | 0:9b334a45a8ff | 147 | /* Note! If clock select (clkSel) is ULFRCO, a clock divisor (clkDiv) of |
bogdanm | 0:9b334a45a8ff | 148 | value 1 will select a 2kHz ULFRCO clock, while any other value will |
bogdanm | 0:9b334a45a8ff | 149 | select a 1kHz ULFRCO clock source. */ |
bogdanm | 0:9b334a45a8ff | 150 | presc = BURTC_DivToLog2(burtcInit->clkDiv); |
bogdanm | 0:9b334a45a8ff | 151 | |
bogdanm | 0:9b334a45a8ff | 152 | /* Make sure all registers are updated simultaneously */ |
bogdanm | 0:9b334a45a8ff | 153 | if (burtcInit->enable) |
bogdanm | 0:9b334a45a8ff | 154 | { |
bogdanm | 0:9b334a45a8ff | 155 | BURTC_FreezeEnable(true); |
bogdanm | 0:9b334a45a8ff | 156 | } |
bogdanm | 0:9b334a45a8ff | 157 | |
bogdanm | 0:9b334a45a8ff | 158 | /* Modification of LPMODE register requires sync with potential ongoing |
bogdanm | 0:9b334a45a8ff | 159 | * register updates in LF domain. */ |
bogdanm | 0:9b334a45a8ff | 160 | BURTC_Sync(BURTC_SYNCBUSY_LPMODE); |
bogdanm | 0:9b334a45a8ff | 161 | |
bogdanm | 0:9b334a45a8ff | 162 | /* Configure low power mode */ |
bogdanm | 0:9b334a45a8ff | 163 | BURTC->LPMODE = (uint32_t) (burtcInit->lowPowerMode); |
bogdanm | 0:9b334a45a8ff | 164 | |
bogdanm | 0:9b334a45a8ff | 165 | /* New configuration */ |
bogdanm | 0:9b334a45a8ff | 166 | ctrl = ((BURTC_CTRL_RSTEN) | |
bogdanm | 0:9b334a45a8ff | 167 | (burtcInit->mode) | |
bogdanm | 0:9b334a45a8ff | 168 | (burtcInit->debugRun << _BURTC_CTRL_DEBUGRUN_SHIFT) | |
bogdanm | 0:9b334a45a8ff | 169 | (burtcInit->compare0Top << _BURTC_CTRL_COMP0TOP_SHIFT) | |
bogdanm | 0:9b334a45a8ff | 170 | (burtcInit->lowPowerComp << _BURTC_CTRL_LPCOMP_SHIFT) | |
bogdanm | 0:9b334a45a8ff | 171 | (presc << _BURTC_CTRL_PRESC_SHIFT) | |
bogdanm | 0:9b334a45a8ff | 172 | (burtcInit->clkSel) | |
bogdanm | 0:9b334a45a8ff | 173 | (burtcInit->timeStamp << _BURTC_CTRL_BUMODETSEN_SHIFT)); |
bogdanm | 0:9b334a45a8ff | 174 | |
bogdanm | 0:9b334a45a8ff | 175 | /* Clear interrupts */ |
bogdanm | 0:9b334a45a8ff | 176 | BURTC_IntClear(0xFFFFFFFF); |
bogdanm | 0:9b334a45a8ff | 177 | |
bogdanm | 0:9b334a45a8ff | 178 | /* Set new configuration */ |
bogdanm | 0:9b334a45a8ff | 179 | BURTC->CTRL = ctrl; |
bogdanm | 0:9b334a45a8ff | 180 | |
bogdanm | 0:9b334a45a8ff | 181 | /* Enable BURTC and counter */ |
bogdanm | 0:9b334a45a8ff | 182 | if (burtcInit->enable) |
bogdanm | 0:9b334a45a8ff | 183 | { |
bogdanm | 0:9b334a45a8ff | 184 | /* To enable BURTC counter, we need to disable reset */ |
bogdanm | 0:9b334a45a8ff | 185 | BURTC_Enable(true); |
bogdanm | 0:9b334a45a8ff | 186 | |
bogdanm | 0:9b334a45a8ff | 187 | /* Clear freeze */ |
bogdanm | 0:9b334a45a8ff | 188 | BURTC_FreezeEnable(false); |
bogdanm | 0:9b334a45a8ff | 189 | } |
bogdanm | 0:9b334a45a8ff | 190 | } |
bogdanm | 0:9b334a45a8ff | 191 | |
bogdanm | 0:9b334a45a8ff | 192 | |
bogdanm | 0:9b334a45a8ff | 193 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 194 | * @brief Set BURTC compare channel |
bogdanm | 0:9b334a45a8ff | 195 | * |
bogdanm | 0:9b334a45a8ff | 196 | * @param[in] comp Compare channel index, must be 0 for Giant / Leopard Gecko |
bogdanm | 0:9b334a45a8ff | 197 | * |
bogdanm | 0:9b334a45a8ff | 198 | * @param[in] value New compare value |
bogdanm | 0:9b334a45a8ff | 199 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 200 | void BURTC_CompareSet(unsigned int comp, uint32_t value) |
bogdanm | 0:9b334a45a8ff | 201 | { |
bogdanm | 0:9b334a45a8ff | 202 | (void) comp; /* Unused parameter when EFM_ASSERT is undefined. */ |
bogdanm | 0:9b334a45a8ff | 203 | |
bogdanm | 0:9b334a45a8ff | 204 | EFM_ASSERT(comp == 0); |
bogdanm | 0:9b334a45a8ff | 205 | |
bogdanm | 0:9b334a45a8ff | 206 | /* Modification of COMP0 register requires sync with potential ongoing |
bogdanm | 0:9b334a45a8ff | 207 | * register updates in LF domain. */ |
bogdanm | 0:9b334a45a8ff | 208 | BURTC_Sync(BURTC_SYNCBUSY_COMP0); |
bogdanm | 0:9b334a45a8ff | 209 | |
bogdanm | 0:9b334a45a8ff | 210 | /* Configure compare channel 0 */ |
bogdanm | 0:9b334a45a8ff | 211 | BURTC->COMP0 = value; |
bogdanm | 0:9b334a45a8ff | 212 | } |
bogdanm | 0:9b334a45a8ff | 213 | |
bogdanm | 0:9b334a45a8ff | 214 | |
bogdanm | 0:9b334a45a8ff | 215 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 216 | * @brief Get BURTC compare value |
bogdanm | 0:9b334a45a8ff | 217 | * |
bogdanm | 0:9b334a45a8ff | 218 | * @param[in] comp Compare channel index value, must be 0 for Giant/Leopard. |
bogdanm | 0:9b334a45a8ff | 219 | * |
bogdanm | 0:9b334a45a8ff | 220 | * @return Currently configured value for this compare channel |
bogdanm | 0:9b334a45a8ff | 221 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 222 | uint32_t BURTC_CompareGet(unsigned int comp) |
bogdanm | 0:9b334a45a8ff | 223 | { |
bogdanm | 0:9b334a45a8ff | 224 | (void) comp; /* Unused parameter when EFM_ASSERT is undefined. */ |
bogdanm | 0:9b334a45a8ff | 225 | |
bogdanm | 0:9b334a45a8ff | 226 | EFM_ASSERT(comp == 0); |
bogdanm | 0:9b334a45a8ff | 227 | |
bogdanm | 0:9b334a45a8ff | 228 | return BURTC->COMP0; |
bogdanm | 0:9b334a45a8ff | 229 | } |
bogdanm | 0:9b334a45a8ff | 230 | |
bogdanm | 0:9b334a45a8ff | 231 | |
bogdanm | 0:9b334a45a8ff | 232 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 233 | * @brief Reset counter |
bogdanm | 0:9b334a45a8ff | 234 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 235 | void BURTC_CounterReset(void) |
bogdanm | 0:9b334a45a8ff | 236 | { |
bogdanm | 0:9b334a45a8ff | 237 | /* Set and clear reset bit */ |
bogdanm | 0:9b334a45a8ff | 238 | BITBAND_Peripheral(&BURTC->CTRL, _BURTC_CTRL_RSTEN_SHIFT, 1); |
bogdanm | 0:9b334a45a8ff | 239 | BITBAND_Peripheral(&BURTC->CTRL, _BURTC_CTRL_RSTEN_SHIFT, 0); |
bogdanm | 0:9b334a45a8ff | 240 | } |
bogdanm | 0:9b334a45a8ff | 241 | |
bogdanm | 0:9b334a45a8ff | 242 | |
bogdanm | 0:9b334a45a8ff | 243 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 244 | * @brief |
bogdanm | 0:9b334a45a8ff | 245 | * Restore BURTC to reset state |
bogdanm | 0:9b334a45a8ff | 246 | * @note |
bogdanm | 0:9b334a45a8ff | 247 | * Before accessing the BURTC, BURSTEN in RMU->CTRL must be cleared. |
bogdanm | 0:9b334a45a8ff | 248 | * LOCK will not be reset to default value, as this will disable access |
bogdanm | 0:9b334a45a8ff | 249 | * to core BURTC registers. |
bogdanm | 0:9b334a45a8ff | 250 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 251 | void BURTC_Reset(void) |
bogdanm | 0:9b334a45a8ff | 252 | { |
bogdanm | 0:9b334a45a8ff | 253 | bool buResetState; |
bogdanm | 0:9b334a45a8ff | 254 | |
bogdanm | 0:9b334a45a8ff | 255 | /* Read reset state, set reset and restore state */ |
bogdanm | 0:9b334a45a8ff | 256 | buResetState = BITBAND_PeripheralRead(&RMU->CTRL, _RMU_CTRL_BURSTEN_SHIFT); |
bogdanm | 0:9b334a45a8ff | 257 | BITBAND_Peripheral(&RMU->CTRL, _RMU_CTRL_BURSTEN_SHIFT, 1); |
bogdanm | 0:9b334a45a8ff | 258 | BITBAND_Peripheral(&RMU->CTRL, _RMU_CTRL_BURSTEN_SHIFT, buResetState); |
bogdanm | 0:9b334a45a8ff | 259 | } |
bogdanm | 0:9b334a45a8ff | 260 | |
bogdanm | 0:9b334a45a8ff | 261 | |
bogdanm | 0:9b334a45a8ff | 262 | /***************************************************************************//** |
bogdanm | 0:9b334a45a8ff | 263 | * @brief |
bogdanm | 0:9b334a45a8ff | 264 | * Get clock frequency of the BURTC. |
bogdanm | 0:9b334a45a8ff | 265 | * |
bogdanm | 0:9b334a45a8ff | 266 | * @return |
bogdanm | 0:9b334a45a8ff | 267 | * The current frequency in Hz. |
bogdanm | 0:9b334a45a8ff | 268 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 269 | uint32_t BURTC_ClockFreqGet(void) |
bogdanm | 0:9b334a45a8ff | 270 | { |
bogdanm | 0:9b334a45a8ff | 271 | uint32_t clkSel; |
bogdanm | 0:9b334a45a8ff | 272 | uint32_t clkDiv; |
bogdanm | 0:9b334a45a8ff | 273 | uint32_t frequency; |
bogdanm | 0:9b334a45a8ff | 274 | |
bogdanm | 0:9b334a45a8ff | 275 | clkSel = BURTC->CTRL & _BURTC_CTRL_CLKSEL_MASK; |
bogdanm | 0:9b334a45a8ff | 276 | clkDiv = (BURTC->CTRL & _BURTC_CTRL_PRESC_MASK) >> _BURTC_CTRL_PRESC_SHIFT; |
bogdanm | 0:9b334a45a8ff | 277 | |
bogdanm | 0:9b334a45a8ff | 278 | switch (clkSel) |
bogdanm | 0:9b334a45a8ff | 279 | { |
bogdanm | 0:9b334a45a8ff | 280 | /** Ultra low frequency (1 kHz) clock */ |
bogdanm | 0:9b334a45a8ff | 281 | case BURTC_CTRL_CLKSEL_ULFRCO: |
bogdanm | 0:9b334a45a8ff | 282 | if (_BURTC_CTRL_PRESC_DIV1 == clkDiv) |
bogdanm | 0:9b334a45a8ff | 283 | { |
bogdanm | 0:9b334a45a8ff | 284 | frequency = 2000; /* 2KHz when clock divisor is 1. */ |
bogdanm | 0:9b334a45a8ff | 285 | } |
bogdanm | 0:9b334a45a8ff | 286 | else |
bogdanm | 0:9b334a45a8ff | 287 | { |
bogdanm | 0:9b334a45a8ff | 288 | frequency = SystemULFRCOClockGet(); /* 1KHz when divisor is different |
bogdanm | 0:9b334a45a8ff | 289 | from 1. */ |
bogdanm | 0:9b334a45a8ff | 290 | } |
bogdanm | 0:9b334a45a8ff | 291 | break; |
bogdanm | 0:9b334a45a8ff | 292 | |
bogdanm | 0:9b334a45a8ff | 293 | /** Low frequency RC oscillator */ |
bogdanm | 0:9b334a45a8ff | 294 | case BURTC_CTRL_CLKSEL_LFRCO: |
bogdanm | 0:9b334a45a8ff | 295 | frequency = SystemLFRCOClockGet() / (1 << clkDiv); /* freq=32768/2^clkDiv */ |
bogdanm | 0:9b334a45a8ff | 296 | break; |
bogdanm | 0:9b334a45a8ff | 297 | |
bogdanm | 0:9b334a45a8ff | 298 | /** Low frequency crystal osciallator */ |
bogdanm | 0:9b334a45a8ff | 299 | case BURTC_CTRL_CLKSEL_LFXO: |
bogdanm | 0:9b334a45a8ff | 300 | frequency = SystemLFXOClockGet() / (1 << clkDiv); /* freq=32768/2^clkDiv */ |
bogdanm | 0:9b334a45a8ff | 301 | break; |
bogdanm | 0:9b334a45a8ff | 302 | |
bogdanm | 0:9b334a45a8ff | 303 | default: |
bogdanm | 0:9b334a45a8ff | 304 | /* No clock selected for BURTC. */ |
bogdanm | 0:9b334a45a8ff | 305 | frequency = 0; |
bogdanm | 0:9b334a45a8ff | 306 | } |
bogdanm | 0:9b334a45a8ff | 307 | return frequency; |
bogdanm | 0:9b334a45a8ff | 308 | } |
bogdanm | 0:9b334a45a8ff | 309 | |
bogdanm | 0:9b334a45a8ff | 310 | |
bogdanm | 0:9b334a45a8ff | 311 | /** @} (end addtogroup BURTC) */ |
bogdanm | 0:9b334a45a8ff | 312 | /** @} (end addtogroup EM_Library) */ |
bogdanm | 0:9b334a45a8ff | 313 | |
bogdanm | 0:9b334a45a8ff | 314 | #endif /* BURTC_PRESENT */ |