added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /*
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
<> 144:ef7eb2e8f9f7 3 * All rights reserved.
<> 144:ef7eb2e8f9f7 4 *
<> 144:ef7eb2e8f9f7 5 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 6 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * o Redistributions of source code must retain the above copyright notice, this list
<> 144:ef7eb2e8f9f7 9 * of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 * o Redistributions in binary form must reproduce the above copyright notice, this
<> 144:ef7eb2e8f9f7 12 * list of conditions and the following disclaimer in the documentation and/or
<> 144:ef7eb2e8f9f7 13 * other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 14 *
<> 144:ef7eb2e8f9f7 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
<> 144:ef7eb2e8f9f7 16 * contributors may be used to endorse or promote products derived from this
<> 144:ef7eb2e8f9f7 17 * software without specific prior written permission.
<> 144:ef7eb2e8f9f7 18 *
<> 144:ef7eb2e8f9f7 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
<> 144:ef7eb2e8f9f7 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
<> 144:ef7eb2e8f9f7 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
<> 144:ef7eb2e8f9f7 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
<> 144:ef7eb2e8f9f7 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
<> 144:ef7eb2e8f9f7 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
<> 144:ef7eb2e8f9f7 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
<> 144:ef7eb2e8f9f7 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
<> 144:ef7eb2e8f9f7 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 29 */
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 #ifndef _FSL_CLOCK_H_
<> 144:ef7eb2e8f9f7 32 #define _FSL_CLOCK_H_
<> 144:ef7eb2e8f9f7 33
<> 144:ef7eb2e8f9f7 34 #include "fsl_device_registers.h"
<> 144:ef7eb2e8f9f7 35 #include <stdint.h>
<> 144:ef7eb2e8f9f7 36 #include <stdbool.h>
<> 144:ef7eb2e8f9f7 37 #include <assert.h>
<> 144:ef7eb2e8f9f7 38
<> 144:ef7eb2e8f9f7 39 /*! @addtogroup clock */
<> 144:ef7eb2e8f9f7 40 /*! @{ */
<> 144:ef7eb2e8f9f7 41
<> 144:ef7eb2e8f9f7 42 /*******************************************************************************
<> 144:ef7eb2e8f9f7 43 * Definitions
<> 144:ef7eb2e8f9f7 44 ******************************************************************************/
<> 144:ef7eb2e8f9f7 45
<> 144:ef7eb2e8f9f7 46 /*! @brief Clock driver version. */
<> 144:ef7eb2e8f9f7 47 #define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 1, 0)) /*!< Version 2.1.0. */
<> 144:ef7eb2e8f9f7 48
<> 144:ef7eb2e8f9f7 49 /*! @brief External XTAL0 (OSC0) clock frequency.
<> 144:ef7eb2e8f9f7 50 *
<> 144:ef7eb2e8f9f7 51 * The XTAL0/EXTAL0 (OSC0) clock frequency in Hz, when the clock is setup, use the
<> 144:ef7eb2e8f9f7 52 * function CLOCK_SetXtal0Freq to set the value in to clock driver. For example,
<> 144:ef7eb2e8f9f7 53 * if XTAL0 is 8MHz,
<> 144:ef7eb2e8f9f7 54 * @code
<> 144:ef7eb2e8f9f7 55 * CLOCK_InitOsc0(...); // Setup the OSC0
<> 144:ef7eb2e8f9f7 56 * CLOCK_SetXtal0Freq(80000000); // Set the XTAL0 value to clock driver.
<> 144:ef7eb2e8f9f7 57 * @endcode
<> 144:ef7eb2e8f9f7 58 *
<> 144:ef7eb2e8f9f7 59 * This is important for the multicore platforms, only one core needs to setup
<> 144:ef7eb2e8f9f7 60 * OSC0 using CLOCK_InitOsc0, all other cores need to call CLOCK_SetXtal0Freq
<> 144:ef7eb2e8f9f7 61 * to get valid clock frequency.
<> 144:ef7eb2e8f9f7 62 */
<> 144:ef7eb2e8f9f7 63 extern uint32_t g_xtal0Freq;
<> 144:ef7eb2e8f9f7 64
<> 144:ef7eb2e8f9f7 65 /*! @brief External XTAL32/EXTAL32/RTC_CLKIN clock frequency.
<> 144:ef7eb2e8f9f7 66 *
<> 144:ef7eb2e8f9f7 67 * The XTAL32/EXTAL32/RTC_CLKIN clock frequency in Hz, when the clock is setup, use the
<> 144:ef7eb2e8f9f7 68 * function CLOCK_SetXtal32Freq to set the value in to clock driver.
<> 144:ef7eb2e8f9f7 69 *
<> 144:ef7eb2e8f9f7 70 * This is important for the multicore platforms, only one core needs to setup
<> 144:ef7eb2e8f9f7 71 * the clock, all other cores need to call CLOCK_SetXtal32Freq
<> 144:ef7eb2e8f9f7 72 * to get valid clock frequency.
<> 144:ef7eb2e8f9f7 73 */
<> 144:ef7eb2e8f9f7 74 extern uint32_t g_xtal32Freq;
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76 /*! @brief IRC48M clock frequency in Hz. */
<> 144:ef7eb2e8f9f7 77 #define MCG_INTERNAL_IRC_48M 48000000U
<> 144:ef7eb2e8f9f7 78
<> 144:ef7eb2e8f9f7 79 #if (defined(OSC) && !(defined(OSC0)))
<> 144:ef7eb2e8f9f7 80 #define OSC0 OSC
<> 144:ef7eb2e8f9f7 81 #endif
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 /*! @brief Clock ip name array for DMAMUX. */
<> 144:ef7eb2e8f9f7 84 #define DMAMUX_CLOCKS \
<> 144:ef7eb2e8f9f7 85 { \
<> 144:ef7eb2e8f9f7 86 kCLOCK_Dmamux0 \
<> 144:ef7eb2e8f9f7 87 }
<> 144:ef7eb2e8f9f7 88
<> 144:ef7eb2e8f9f7 89 /*! @brief Clock ip name array for RTC. */
<> 144:ef7eb2e8f9f7 90 #define RTC_CLOCKS \
<> 144:ef7eb2e8f9f7 91 { \
<> 144:ef7eb2e8f9f7 92 kCLOCK_Rtc0 \
<> 144:ef7eb2e8f9f7 93 }
<> 144:ef7eb2e8f9f7 94
<> 144:ef7eb2e8f9f7 95 /*! @brief Clock ip name array for ENET. */
<> 144:ef7eb2e8f9f7 96 #define ENET_CLOCKS \
<> 144:ef7eb2e8f9f7 97 { \
<> 144:ef7eb2e8f9f7 98 kCLOCK_Enet0 \
<> 144:ef7eb2e8f9f7 99 }
<> 144:ef7eb2e8f9f7 100
<> 144:ef7eb2e8f9f7 101 /*! @brief Clock ip name array for PORT. */
<> 144:ef7eb2e8f9f7 102 #define PORT_CLOCKS \
<> 144:ef7eb2e8f9f7 103 { \
<> 144:ef7eb2e8f9f7 104 kCLOCK_PortA, kCLOCK_PortB, kCLOCK_PortC, kCLOCK_PortD, kCLOCK_PortE \
<> 144:ef7eb2e8f9f7 105 }
<> 144:ef7eb2e8f9f7 106
<> 144:ef7eb2e8f9f7 107 /*! @brief Clock ip name array for SAI. */
<> 144:ef7eb2e8f9f7 108 #define SAI_CLOCKS \
<> 144:ef7eb2e8f9f7 109 { \
<> 144:ef7eb2e8f9f7 110 kCLOCK_Sai0 \
<> 144:ef7eb2e8f9f7 111 }
<> 144:ef7eb2e8f9f7 112
<> 144:ef7eb2e8f9f7 113 /*! @brief Clock ip name array for FLEXBUS. */
<> 144:ef7eb2e8f9f7 114 #define FLEXBUS_CLOCKS \
<> 144:ef7eb2e8f9f7 115 { \
<> 144:ef7eb2e8f9f7 116 kCLOCK_Flexbus0 \
<> 144:ef7eb2e8f9f7 117 }
<> 144:ef7eb2e8f9f7 118
<> 144:ef7eb2e8f9f7 119 /*! @brief Clock ip name array for TSI. */
<> 144:ef7eb2e8f9f7 120 #define TSI_CLOCKS \
<> 144:ef7eb2e8f9f7 121 { \
<> 144:ef7eb2e8f9f7 122 kCLOCK_Tsi0 \
<> 144:ef7eb2e8f9f7 123 }
<> 144:ef7eb2e8f9f7 124
<> 144:ef7eb2e8f9f7 125 /*! @brief Clock ip name array for LPUART. */
<> 144:ef7eb2e8f9f7 126 #define LPUART_CLOCKS \
<> 144:ef7eb2e8f9f7 127 { \
<> 144:ef7eb2e8f9f7 128 kCLOCK_Lpuart0 \
<> 144:ef7eb2e8f9f7 129 }
<> 144:ef7eb2e8f9f7 130
<> 144:ef7eb2e8f9f7 131 /*! @brief Clock ip name array for EWM. */
<> 144:ef7eb2e8f9f7 132 #define EWM_CLOCKS \
<> 144:ef7eb2e8f9f7 133 { \
<> 144:ef7eb2e8f9f7 134 kCLOCK_Ewm0 \
<> 144:ef7eb2e8f9f7 135 }
<> 144:ef7eb2e8f9f7 136
<> 144:ef7eb2e8f9f7 137 /*! @brief Clock ip name array for PIT. */
<> 144:ef7eb2e8f9f7 138 #define PIT_CLOCKS \
<> 144:ef7eb2e8f9f7 139 { \
<> 144:ef7eb2e8f9f7 140 kCLOCK_Pit0 \
<> 144:ef7eb2e8f9f7 141 }
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 /*! @brief Clock ip name array for DSPI. */
<> 144:ef7eb2e8f9f7 144 #define DSPI_CLOCKS \
<> 144:ef7eb2e8f9f7 145 { \
<> 144:ef7eb2e8f9f7 146 kCLOCK_Spi0, kCLOCK_Spi1, kCLOCK_Spi2 \
<> 144:ef7eb2e8f9f7 147 }
<> 144:ef7eb2e8f9f7 148
<> 144:ef7eb2e8f9f7 149 /*! @brief Clock ip name array for LPTMR. */
<> 144:ef7eb2e8f9f7 150 #define LPTMR_CLOCKS \
<> 144:ef7eb2e8f9f7 151 { \
<> 144:ef7eb2e8f9f7 152 kCLOCK_Lptmr0 \
<> 144:ef7eb2e8f9f7 153 }
<> 144:ef7eb2e8f9f7 154
<> 144:ef7eb2e8f9f7 155 /*! @brief Clock ip name array for SDHC. */
<> 144:ef7eb2e8f9f7 156 #define SDHC_CLOCKS \
<> 144:ef7eb2e8f9f7 157 { \
<> 144:ef7eb2e8f9f7 158 kCLOCK_Sdhc0 \
<> 144:ef7eb2e8f9f7 159 }
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 /*! @brief Clock ip name array for FTM. */
<> 144:ef7eb2e8f9f7 162 #define FTM_CLOCKS \
<> 144:ef7eb2e8f9f7 163 { \
<> 144:ef7eb2e8f9f7 164 kCLOCK_Ftm0, kCLOCK_Ftm1, kCLOCK_Ftm2, kCLOCK_Ftm3 \
<> 144:ef7eb2e8f9f7 165 }
<> 144:ef7eb2e8f9f7 166
<> 144:ef7eb2e8f9f7 167 /*! @brief Clock ip name array for EDMA. */
<> 144:ef7eb2e8f9f7 168 #define EDMA_CLOCKS \
<> 144:ef7eb2e8f9f7 169 { \
<> 144:ef7eb2e8f9f7 170 kCLOCK_Dma0 \
<> 144:ef7eb2e8f9f7 171 }
<> 144:ef7eb2e8f9f7 172
<> 144:ef7eb2e8f9f7 173 /*! @brief Clock ip name array for FLEXCAN. */
<> 144:ef7eb2e8f9f7 174 #define FLEXCAN_CLOCKS \
<> 144:ef7eb2e8f9f7 175 { \
<> 144:ef7eb2e8f9f7 176 kCLOCK_Flexcan0, kCLOCK_Flexcan1 \
<> 144:ef7eb2e8f9f7 177 }
<> 144:ef7eb2e8f9f7 178
<> 144:ef7eb2e8f9f7 179 /*! @brief Clock ip name array for DAC. */
<> 144:ef7eb2e8f9f7 180 #define DAC_CLOCKS \
<> 144:ef7eb2e8f9f7 181 { \
<> 144:ef7eb2e8f9f7 182 kCLOCK_Dac0, kCLOCK_Dac1 \
<> 144:ef7eb2e8f9f7 183 }
<> 144:ef7eb2e8f9f7 184
<> 144:ef7eb2e8f9f7 185 /*! @brief Clock ip name array for ADC16. */
<> 144:ef7eb2e8f9f7 186 #define ADC16_CLOCKS \
<> 144:ef7eb2e8f9f7 187 { \
<> 144:ef7eb2e8f9f7 188 kCLOCK_Adc0, kCLOCK_Adc1 \
<> 144:ef7eb2e8f9f7 189 }
<> 144:ef7eb2e8f9f7 190
<> 144:ef7eb2e8f9f7 191 /*! @brief Clock ip name array for SDRAM. */
<> 144:ef7eb2e8f9f7 192 #define SDRAM_CLOCKS \
<> 144:ef7eb2e8f9f7 193 { \
<> 144:ef7eb2e8f9f7 194 kCLOCK_Sdramc0 \
<> 144:ef7eb2e8f9f7 195 }
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 /*! @brief Clock ip name array for MMCAU. */
<> 144:ef7eb2e8f9f7 198 #define MMCAU_CLOCKS \
<> 144:ef7eb2e8f9f7 199 { \
<> 144:ef7eb2e8f9f7 200 kCLOCK_Mmcau0 \
<> 144:ef7eb2e8f9f7 201 }
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 /*! @brief Clock ip name array for MPU. */
<> 144:ef7eb2e8f9f7 204 #define MPU_CLOCKS \
<> 144:ef7eb2e8f9f7 205 { \
<> 144:ef7eb2e8f9f7 206 kCLOCK_Mpu0 \
<> 144:ef7eb2e8f9f7 207 }
<> 144:ef7eb2e8f9f7 208
<> 144:ef7eb2e8f9f7 209 /*! @brief Clock ip name array for VREF. */
<> 144:ef7eb2e8f9f7 210 #define VREF_CLOCKS \
<> 144:ef7eb2e8f9f7 211 { \
<> 144:ef7eb2e8f9f7 212 kCLOCK_Vref0 \
<> 144:ef7eb2e8f9f7 213 }
<> 144:ef7eb2e8f9f7 214
<> 144:ef7eb2e8f9f7 215 /*! @brief Clock ip name array for CMT. */
<> 144:ef7eb2e8f9f7 216 #define CMT_CLOCKS \
<> 144:ef7eb2e8f9f7 217 { \
<> 144:ef7eb2e8f9f7 218 kCLOCK_Cmt0 \
<> 144:ef7eb2e8f9f7 219 }
<> 144:ef7eb2e8f9f7 220
<> 144:ef7eb2e8f9f7 221 /*! @brief Clock ip name array for UART. */
<> 144:ef7eb2e8f9f7 222 #define UART_CLOCKS \
<> 144:ef7eb2e8f9f7 223 { \
<> 144:ef7eb2e8f9f7 224 kCLOCK_Uart0, kCLOCK_Uart1, kCLOCK_Uart2, kCLOCK_Uart3, kCLOCK_Uart4 \
<> 144:ef7eb2e8f9f7 225 }
<> 144:ef7eb2e8f9f7 226
<> 144:ef7eb2e8f9f7 227 /*! @brief Clock ip name array for TPM. */
<> 144:ef7eb2e8f9f7 228 #define TPM_CLOCKS \
<> 144:ef7eb2e8f9f7 229 { \
<> 144:ef7eb2e8f9f7 230 kCLOCK_IpInvalid, kCLOCK_Tpm1, kCLOCK_Tpm2 \
<> 144:ef7eb2e8f9f7 231 }
<> 144:ef7eb2e8f9f7 232
<> 144:ef7eb2e8f9f7 233 /*! @brief Clock ip name array for RNGA. */
<> 144:ef7eb2e8f9f7 234 #define RNGA_CLOCKS \
<> 144:ef7eb2e8f9f7 235 { \
<> 144:ef7eb2e8f9f7 236 kCLOCK_Rnga0 \
<> 144:ef7eb2e8f9f7 237 }
<> 144:ef7eb2e8f9f7 238
<> 144:ef7eb2e8f9f7 239 /*! @brief Clock ip name array for CRC. */
<> 144:ef7eb2e8f9f7 240 #define CRC_CLOCKS \
<> 144:ef7eb2e8f9f7 241 { \
<> 144:ef7eb2e8f9f7 242 kCLOCK_Crc0 \
<> 144:ef7eb2e8f9f7 243 }
<> 144:ef7eb2e8f9f7 244
<> 144:ef7eb2e8f9f7 245 /*! @brief Clock ip name array for LMEM. */
<> 144:ef7eb2e8f9f7 246 #define LMEM_CLOCKS \
<> 144:ef7eb2e8f9f7 247 { \
<> 144:ef7eb2e8f9f7 248 kCLOCK_Lmem0 \
<> 144:ef7eb2e8f9f7 249 }
<> 144:ef7eb2e8f9f7 250
<> 144:ef7eb2e8f9f7 251 /*! @brief Clock ip name array for I2C. */
<> 144:ef7eb2e8f9f7 252 #define I2C_CLOCKS \
<> 144:ef7eb2e8f9f7 253 { \
<> 144:ef7eb2e8f9f7 254 kCLOCK_I2c0, kCLOCK_I2c1, kCLOCK_I2c2, kCLOCK_I2c3 \
<> 144:ef7eb2e8f9f7 255 }
<> 144:ef7eb2e8f9f7 256
<> 144:ef7eb2e8f9f7 257 /*! @brief Clock ip name array for PDB. */
<> 144:ef7eb2e8f9f7 258 #define PDB_CLOCKS \
<> 144:ef7eb2e8f9f7 259 { \
<> 144:ef7eb2e8f9f7 260 kCLOCK_Pdb0 \
<> 144:ef7eb2e8f9f7 261 }
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 /*! @brief Clock ip name array for FTF. */
<> 144:ef7eb2e8f9f7 264 #define FTF_CLOCKS \
<> 144:ef7eb2e8f9f7 265 { \
<> 144:ef7eb2e8f9f7 266 kCLOCK_Ftf0 \
<> 144:ef7eb2e8f9f7 267 }
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 /*! @brief Clock ip name array for CMP. */
<> 144:ef7eb2e8f9f7 270 #define CMP_CLOCKS \
<> 144:ef7eb2e8f9f7 271 { \
<> 144:ef7eb2e8f9f7 272 kCLOCK_Cmp0, kCLOCK_Cmp1, kCLOCK_Cmp2 \
<> 144:ef7eb2e8f9f7 273 }
<> 144:ef7eb2e8f9f7 274
<> 144:ef7eb2e8f9f7 275 /*!
<> 144:ef7eb2e8f9f7 276 * @brief LPO clock frequency.
<> 144:ef7eb2e8f9f7 277 */
<> 144:ef7eb2e8f9f7 278 #define LPO_CLK_FREQ 1000U
<> 144:ef7eb2e8f9f7 279
<> 144:ef7eb2e8f9f7 280 /*! @brief Peripherals clock source definition. */
<> 144:ef7eb2e8f9f7 281 #define SYS_CLK kCLOCK_CoreSysClk
<> 144:ef7eb2e8f9f7 282 #define BUS_CLK kCLOCK_BusClk
<> 144:ef7eb2e8f9f7 283
<> 144:ef7eb2e8f9f7 284 #define I2C0_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 285 #define I2C1_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 286 #define I2C2_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 287 #define I2C3_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 288 #define DSPI0_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 289 #define DSPI1_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 290 #define DSPI2_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 291 #define UART0_CLK_SRC SYS_CLK
<> 144:ef7eb2e8f9f7 292 #define UART1_CLK_SRC SYS_CLK
<> 144:ef7eb2e8f9f7 293 #define UART2_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 294 #define UART3_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 295 #define UART4_CLK_SRC BUS_CLK
<> 144:ef7eb2e8f9f7 296
<> 144:ef7eb2e8f9f7 297 /*! @brief Clock name used to get clock frequency. */
<> 144:ef7eb2e8f9f7 298 typedef enum _clock_name
<> 144:ef7eb2e8f9f7 299 {
<> 144:ef7eb2e8f9f7 300
<> 144:ef7eb2e8f9f7 301 /* ----------------------------- System layer clock -------------------------------*/
<> 144:ef7eb2e8f9f7 302 kCLOCK_CoreSysClk, /*!< Core/system clock */
<> 144:ef7eb2e8f9f7 303 kCLOCK_PlatClk, /*!< Platform clock */
<> 144:ef7eb2e8f9f7 304 kCLOCK_BusClk, /*!< Bus clock */
<> 144:ef7eb2e8f9f7 305 kCLOCK_FlexBusClk, /*!< FlexBus clock */
<> 144:ef7eb2e8f9f7 306 kCLOCK_FlashClk, /*!< Flash clock */
<> 144:ef7eb2e8f9f7 307 kCLOCK_FastPeriphClk, /*!< Fast peripheral clock */
<> 144:ef7eb2e8f9f7 308 kCLOCK_PllFllSelClk, /*!< The clock after SIM[PLLFLLSEL]. */
<> 144:ef7eb2e8f9f7 309
<> 144:ef7eb2e8f9f7 310 /* ---------------------------------- OSC clock -----------------------------------*/
<> 144:ef7eb2e8f9f7 311 kCLOCK_Er32kClk, /*!< External reference 32K clock (ERCLK32K) */
<> 144:ef7eb2e8f9f7 312 kCLOCK_Osc0ErClk, /*!< OSC0 external reference clock (OSC0ERCLK) */
<> 144:ef7eb2e8f9f7 313 kCLOCK_Osc1ErClk, /*!< OSC1 external reference clock (OSC1ERCLK) */
<> 144:ef7eb2e8f9f7 314 kCLOCK_Osc0ErClkUndiv, /*!< OSC0 external reference undivided clock(OSC0ERCLK_UNDIV). */
<> 144:ef7eb2e8f9f7 315
<> 144:ef7eb2e8f9f7 316 /* ----------------------------- MCG and MCG-Lite clock ---------------------------*/
<> 144:ef7eb2e8f9f7 317 kCLOCK_McgFixedFreqClk, /*!< MCG fixed frequency clock (MCGFFCLK) */
<> 144:ef7eb2e8f9f7 318 kCLOCK_McgInternalRefClk, /*!< MCG internal reference clock (MCGIRCLK) */
<> 144:ef7eb2e8f9f7 319 kCLOCK_McgFllClk, /*!< MCGFLLCLK */
<> 144:ef7eb2e8f9f7 320 kCLOCK_McgPll0Clk, /*!< MCGPLL0CLK */
<> 144:ef7eb2e8f9f7 321 kCLOCK_McgPll1Clk, /*!< MCGPLL1CLK */
<> 144:ef7eb2e8f9f7 322 kCLOCK_McgExtPllClk, /*!< EXT_PLLCLK */
<> 144:ef7eb2e8f9f7 323 kCLOCK_McgPeriphClk, /*!< MCG peripheral clock (MCGPCLK) */
<> 144:ef7eb2e8f9f7 324 kCLOCK_McgIrc48MClk, /*!< MCG IRC48M clock */
<> 144:ef7eb2e8f9f7 325
<> 144:ef7eb2e8f9f7 326 /* --------------------------------- Other clock ----------------------------------*/
<> 144:ef7eb2e8f9f7 327 kCLOCK_LpoClk, /*!< LPO clock */
<> 144:ef7eb2e8f9f7 328
<> 144:ef7eb2e8f9f7 329 } clock_name_t;
<> 144:ef7eb2e8f9f7 330
<> 144:ef7eb2e8f9f7 331 /*! @brief USB clock source definition. */
<> 144:ef7eb2e8f9f7 332 typedef enum _clock_usb_src
<> 144:ef7eb2e8f9f7 333 {
<> 144:ef7eb2e8f9f7 334 kCLOCK_UsbSrcPll0 = SIM_SOPT2_USBSRC(1U) | SIM_SOPT2_PLLFLLSEL(1U), /*!< Use PLL0. */
<> 144:ef7eb2e8f9f7 335 kCLOCK_UsbSrcUsbPfd = SIM_SOPT2_USBSRC(1U) | SIM_SOPT2_PLLFLLSEL(2U), /*!< Use USBPFDCLK. */
<> 144:ef7eb2e8f9f7 336 kCLOCK_UsbSrcIrc48M = SIM_SOPT2_USBSRC(1U) | SIM_SOPT2_PLLFLLSEL(3U), /*!< Use IRC48M. */
<> 144:ef7eb2e8f9f7 337 kCLOCK_UsbSrcExt = SIM_SOPT2_USBSRC(0U) /*!< Use USB_CLKIN. */
<> 144:ef7eb2e8f9f7 338 } clock_usb_src_t;
<> 144:ef7eb2e8f9f7 339
<> 144:ef7eb2e8f9f7 340 /*------------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 341
<> 144:ef7eb2e8f9f7 342 clock_gate_t definition:
<> 144:ef7eb2e8f9f7 343
<> 144:ef7eb2e8f9f7 344 31 16 0
<> 144:ef7eb2e8f9f7 345 -----------------------------------------------------------------
<> 144:ef7eb2e8f9f7 346 | SIM_SCGC register offset | control bit offset in SCGC |
<> 144:ef7eb2e8f9f7 347 -----------------------------------------------------------------
<> 144:ef7eb2e8f9f7 348
<> 144:ef7eb2e8f9f7 349 For example, the SDHC clock gate is controlled by SIM_SCGC3[17], the
<> 144:ef7eb2e8f9f7 350 SIM_SCGC3 offset in SIM is 0x1030, then kClockGateSdhc0 is defined as
<> 144:ef7eb2e8f9f7 351
<> 144:ef7eb2e8f9f7 352 kClockGateSdhc0 = (0x1030 << 16) | 17;
<> 144:ef7eb2e8f9f7 353
<> 144:ef7eb2e8f9f7 354 ------------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 355
<> 144:ef7eb2e8f9f7 356 #define CLK_GATE_REG_OFFSET_SHIFT 16U
<> 144:ef7eb2e8f9f7 357 #define CLK_GATE_REG_OFFSET_MASK 0xFFFF0000U
<> 144:ef7eb2e8f9f7 358 #define CLK_GATE_BIT_SHIFT_SHIFT 0U
<> 144:ef7eb2e8f9f7 359 #define CLK_GATE_BIT_SHIFT_MASK 0x0000FFFFU
<> 144:ef7eb2e8f9f7 360
<> 144:ef7eb2e8f9f7 361 #define CLK_GATE_DEFINE(reg_offset, bit_shift) \
<> 144:ef7eb2e8f9f7 362 ((((reg_offset) << CLK_GATE_REG_OFFSET_SHIFT) & CLK_GATE_REG_OFFSET_MASK) | \
<> 144:ef7eb2e8f9f7 363 (((bit_shift) << CLK_GATE_BIT_SHIFT_SHIFT) & CLK_GATE_BIT_SHIFT_MASK))
<> 144:ef7eb2e8f9f7 364
<> 144:ef7eb2e8f9f7 365 #define CLK_GATE_ABSTRACT_REG_OFFSET(x) (((x)&CLK_GATE_REG_OFFSET_MASK) >> CLK_GATE_REG_OFFSET_SHIFT)
<> 144:ef7eb2e8f9f7 366 #define CLK_GATE_ABSTRACT_BITS_SHIFT(x) (((x)&CLK_GATE_BIT_SHIFT_MASK) >> CLK_GATE_BIT_SHIFT_SHIFT)
<> 144:ef7eb2e8f9f7 367
<> 144:ef7eb2e8f9f7 368 /*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */
<> 144:ef7eb2e8f9f7 369 typedef enum _clock_ip_name
<> 144:ef7eb2e8f9f7 370 {
<> 144:ef7eb2e8f9f7 371 kCLOCK_IpInvalid = 0U,
<> 144:ef7eb2e8f9f7 372 kCLOCK_I2c2 = CLK_GATE_DEFINE(0x1028U, 6U),
<> 144:ef7eb2e8f9f7 373 kCLOCK_I2c3 = CLK_GATE_DEFINE(0x1028U, 7U),
<> 144:ef7eb2e8f9f7 374 kCLOCK_Uart4 = CLK_GATE_DEFINE(0x1028U, 10U),
<> 144:ef7eb2e8f9f7 375
<> 144:ef7eb2e8f9f7 376 kCLOCK_Enet0 = CLK_GATE_DEFINE(0x102CU, 0U),
<> 144:ef7eb2e8f9f7 377 kCLOCK_Lpuart0 = CLK_GATE_DEFINE(0x102CU, 4U),
<> 144:ef7eb2e8f9f7 378 kCLOCK_Tpm1 = CLK_GATE_DEFINE(0x102CU, 9U),
<> 144:ef7eb2e8f9f7 379 kCLOCK_Tpm2 = CLK_GATE_DEFINE(0x102CU, 10U),
<> 144:ef7eb2e8f9f7 380 kCLOCK_Dac0 = CLK_GATE_DEFINE(0x102CU, 12U),
<> 144:ef7eb2e8f9f7 381 kCLOCK_Dac1 = CLK_GATE_DEFINE(0x102CU, 13U),
<> 144:ef7eb2e8f9f7 382
<> 144:ef7eb2e8f9f7 383 kCLOCK_Rnga0 = CLK_GATE_DEFINE(0x1030U, 0U),
<> 144:ef7eb2e8f9f7 384 kCLOCK_Usbhs0 = CLK_GATE_DEFINE(0x1030U, 1U),
<> 144:ef7eb2e8f9f7 385 kCLOCK_UsbhsPhy0 = CLK_GATE_DEFINE(0x1030U, 2U),
<> 144:ef7eb2e8f9f7 386 kCLOCK_UsbhsDcd0 = CLK_GATE_DEFINE(0x1030U, 3U),
<> 144:ef7eb2e8f9f7 387 kCLOCK_Flexcan1 = CLK_GATE_DEFINE(0x1030U, 4U),
<> 144:ef7eb2e8f9f7 388 kCLOCK_Spi2 = CLK_GATE_DEFINE(0x1030U, 12U),
<> 144:ef7eb2e8f9f7 389 kCLOCK_Sdhc0 = CLK_GATE_DEFINE(0x1030U, 17U),
<> 144:ef7eb2e8f9f7 390 kCLOCK_Ftm3 = CLK_GATE_DEFINE(0x1030U, 25U),
<> 144:ef7eb2e8f9f7 391 kCLOCK_Adc1 = CLK_GATE_DEFINE(0x1030U, 27U),
<> 144:ef7eb2e8f9f7 392
<> 144:ef7eb2e8f9f7 393 kCLOCK_Ewm0 = CLK_GATE_DEFINE(0x1034U, 1U),
<> 144:ef7eb2e8f9f7 394 kCLOCK_Cmt0 = CLK_GATE_DEFINE(0x1034U, 2U),
<> 144:ef7eb2e8f9f7 395 kCLOCK_I2c0 = CLK_GATE_DEFINE(0x1034U, 6U),
<> 144:ef7eb2e8f9f7 396 kCLOCK_I2c1 = CLK_GATE_DEFINE(0x1034U, 7U),
<> 144:ef7eb2e8f9f7 397 kCLOCK_Uart0 = CLK_GATE_DEFINE(0x1034U, 10U),
<> 144:ef7eb2e8f9f7 398 kCLOCK_Uart1 = CLK_GATE_DEFINE(0x1034U, 11U),
<> 144:ef7eb2e8f9f7 399 kCLOCK_Uart2 = CLK_GATE_DEFINE(0x1034U, 12U),
<> 144:ef7eb2e8f9f7 400 kCLOCK_Uart3 = CLK_GATE_DEFINE(0x1034U, 13U),
<> 144:ef7eb2e8f9f7 401 kCLOCK_Usbfs0 = CLK_GATE_DEFINE(0x1034U, 18U),
<> 144:ef7eb2e8f9f7 402 kCLOCK_Cmp0 = CLK_GATE_DEFINE(0x1034U, 19U),
<> 144:ef7eb2e8f9f7 403 kCLOCK_Cmp1 = CLK_GATE_DEFINE(0x1034U, 19U),
<> 144:ef7eb2e8f9f7 404 kCLOCK_Cmp2 = CLK_GATE_DEFINE(0x1034U, 19U),
<> 144:ef7eb2e8f9f7 405 kCLOCK_Vref0 = CLK_GATE_DEFINE(0x1034U, 20U),
<> 144:ef7eb2e8f9f7 406
<> 144:ef7eb2e8f9f7 407 kCLOCK_Lptmr0 = CLK_GATE_DEFINE(0x1038U, 0U),
<> 144:ef7eb2e8f9f7 408 kCLOCK_Tsi0 = CLK_GATE_DEFINE(0x1038U, 5U),
<> 144:ef7eb2e8f9f7 409 kCLOCK_PortA = CLK_GATE_DEFINE(0x1038U, 9U),
<> 144:ef7eb2e8f9f7 410 kCLOCK_PortB = CLK_GATE_DEFINE(0x1038U, 10U),
<> 144:ef7eb2e8f9f7 411 kCLOCK_PortC = CLK_GATE_DEFINE(0x1038U, 11U),
<> 144:ef7eb2e8f9f7 412 kCLOCK_PortD = CLK_GATE_DEFINE(0x1038U, 12U),
<> 144:ef7eb2e8f9f7 413 kCLOCK_PortE = CLK_GATE_DEFINE(0x1038U, 13U),
<> 144:ef7eb2e8f9f7 414
<> 144:ef7eb2e8f9f7 415 kCLOCK_Ftf0 = CLK_GATE_DEFINE(0x103CU, 0U),
<> 144:ef7eb2e8f9f7 416 kCLOCK_Dmamux0 = CLK_GATE_DEFINE(0x103CU, 1U),
<> 144:ef7eb2e8f9f7 417 kCLOCK_Flexcan0 = CLK_GATE_DEFINE(0x103CU, 4U),
<> 144:ef7eb2e8f9f7 418 kCLOCK_Spi0 = CLK_GATE_DEFINE(0x103CU, 12U),
<> 144:ef7eb2e8f9f7 419 kCLOCK_Spi1 = CLK_GATE_DEFINE(0x103CU, 13U),
<> 144:ef7eb2e8f9f7 420 kCLOCK_Sai0 = CLK_GATE_DEFINE(0x103CU, 15U),
<> 144:ef7eb2e8f9f7 421 kCLOCK_Crc0 = CLK_GATE_DEFINE(0x103CU, 18U),
<> 144:ef7eb2e8f9f7 422 kCLOCK_Usbdcd0 = CLK_GATE_DEFINE(0x103CU, 21U),
<> 144:ef7eb2e8f9f7 423 kCLOCK_Pdb0 = CLK_GATE_DEFINE(0x103CU, 22U),
<> 144:ef7eb2e8f9f7 424 kCLOCK_Pit0 = CLK_GATE_DEFINE(0x103CU, 23U),
<> 144:ef7eb2e8f9f7 425 kCLOCK_Ftm0 = CLK_GATE_DEFINE(0x103CU, 24U),
<> 144:ef7eb2e8f9f7 426 kCLOCK_Ftm1 = CLK_GATE_DEFINE(0x103CU, 25U),
<> 144:ef7eb2e8f9f7 427 kCLOCK_Ftm2 = CLK_GATE_DEFINE(0x103CU, 26U),
<> 144:ef7eb2e8f9f7 428 kCLOCK_Adc0 = CLK_GATE_DEFINE(0x103CU, 27U),
<> 144:ef7eb2e8f9f7 429 kCLOCK_Rtc0 = CLK_GATE_DEFINE(0x103CU, 29U),
<> 144:ef7eb2e8f9f7 430
<> 144:ef7eb2e8f9f7 431 kCLOCK_Flexbus0 = CLK_GATE_DEFINE(0x1040U, 0U),
<> 144:ef7eb2e8f9f7 432 kCLOCK_Dma0 = CLK_GATE_DEFINE(0x1040U, 1U),
<> 144:ef7eb2e8f9f7 433 kCLOCK_Mpu0 = CLK_GATE_DEFINE(0x1040U, 2U),
<> 144:ef7eb2e8f9f7 434 kCLOCK_Sdramc0 = CLK_GATE_DEFINE(0x1040U, 3U),
<> 144:ef7eb2e8f9f7 435 } clock_ip_name_t;
<> 144:ef7eb2e8f9f7 436
<> 144:ef7eb2e8f9f7 437 /*!@brief SIM configuration structure for clock setting. */
<> 144:ef7eb2e8f9f7 438 typedef struct _sim_clock_config
<> 144:ef7eb2e8f9f7 439 {
<> 144:ef7eb2e8f9f7 440 uint8_t pllFllSel; /*!< PLL/FLL/IRC48M selection. */
<> 144:ef7eb2e8f9f7 441 uint8_t pllFllDiv; /*!< PLLFLLSEL clock divider divisor. */
<> 144:ef7eb2e8f9f7 442 uint8_t pllFllFrac; /*!< PLLFLLSEL clock divider fraction. */
<> 144:ef7eb2e8f9f7 443 uint8_t er32kSrc; /*!< ERCLK32K source selection. */
<> 144:ef7eb2e8f9f7 444 uint32_t clkdiv1; /*!< SIM_CLKDIV1. */
<> 144:ef7eb2e8f9f7 445 } sim_clock_config_t;
<> 144:ef7eb2e8f9f7 446
<> 144:ef7eb2e8f9f7 447 /*! @brief OSC work mode. */
<> 144:ef7eb2e8f9f7 448 typedef enum _osc_mode
<> 144:ef7eb2e8f9f7 449 {
<> 144:ef7eb2e8f9f7 450 kOSC_ModeExt = 0U, /*!< Use external clock. */
<> 144:ef7eb2e8f9f7 451 #if (defined(MCG_C2_EREFS_MASK) && !(defined(MCG_C2_EREFS0_MASK)))
<> 144:ef7eb2e8f9f7 452 kOSC_ModeOscLowPower = MCG_C2_EREFS_MASK, /*!< Oscillator low power. */
<> 144:ef7eb2e8f9f7 453 #else
<> 144:ef7eb2e8f9f7 454 kOSC_ModeOscLowPower = MCG_C2_EREFS0_MASK, /*!< Oscillator low power. */
<> 144:ef7eb2e8f9f7 455 #endif
<> 144:ef7eb2e8f9f7 456 kOSC_ModeOscHighGain = 0U
<> 144:ef7eb2e8f9f7 457 #if (defined(MCG_C2_EREFS_MASK) && !(defined(MCG_C2_EREFS0_MASK)))
<> 144:ef7eb2e8f9f7 458 |
<> 144:ef7eb2e8f9f7 459 MCG_C2_EREFS_MASK
<> 144:ef7eb2e8f9f7 460 #else
<> 144:ef7eb2e8f9f7 461 |
<> 144:ef7eb2e8f9f7 462 MCG_C2_EREFS0_MASK
<> 144:ef7eb2e8f9f7 463 #endif
<> 144:ef7eb2e8f9f7 464 #if (defined(MCG_C2_HGO_MASK) && !(defined(MCG_C2_HGO0_MASK)))
<> 144:ef7eb2e8f9f7 465 |
<> 144:ef7eb2e8f9f7 466 MCG_C2_HGO_MASK, /*!< Oscillator high gain. */
<> 144:ef7eb2e8f9f7 467 #else
<> 144:ef7eb2e8f9f7 468 |
<> 144:ef7eb2e8f9f7 469 MCG_C2_HGO0_MASK, /*!< Oscillator high gain. */
<> 144:ef7eb2e8f9f7 470 #endif
<> 144:ef7eb2e8f9f7 471 } osc_mode_t;
<> 144:ef7eb2e8f9f7 472
<> 144:ef7eb2e8f9f7 473 /*! @brief Oscillator capacitor load setting.*/
<> 144:ef7eb2e8f9f7 474 enum _osc_cap_load
<> 144:ef7eb2e8f9f7 475 {
<> 144:ef7eb2e8f9f7 476 kOSC_Cap2P = OSC_CR_SC2P_MASK, /*!< 2 pF capacitor load */
<> 144:ef7eb2e8f9f7 477 kOSC_Cap4P = OSC_CR_SC4P_MASK, /*!< 4 pF capacitor load */
<> 144:ef7eb2e8f9f7 478 kOSC_Cap8P = OSC_CR_SC8P_MASK, /*!< 8 pF capacitor load */
<> 144:ef7eb2e8f9f7 479 kOSC_Cap16P = OSC_CR_SC16P_MASK /*!< 16 pF capacitor load */
<> 144:ef7eb2e8f9f7 480 };
<> 144:ef7eb2e8f9f7 481
<> 144:ef7eb2e8f9f7 482 /*! @brief OSCERCLK enable mode. */
<> 144:ef7eb2e8f9f7 483 enum _oscer_enable_mode
<> 144:ef7eb2e8f9f7 484 {
<> 144:ef7eb2e8f9f7 485 kOSC_ErClkEnable = OSC_CR_ERCLKEN_MASK, /*!< Enable. */
<> 144:ef7eb2e8f9f7 486 kOSC_ErClkEnableInStop = OSC_CR_EREFSTEN_MASK /*!< Enable in stop mode. */
<> 144:ef7eb2e8f9f7 487 };
<> 144:ef7eb2e8f9f7 488
<> 144:ef7eb2e8f9f7 489 /*! @brief OSC configuration for OSCERCLK. */
<> 144:ef7eb2e8f9f7 490 typedef struct _oscer_config
<> 144:ef7eb2e8f9f7 491 {
<> 144:ef7eb2e8f9f7 492 uint8_t enableMode; /*!< OSCERCLK enable mode. OR'ed value of @ref _oscer_enable_mode. */
<> 144:ef7eb2e8f9f7 493
<> 144:ef7eb2e8f9f7 494 uint8_t erclkDiv; /*!< Divider for OSCERCLK.*/
<> 144:ef7eb2e8f9f7 495 } oscer_config_t;
<> 144:ef7eb2e8f9f7 496
<> 144:ef7eb2e8f9f7 497 /*!
<> 144:ef7eb2e8f9f7 498 * @brief OSC Initialization Configuration Structure
<> 144:ef7eb2e8f9f7 499 *
<> 144:ef7eb2e8f9f7 500 * Defines the configuration data structure to initialize the OSC.
<> 144:ef7eb2e8f9f7 501 * When porting to a new board, please set the following members
<> 144:ef7eb2e8f9f7 502 * according to board setting:
<> 144:ef7eb2e8f9f7 503 * 1. freq: The external frequency.
<> 144:ef7eb2e8f9f7 504 * 2. workMode: The OSC module mode.
<> 144:ef7eb2e8f9f7 505 */
<> 144:ef7eb2e8f9f7 506 typedef struct _osc_config
<> 144:ef7eb2e8f9f7 507 {
<> 144:ef7eb2e8f9f7 508 uint32_t freq; /*!< External clock frequency. */
<> 144:ef7eb2e8f9f7 509 uint8_t capLoad; /*!< Capacitor load setting. */
<> 144:ef7eb2e8f9f7 510 osc_mode_t workMode; /*!< OSC work mode setting. */
<> 144:ef7eb2e8f9f7 511 oscer_config_t oscerConfig; /*!< Configuration for OSCERCLK. */
<> 144:ef7eb2e8f9f7 512 } osc_config_t;
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514 /*! @brief MCG FLL reference clock source select. */
<> 144:ef7eb2e8f9f7 515 typedef enum _mcg_fll_src
<> 144:ef7eb2e8f9f7 516 {
<> 144:ef7eb2e8f9f7 517 kMCG_FllSrcExternal, /*!< External reference clock is selected */
<> 144:ef7eb2e8f9f7 518 kMCG_FllSrcInternal /*!< The slow internal reference clock is selected */
<> 144:ef7eb2e8f9f7 519 } mcg_fll_src_t;
<> 144:ef7eb2e8f9f7 520
<> 144:ef7eb2e8f9f7 521 /*! @brief MCG internal reference clock select */
<> 144:ef7eb2e8f9f7 522 typedef enum _mcg_irc_mode
<> 144:ef7eb2e8f9f7 523 {
<> 144:ef7eb2e8f9f7 524 kMCG_IrcSlow, /*!< Slow internal reference clock selected */
<> 144:ef7eb2e8f9f7 525 kMCG_IrcFast /*!< Fast internal reference clock selected */
<> 144:ef7eb2e8f9f7 526 } mcg_irc_mode_t;
<> 144:ef7eb2e8f9f7 527
<> 144:ef7eb2e8f9f7 528 /*! @brief MCG DCO Maximum Frequency with 32.768 kHz Reference */
<> 144:ef7eb2e8f9f7 529 typedef enum _mcg_dmx32
<> 144:ef7eb2e8f9f7 530 {
<> 144:ef7eb2e8f9f7 531 kMCG_Dmx32Default, /*!< DCO has a default range of 25% */
<> 144:ef7eb2e8f9f7 532 kMCG_Dmx32Fine /*!< DCO is fine-tuned for maximum frequency with 32.768 kHz reference */
<> 144:ef7eb2e8f9f7 533 } mcg_dmx32_t;
<> 144:ef7eb2e8f9f7 534
<> 144:ef7eb2e8f9f7 535 /*! @brief MCG DCO range select */
<> 144:ef7eb2e8f9f7 536 typedef enum _mcg_drs
<> 144:ef7eb2e8f9f7 537 {
<> 144:ef7eb2e8f9f7 538 kMCG_DrsLow, /*!< Low frequency range */
<> 144:ef7eb2e8f9f7 539 kMCG_DrsMid, /*!< Mid frequency range */
<> 144:ef7eb2e8f9f7 540 kMCG_DrsMidHigh, /*!< Mid-High frequency range */
<> 144:ef7eb2e8f9f7 541 kMCG_DrsHigh /*!< High frequency range */
<> 144:ef7eb2e8f9f7 542 } mcg_drs_t;
<> 144:ef7eb2e8f9f7 543
<> 144:ef7eb2e8f9f7 544 /*! @brief MCG PLL reference clock select */
<> 144:ef7eb2e8f9f7 545 typedef enum _mcg_pll_ref_src
<> 144:ef7eb2e8f9f7 546 {
<> 144:ef7eb2e8f9f7 547 kMCG_PllRefOsc0, /*!< Selects OSC0 as PLL reference clock */
<> 144:ef7eb2e8f9f7 548 kMCG_PllRefOsc1 /*!< Selects OSC1 as PLL reference clock */
<> 144:ef7eb2e8f9f7 549 } mcg_pll_ref_src_t;
<> 144:ef7eb2e8f9f7 550
<> 144:ef7eb2e8f9f7 551 /*! @brief MCGOUT clock source. */
<> 144:ef7eb2e8f9f7 552 typedef enum _mcg_clkout_src
<> 144:ef7eb2e8f9f7 553 {
<> 144:ef7eb2e8f9f7 554 kMCG_ClkOutSrcOut, /*!< Output of the FLL is selected (reset default) */
<> 144:ef7eb2e8f9f7 555 kMCG_ClkOutSrcInternal, /*!< Internal reference clock is selected */
<> 144:ef7eb2e8f9f7 556 kMCG_ClkOutSrcExternal, /*!< External reference clock is selected */
<> 144:ef7eb2e8f9f7 557 } mcg_clkout_src_t;
<> 144:ef7eb2e8f9f7 558
<> 144:ef7eb2e8f9f7 559 /*! @brief MCG Automatic Trim Machine Select */
<> 144:ef7eb2e8f9f7 560 typedef enum _mcg_atm_select
<> 144:ef7eb2e8f9f7 561 {
<> 144:ef7eb2e8f9f7 562 kMCG_AtmSel32k, /*!< 32 kHz Internal Reference Clock selected */
<> 144:ef7eb2e8f9f7 563 kMCG_AtmSel4m /*!< 4 MHz Internal Reference Clock selected */
<> 144:ef7eb2e8f9f7 564 } mcg_atm_select_t;
<> 144:ef7eb2e8f9f7 565
<> 144:ef7eb2e8f9f7 566 /*! @brief MCG OSC Clock Select */
<> 144:ef7eb2e8f9f7 567 typedef enum _mcg_oscsel
<> 144:ef7eb2e8f9f7 568 {
<> 144:ef7eb2e8f9f7 569 kMCG_OscselOsc, /*!< Selects System Oscillator (OSCCLK) */
<> 144:ef7eb2e8f9f7 570 kMCG_OscselRtc, /*!< Selects 32 kHz RTC Oscillator */
<> 144:ef7eb2e8f9f7 571 kMCG_OscselIrc /*!< Selects 48 MHz IRC Oscillator */
<> 144:ef7eb2e8f9f7 572 } mcg_oscsel_t;
<> 144:ef7eb2e8f9f7 573
<> 144:ef7eb2e8f9f7 574 /*! @brief MCG PLLCS select */
<> 144:ef7eb2e8f9f7 575 typedef enum _mcg_pll_clk_select
<> 144:ef7eb2e8f9f7 576 {
<> 144:ef7eb2e8f9f7 577 kMCG_PllClkSelPll0, /*!< PLL0 output clock is selected */
<> 144:ef7eb2e8f9f7 578 kMCG_PllClkSelExtPll /* External PLL clock is selected */
<> 144:ef7eb2e8f9f7 579 } mcg_pll_clk_select_t;
<> 144:ef7eb2e8f9f7 580
<> 144:ef7eb2e8f9f7 581 /*! @brief MCG clock monitor mode. */
<> 144:ef7eb2e8f9f7 582 typedef enum _mcg_monitor_mode
<> 144:ef7eb2e8f9f7 583 {
<> 144:ef7eb2e8f9f7 584 kMCG_MonitorNone, /*!< Clock monitor is disabled. */
<> 144:ef7eb2e8f9f7 585 kMCG_MonitorInt, /*!< Trigger interrupt when clock lost. */
<> 144:ef7eb2e8f9f7 586 kMCG_MonitorReset /*!< System reset when clock lost. */
<> 144:ef7eb2e8f9f7 587 } mcg_monitor_mode_t;
<> 144:ef7eb2e8f9f7 588
<> 144:ef7eb2e8f9f7 589 /*! @brief MCG status. */
<> 144:ef7eb2e8f9f7 590 enum _mcg_status
<> 144:ef7eb2e8f9f7 591 {
<> 144:ef7eb2e8f9f7 592 kStatus_MCG_ModeUnreachable = MAKE_STATUS(kStatusGroup_MCG, 0), /*!< Can't switch to target mode. */
<> 144:ef7eb2e8f9f7 593 kStatus_MCG_ModeInvalid = MAKE_STATUS(kStatusGroup_MCG, 1), /*!< Current mode invalid for the specific
<> 144:ef7eb2e8f9f7 594 function. */
<> 144:ef7eb2e8f9f7 595 kStatus_MCG_AtmBusClockInvalid = MAKE_STATUS(kStatusGroup_MCG, 2), /*!< Invalid bus clock for ATM. */
<> 144:ef7eb2e8f9f7 596 kStatus_MCG_AtmDesiredFreqInvalid = MAKE_STATUS(kStatusGroup_MCG, 3), /*!< Invalid desired frequency for ATM. */
<> 144:ef7eb2e8f9f7 597 kStatus_MCG_AtmIrcUsed = MAKE_STATUS(kStatusGroup_MCG, 4), /*!< IRC is used when using ATM. */
<> 144:ef7eb2e8f9f7 598 kStatus_MCG_AtmHardwareFail = MAKE_STATUS(kStatusGroup_MCG, 5), /*!< Hardware fail occurs during ATM. */
<> 144:ef7eb2e8f9f7 599 kStatus_MCG_SourceUsed = MAKE_STATUS(kStatusGroup_MCG, 6) /*!< Could not change clock source because
<> 144:ef7eb2e8f9f7 600 it is used currently. */
<> 144:ef7eb2e8f9f7 601 };
<> 144:ef7eb2e8f9f7 602
<> 144:ef7eb2e8f9f7 603 /*! @brief MCG status flags. */
<> 144:ef7eb2e8f9f7 604 enum _mcg_status_flags_t
<> 144:ef7eb2e8f9f7 605 {
<> 144:ef7eb2e8f9f7 606 kMCG_Osc0LostFlag = (1U << 0U), /*!< OSC0 lost. */
<> 144:ef7eb2e8f9f7 607 kMCG_Osc0InitFlag = (1U << 1U), /*!< OSC0 crystal initialized. */
<> 144:ef7eb2e8f9f7 608 kMCG_RtcOscLostFlag = (1U << 4U), /*!< RTC OSC lost. */
<> 144:ef7eb2e8f9f7 609 kMCG_Pll0LostFlag = (1U << 5U), /*!< PLL0 lost. */
<> 144:ef7eb2e8f9f7 610 kMCG_Pll0LockFlag = (1U << 6U), /*!< PLL0 locked. */
<> 144:ef7eb2e8f9f7 611 kMCG_ExtPllLostFlag = (1U << 9U), /*!< External PLL lost. */
<> 144:ef7eb2e8f9f7 612 };
<> 144:ef7eb2e8f9f7 613
<> 144:ef7eb2e8f9f7 614 /*! @brief MCG internal reference clock (MCGIRCLK) enable mode definition. */
<> 144:ef7eb2e8f9f7 615 enum _mcg_irclk_enable_mode
<> 144:ef7eb2e8f9f7 616 {
<> 144:ef7eb2e8f9f7 617 kMCG_IrclkEnable = MCG_C1_IRCLKEN_MASK, /*!< MCGIRCLK enable. */
<> 144:ef7eb2e8f9f7 618 kMCG_IrclkEnableInStop = MCG_C1_IREFSTEN_MASK /*!< MCGIRCLK enable in stop mode. */
<> 144:ef7eb2e8f9f7 619 };
<> 144:ef7eb2e8f9f7 620
<> 144:ef7eb2e8f9f7 621 /*! @brief MCG PLL clock enable mode definition. */
<> 144:ef7eb2e8f9f7 622 enum _mcg_pll_enable_mode
<> 144:ef7eb2e8f9f7 623 {
<> 144:ef7eb2e8f9f7 624 kMCG_PllEnableIndependent = MCG_C5_PLLCLKEN0_MASK, /*!< MCGPLLCLK enable indepencent of
<> 144:ef7eb2e8f9f7 625 MCG clock mode. Generally, PLL
<> 144:ef7eb2e8f9f7 626 is disabled in FLL modes
<> 144:ef7eb2e8f9f7 627 (FEI/FBI/FEE/FBE), set PLL clock
<> 144:ef7eb2e8f9f7 628 enable independent will enable
<> 144:ef7eb2e8f9f7 629 PLL in the FLL modes. */
<> 144:ef7eb2e8f9f7 630 kMCG_PllEnableInStop = MCG_C5_PLLSTEN0_MASK /*!< MCGPLLCLK enable in STOP mode. */
<> 144:ef7eb2e8f9f7 631 };
<> 144:ef7eb2e8f9f7 632
<> 144:ef7eb2e8f9f7 633 /*! @brief MCG mode definitions */
<> 144:ef7eb2e8f9f7 634 typedef enum _mcg_mode
<> 144:ef7eb2e8f9f7 635 {
<> 144:ef7eb2e8f9f7 636 kMCG_ModeFEI = 0U, /*!< FEI - FLL Engaged Internal */
<> 144:ef7eb2e8f9f7 637 kMCG_ModeFBI, /*!< FBI - FLL Bypassed Internal */
<> 144:ef7eb2e8f9f7 638 kMCG_ModeBLPI, /*!< BLPI - Bypassed Low Power Internal */
<> 144:ef7eb2e8f9f7 639 kMCG_ModeFEE, /*!< FEE - FLL Engaged External */
<> 144:ef7eb2e8f9f7 640 kMCG_ModeFBE, /*!< FBE - FLL Bypassed External */
<> 144:ef7eb2e8f9f7 641 kMCG_ModeBLPE, /*!< BLPE - Bypassed Low Power External */
<> 144:ef7eb2e8f9f7 642 kMCG_ModePBE, /*!< PBE - PLL Bypassed External */
<> 144:ef7eb2e8f9f7 643 kMCG_ModePEE, /*!< PEE - PLL Engaged External */
<> 144:ef7eb2e8f9f7 644 kMCG_ModeError /*!< Unknown mode */
<> 144:ef7eb2e8f9f7 645 } mcg_mode_t;
<> 144:ef7eb2e8f9f7 646
<> 144:ef7eb2e8f9f7 647 /*! @brief MCG PLL configuration. */
<> 144:ef7eb2e8f9f7 648 typedef struct _mcg_pll_config
<> 144:ef7eb2e8f9f7 649 {
<> 144:ef7eb2e8f9f7 650 uint8_t enableMode; /*!< Enable mode. OR'ed value of @ref _mcg_pll_enable_mode. */
<> 144:ef7eb2e8f9f7 651 uint8_t prdiv; /*!< Reference divider PRDIV. */
<> 144:ef7eb2e8f9f7 652 uint8_t vdiv; /*!< VCO divider VDIV. */
<> 144:ef7eb2e8f9f7 653 } mcg_pll_config_t;
<> 144:ef7eb2e8f9f7 654
<> 144:ef7eb2e8f9f7 655 /*! @brief MCG configure structure for mode change.
<> 144:ef7eb2e8f9f7 656 *
<> 144:ef7eb2e8f9f7 657 * When porting to a new board, please set the following members
<> 144:ef7eb2e8f9f7 658 * according to board setting:
<> 144:ef7eb2e8f9f7 659 * 1. frdiv: If FLL uses the external reference clock, please set this
<> 144:ef7eb2e8f9f7 660 * value to make sure external reference clock divided by frdiv is
<> 144:ef7eb2e8f9f7 661 * in the range 31.25kHz to 39.0625kHz.
<> 144:ef7eb2e8f9f7 662 * 2. The PLL reference clock divider PRDIV: PLL reference clock frequency after
<> 144:ef7eb2e8f9f7 663 * PRDIV should be in the range of FSL_FEATURE_MCG_PLL_REF_MIN to
<> 144:ef7eb2e8f9f7 664 * FSL_FEATURE_MCG_PLL_REF_MAX.
<> 144:ef7eb2e8f9f7 665 */
<> 144:ef7eb2e8f9f7 666 typedef struct _mcg_config
<> 144:ef7eb2e8f9f7 667 {
<> 144:ef7eb2e8f9f7 668 mcg_mode_t mcgMode; /*!< MCG mode. */
<> 144:ef7eb2e8f9f7 669
<> 144:ef7eb2e8f9f7 670 /* ----------------------- MCGIRCCLK settings ------------------------ */
<> 144:ef7eb2e8f9f7 671 uint8_t irclkEnableMode; /*!< MCGIRCLK enable mode. */
<> 144:ef7eb2e8f9f7 672 mcg_irc_mode_t ircs; /*!< Source, MCG_C2[IRCS]. */
<> 144:ef7eb2e8f9f7 673 uint8_t fcrdiv; /*!< Divider, MCG_SC[FCRDIV]. */
<> 144:ef7eb2e8f9f7 674
<> 144:ef7eb2e8f9f7 675 /* ------------------------ MCG FLL settings ------------------------- */
<> 144:ef7eb2e8f9f7 676 uint8_t frdiv; /*!< Divider MCG_C1[FRDIV]. */
<> 144:ef7eb2e8f9f7 677 mcg_drs_t drs; /*!< DCO range MCG_C4[DRST_DRS]. */
<> 144:ef7eb2e8f9f7 678 mcg_dmx32_t dmx32; /*!< MCG_C4[DMX32]. */
<> 144:ef7eb2e8f9f7 679 mcg_oscsel_t oscsel; /*!< OSC select MCG_C7[OSCSEL]. */
<> 144:ef7eb2e8f9f7 680
<> 144:ef7eb2e8f9f7 681 /* ------------------------ MCG PLL settings ------------------------- */
<> 144:ef7eb2e8f9f7 682 mcg_pll_config_t pll0Config; /*!< MCGPLL0CLK configuration. */
<> 144:ef7eb2e8f9f7 683
<> 144:ef7eb2e8f9f7 684 mcg_pll_clk_select_t pllcs; /*!< PLL select as output, PLLCS.*/
<> 144:ef7eb2e8f9f7 685
<> 144:ef7eb2e8f9f7 686 } mcg_config_t;
<> 144:ef7eb2e8f9f7 687
<> 144:ef7eb2e8f9f7 688 /*******************************************************************************
<> 144:ef7eb2e8f9f7 689 * API
<> 144:ef7eb2e8f9f7 690 ******************************************************************************/
<> 144:ef7eb2e8f9f7 691
<> 144:ef7eb2e8f9f7 692 #if defined(__cplusplus)
<> 144:ef7eb2e8f9f7 693 extern "C" {
<> 144:ef7eb2e8f9f7 694 #endif /* __cplusplus */
<> 144:ef7eb2e8f9f7 695
<> 144:ef7eb2e8f9f7 696 /*!
<> 144:ef7eb2e8f9f7 697 * @brief Set the XTAL0 frequency based on board setting.
<> 144:ef7eb2e8f9f7 698 *
<> 144:ef7eb2e8f9f7 699 * @param freq The XTAL0/EXTAL0 input clock frequency in Hz.
<> 144:ef7eb2e8f9f7 700 */
<> 144:ef7eb2e8f9f7 701 static inline void CLOCK_SetXtal0Freq(uint32_t freq)
<> 144:ef7eb2e8f9f7 702 {
<> 144:ef7eb2e8f9f7 703 g_xtal0Freq = freq;
<> 144:ef7eb2e8f9f7 704 }
<> 144:ef7eb2e8f9f7 705
<> 144:ef7eb2e8f9f7 706 /*!
<> 144:ef7eb2e8f9f7 707 * @brief Set the XTAL32/RTC_CLKIN frequency based on board setting.
<> 144:ef7eb2e8f9f7 708 *
<> 144:ef7eb2e8f9f7 709 * @param freq The XTAL32/EXTAL32/RTC_CLKIN input clock frequency in Hz.
<> 144:ef7eb2e8f9f7 710 */
<> 144:ef7eb2e8f9f7 711 static inline void CLOCK_SetXtal32Freq(uint32_t freq)
<> 144:ef7eb2e8f9f7 712 {
<> 144:ef7eb2e8f9f7 713 g_xtal32Freq = freq;
<> 144:ef7eb2e8f9f7 714 }
<> 144:ef7eb2e8f9f7 715
<> 144:ef7eb2e8f9f7 716 /*!
<> 144:ef7eb2e8f9f7 717 * @brief Enable the clock for specific IP.
<> 144:ef7eb2e8f9f7 718 *
<> 144:ef7eb2e8f9f7 719 * @param name Which clock to enable, see \ref clock_ip_name_t.
<> 144:ef7eb2e8f9f7 720 */
<> 144:ef7eb2e8f9f7 721 static inline void CLOCK_EnableClock(clock_ip_name_t name)
<> 144:ef7eb2e8f9f7 722 {
<> 144:ef7eb2e8f9f7 723 uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name);
<> 144:ef7eb2e8f9f7 724 (*(volatile uint32_t *)regAddr) |= (1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));
<> 144:ef7eb2e8f9f7 725 }
<> 144:ef7eb2e8f9f7 726
<> 144:ef7eb2e8f9f7 727 /*!
<> 144:ef7eb2e8f9f7 728 * @brief Disable the clock for specific IP.
<> 144:ef7eb2e8f9f7 729 *
<> 144:ef7eb2e8f9f7 730 * @param name Which clock to disable, see \ref clock_ip_name_t.
<> 144:ef7eb2e8f9f7 731 */
<> 144:ef7eb2e8f9f7 732 static inline void CLOCK_DisableClock(clock_ip_name_t name)
<> 144:ef7eb2e8f9f7 733 {
<> 144:ef7eb2e8f9f7 734 uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name);
<> 144:ef7eb2e8f9f7 735 (*(volatile uint32_t *)regAddr) &= ~(1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));
<> 144:ef7eb2e8f9f7 736 }
<> 144:ef7eb2e8f9f7 737
<> 144:ef7eb2e8f9f7 738 /*!
<> 144:ef7eb2e8f9f7 739 * @brief Set ERCLK32K source.
<> 144:ef7eb2e8f9f7 740 *
<> 144:ef7eb2e8f9f7 741 * @param src The value to set ERCLK32K clock source.
<> 144:ef7eb2e8f9f7 742 */
<> 144:ef7eb2e8f9f7 743 static inline void CLOCK_SetEr32kClock(uint32_t src)
<> 144:ef7eb2e8f9f7 744 {
<> 144:ef7eb2e8f9f7 745 SIM->SOPT1 = ((SIM->SOPT1 & ~SIM_SOPT1_OSC32KSEL_MASK) | SIM_SOPT1_OSC32KSEL(src));
<> 144:ef7eb2e8f9f7 746 }
<> 144:ef7eb2e8f9f7 747
<> 144:ef7eb2e8f9f7 748 /*!
<> 144:ef7eb2e8f9f7 749 * @brief Set SDHC0 clock source.
<> 144:ef7eb2e8f9f7 750 *
<> 144:ef7eb2e8f9f7 751 * @param src The value to set SDHC0 clock source.
<> 144:ef7eb2e8f9f7 752 */
<> 144:ef7eb2e8f9f7 753 static inline void CLOCK_SetSdhc0Clock(uint32_t src)
<> 144:ef7eb2e8f9f7 754 {
<> 144:ef7eb2e8f9f7 755 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_SDHCSRC_MASK) | SIM_SOPT2_SDHCSRC(src));
<> 144:ef7eb2e8f9f7 756 }
<> 144:ef7eb2e8f9f7 757
<> 144:ef7eb2e8f9f7 758 /*!
<> 144:ef7eb2e8f9f7 759 * @brief Set enet timestamp clock source.
<> 144:ef7eb2e8f9f7 760 *
<> 144:ef7eb2e8f9f7 761 * @param src The value to set enet timestamp clock source.
<> 144:ef7eb2e8f9f7 762 */
<> 144:ef7eb2e8f9f7 763 static inline void CLOCK_SetEnetTime0Clock(uint32_t src)
<> 144:ef7eb2e8f9f7 764 {
<> 144:ef7eb2e8f9f7 765 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_TIMESRC_MASK) | SIM_SOPT2_TIMESRC(src));
<> 144:ef7eb2e8f9f7 766 }
<> 144:ef7eb2e8f9f7 767
<> 144:ef7eb2e8f9f7 768 /*!
<> 144:ef7eb2e8f9f7 769 * @brief Set RMII clock source.
<> 144:ef7eb2e8f9f7 770 *
<> 144:ef7eb2e8f9f7 771 * @param src The value to set RMII clock source.
<> 144:ef7eb2e8f9f7 772 */
<> 144:ef7eb2e8f9f7 773 static inline void CLOCK_SetRmii0Clock(uint32_t src)
<> 144:ef7eb2e8f9f7 774 {
<> 144:ef7eb2e8f9f7 775 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_RMIISRC_MASK) | SIM_SOPT2_RMIISRC(src));
<> 144:ef7eb2e8f9f7 776 }
<> 144:ef7eb2e8f9f7 777
<> 144:ef7eb2e8f9f7 778 /*!
<> 144:ef7eb2e8f9f7 779 * @brief Set LPUART clock source.
<> 144:ef7eb2e8f9f7 780 *
<> 144:ef7eb2e8f9f7 781 * @param src The value to set LPUART clock source.
<> 144:ef7eb2e8f9f7 782 */
<> 144:ef7eb2e8f9f7 783 static inline void CLOCK_SetLpuartClock(uint32_t src)
<> 144:ef7eb2e8f9f7 784 {
<> 144:ef7eb2e8f9f7 785 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_LPUARTSRC_MASK) | SIM_SOPT2_LPUARTSRC(src));
<> 144:ef7eb2e8f9f7 786 }
<> 144:ef7eb2e8f9f7 787
<> 144:ef7eb2e8f9f7 788 /*!
<> 144:ef7eb2e8f9f7 789 * @brief Set TPM clock source.
<> 144:ef7eb2e8f9f7 790 *
<> 144:ef7eb2e8f9f7 791 * @param src The value to set TPM clock source.
<> 144:ef7eb2e8f9f7 792 */
<> 144:ef7eb2e8f9f7 793 static inline void CLOCK_SetTpmClock(uint32_t src)
<> 144:ef7eb2e8f9f7 794 {
<> 144:ef7eb2e8f9f7 795 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_TPMSRC_MASK) | SIM_SOPT2_TPMSRC(src));
<> 144:ef7eb2e8f9f7 796 }
<> 144:ef7eb2e8f9f7 797
<> 144:ef7eb2e8f9f7 798 /*!
<> 144:ef7eb2e8f9f7 799 * @brief Set debug trace clock source.
<> 144:ef7eb2e8f9f7 800 *
<> 144:ef7eb2e8f9f7 801 * @param src The value to set debug trace clock source.
<> 144:ef7eb2e8f9f7 802 */
<> 144:ef7eb2e8f9f7 803 static inline void CLOCK_SetTraceClock(uint32_t src, uint32_t divValue, uint32_t fracValue)
<> 144:ef7eb2e8f9f7 804 {
<> 144:ef7eb2e8f9f7 805 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_TRACECLKSEL_MASK) | SIM_SOPT2_TRACECLKSEL(src));
<> 144:ef7eb2e8f9f7 806 SIM->CLKDIV4 = SIM_CLKDIV4_TRACEDIV(divValue) | SIM_CLKDIV4_TRACEFRAC(fracValue);
<> 144:ef7eb2e8f9f7 807 }
<> 144:ef7eb2e8f9f7 808
<> 144:ef7eb2e8f9f7 809 /*!
<> 144:ef7eb2e8f9f7 810 * @brief Set PLLFLLSEL clock source.
<> 144:ef7eb2e8f9f7 811 *
<> 144:ef7eb2e8f9f7 812 * @param src The value to set PLLFLLSEL clock source.
<> 144:ef7eb2e8f9f7 813 */
<> 144:ef7eb2e8f9f7 814 static inline void CLOCK_SetPllFllSelClock(uint32_t src, uint32_t divValue, uint32_t fracValue)
<> 144:ef7eb2e8f9f7 815 {
<> 144:ef7eb2e8f9f7 816 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_PLLFLLSEL_MASK) | SIM_SOPT2_PLLFLLSEL(src));
<> 144:ef7eb2e8f9f7 817 SIM->CLKDIV3 = SIM_CLKDIV3_PLLFLLDIV(divValue) | SIM_CLKDIV3_PLLFLLFRAC(fracValue);
<> 144:ef7eb2e8f9f7 818 }
<> 144:ef7eb2e8f9f7 819
<> 144:ef7eb2e8f9f7 820 /*!
<> 144:ef7eb2e8f9f7 821 * @brief Set CLKOUT source.
<> 144:ef7eb2e8f9f7 822 *
<> 144:ef7eb2e8f9f7 823 * @param src The value to set CLKOUT source.
<> 144:ef7eb2e8f9f7 824 */
<> 144:ef7eb2e8f9f7 825 static inline void CLOCK_SetClkOutClock(uint32_t src)
<> 144:ef7eb2e8f9f7 826 {
<> 144:ef7eb2e8f9f7 827 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_CLKOUTSEL_MASK) | SIM_SOPT2_CLKOUTSEL(src));
<> 144:ef7eb2e8f9f7 828 }
<> 144:ef7eb2e8f9f7 829
<> 144:ef7eb2e8f9f7 830 /*!
<> 144:ef7eb2e8f9f7 831 * @brief Set RTC_CLKOUT source.
<> 144:ef7eb2e8f9f7 832 *
<> 144:ef7eb2e8f9f7 833 * @param src The value to set RTC_CLKOUT source.
<> 144:ef7eb2e8f9f7 834 */
<> 144:ef7eb2e8f9f7 835 static inline void CLOCK_SetRtcClkOutClock(uint32_t src)
<> 144:ef7eb2e8f9f7 836 {
<> 144:ef7eb2e8f9f7 837 SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_RTCCLKOUTSEL_MASK) | SIM_SOPT2_RTCCLKOUTSEL(src));
<> 144:ef7eb2e8f9f7 838 }
<> 144:ef7eb2e8f9f7 839
<> 144:ef7eb2e8f9f7 840 /*! @brief Enable USB HS clock.
<> 144:ef7eb2e8f9f7 841 *
<> 144:ef7eb2e8f9f7 842 * @param src USB HS clock source.
<> 144:ef7eb2e8f9f7 843 * @param freq The frequency specified by src.
<> 144:ef7eb2e8f9f7 844 * @retval true The clock is set successfully.
<> 144:ef7eb2e8f9f7 845 * @retval false The clock source is invalid to get proper USB HS clock.
<> 144:ef7eb2e8f9f7 846 */
<> 144:ef7eb2e8f9f7 847 bool CLOCK_EnableUsbhs0Clock(clock_usb_src_t src, uint32_t freq);
<> 144:ef7eb2e8f9f7 848
<> 144:ef7eb2e8f9f7 849 /*! @brief Disable USB HS clock.
<> 144:ef7eb2e8f9f7 850 *
<> 144:ef7eb2e8f9f7 851 * Disable USB HS clock.
<> 144:ef7eb2e8f9f7 852 */
<> 144:ef7eb2e8f9f7 853 static inline void CLOCK_DisableUsbhs0Clock(void)
<> 144:ef7eb2e8f9f7 854 {
<> 144:ef7eb2e8f9f7 855 SIM->SOPT2 &= ~SIM_SOPT2_USBREGEN_MASK;
<> 144:ef7eb2e8f9f7 856 SIM->SCGC3 &= ~(SIM_SCGC3_USBHS_MASK | SIM_SCGC3_USBHSPHY_MASK);
<> 144:ef7eb2e8f9f7 857 }
<> 144:ef7eb2e8f9f7 858
<> 144:ef7eb2e8f9f7 859 /*! @brief Enable USB FS clock.
<> 144:ef7eb2e8f9f7 860 *
<> 144:ef7eb2e8f9f7 861 * @param src USB FS clock source.
<> 144:ef7eb2e8f9f7 862 * @param freq The frequency specified by src.
<> 144:ef7eb2e8f9f7 863 * @retval true The clock is set successfully.
<> 144:ef7eb2e8f9f7 864 * @retval false The clock source is invalid to get proper USB FS clock.
<> 144:ef7eb2e8f9f7 865 */
<> 144:ef7eb2e8f9f7 866 bool CLOCK_EnableUsbfs0Clock(clock_usb_src_t src, uint32_t freq);
<> 144:ef7eb2e8f9f7 867
<> 144:ef7eb2e8f9f7 868 /*! @brief Disable USB FS clock.
<> 144:ef7eb2e8f9f7 869 *
<> 144:ef7eb2e8f9f7 870 * Disable USB FS clock.
<> 144:ef7eb2e8f9f7 871 */
<> 144:ef7eb2e8f9f7 872 static inline void CLOCK_DisableUsbfs0Clock(void)
<> 144:ef7eb2e8f9f7 873 {
<> 144:ef7eb2e8f9f7 874 CLOCK_DisableClock(kCLOCK_Usbfs0);
<> 144:ef7eb2e8f9f7 875 }
<> 144:ef7eb2e8f9f7 876
<> 144:ef7eb2e8f9f7 877 /*!
<> 144:ef7eb2e8f9f7 878 * @brief System clock divider
<> 144:ef7eb2e8f9f7 879 *
<> 144:ef7eb2e8f9f7 880 * Set the SIM_CLKDIV1[OUTDIV1], SIM_CLKDIV1[OUTDIV2], SIM_CLKDIV1[OUTDIV3], SIM_CLKDIV1[OUTDIV4].
<> 144:ef7eb2e8f9f7 881 *
<> 144:ef7eb2e8f9f7 882 * @param outdiv1 Clock 1 output divider value.
<> 144:ef7eb2e8f9f7 883 *
<> 144:ef7eb2e8f9f7 884 * @param outdiv2 Clock 2 output divider value.
<> 144:ef7eb2e8f9f7 885 *
<> 144:ef7eb2e8f9f7 886 * @param outdiv3 Clock 3 output divider value.
<> 144:ef7eb2e8f9f7 887 *
<> 144:ef7eb2e8f9f7 888 * @param outdiv4 Clock 4 output divider value.
<> 144:ef7eb2e8f9f7 889 */
<> 144:ef7eb2e8f9f7 890 static inline void CLOCK_SetOutDiv(uint32_t outdiv1, uint32_t outdiv2, uint32_t outdiv3, uint32_t outdiv4)
<> 144:ef7eb2e8f9f7 891 {
<> 144:ef7eb2e8f9f7 892 SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(outdiv1) | SIM_CLKDIV1_OUTDIV2(outdiv2) | SIM_CLKDIV1_OUTDIV3(outdiv3) |
<> 144:ef7eb2e8f9f7 893 SIM_CLKDIV1_OUTDIV4(outdiv4);
<> 144:ef7eb2e8f9f7 894 }
<> 144:ef7eb2e8f9f7 895
<> 144:ef7eb2e8f9f7 896 /*!
<> 144:ef7eb2e8f9f7 897 * @brief Gets the clock frequency for a specific clock name.
<> 144:ef7eb2e8f9f7 898 *
<> 144:ef7eb2e8f9f7 899 * This function checks the current clock configurations and then calculates
<> 144:ef7eb2e8f9f7 900 * the clock frequency for a specific clock name defined in clock_name_t.
<> 144:ef7eb2e8f9f7 901 * The MCG must be properly configured before using this function.
<> 144:ef7eb2e8f9f7 902 *
<> 144:ef7eb2e8f9f7 903 * @param clockName Clock names defined in clock_name_t
<> 144:ef7eb2e8f9f7 904 * @return Clock frequency value in Hertz
<> 144:ef7eb2e8f9f7 905 */
<> 144:ef7eb2e8f9f7 906 uint32_t CLOCK_GetFreq(clock_name_t clockName);
<> 144:ef7eb2e8f9f7 907
<> 144:ef7eb2e8f9f7 908 /*!
<> 144:ef7eb2e8f9f7 909 * @brief Get the core clock or system clock frequency.
<> 144:ef7eb2e8f9f7 910 *
<> 144:ef7eb2e8f9f7 911 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 912 */
<> 144:ef7eb2e8f9f7 913 uint32_t CLOCK_GetCoreSysClkFreq(void);
<> 144:ef7eb2e8f9f7 914
<> 144:ef7eb2e8f9f7 915 /*!
<> 144:ef7eb2e8f9f7 916 * @brief Get the platform clock frequency.
<> 144:ef7eb2e8f9f7 917 *
<> 144:ef7eb2e8f9f7 918 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 919 */
<> 144:ef7eb2e8f9f7 920 uint32_t CLOCK_GetPlatClkFreq(void);
<> 144:ef7eb2e8f9f7 921
<> 144:ef7eb2e8f9f7 922 /*!
<> 144:ef7eb2e8f9f7 923 * @brief Get the bus clock frequency.
<> 144:ef7eb2e8f9f7 924 *
<> 144:ef7eb2e8f9f7 925 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 926 */
<> 144:ef7eb2e8f9f7 927 uint32_t CLOCK_GetBusClkFreq(void);
<> 144:ef7eb2e8f9f7 928
<> 144:ef7eb2e8f9f7 929 /*!
<> 144:ef7eb2e8f9f7 930 * @brief Get the flexbus clock frequency.
<> 144:ef7eb2e8f9f7 931 *
<> 144:ef7eb2e8f9f7 932 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 933 */
<> 144:ef7eb2e8f9f7 934 uint32_t CLOCK_GetFlexBusClkFreq(void);
<> 144:ef7eb2e8f9f7 935
<> 144:ef7eb2e8f9f7 936 /*!
<> 144:ef7eb2e8f9f7 937 * @brief Get the flash clock frequency.
<> 144:ef7eb2e8f9f7 938 *
<> 144:ef7eb2e8f9f7 939 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 940 */
<> 144:ef7eb2e8f9f7 941 uint32_t CLOCK_GetFlashClkFreq(void);
<> 144:ef7eb2e8f9f7 942
<> 144:ef7eb2e8f9f7 943 /*!
<> 144:ef7eb2e8f9f7 944 * @brief Get the output clock frequency selected by SIM[PLLFLLSEL].
<> 144:ef7eb2e8f9f7 945 *
<> 144:ef7eb2e8f9f7 946 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 947 */
<> 144:ef7eb2e8f9f7 948 uint32_t CLOCK_GetPllFllSelClkFreq(void);
<> 144:ef7eb2e8f9f7 949
<> 144:ef7eb2e8f9f7 950 /*!
<> 144:ef7eb2e8f9f7 951 * @brief Get the external reference 32K clock frequency (ERCLK32K).
<> 144:ef7eb2e8f9f7 952 *
<> 144:ef7eb2e8f9f7 953 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 954 */
<> 144:ef7eb2e8f9f7 955 uint32_t CLOCK_GetEr32kClkFreq(void);
<> 144:ef7eb2e8f9f7 956
<> 144:ef7eb2e8f9f7 957 /*!
<> 144:ef7eb2e8f9f7 958 * @brief Get the OSC0 external reference clock frequency (OSC0ERCLK).
<> 144:ef7eb2e8f9f7 959 *
<> 144:ef7eb2e8f9f7 960 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 961 */
<> 144:ef7eb2e8f9f7 962 uint32_t CLOCK_GetOsc0ErClkFreq(void);
<> 144:ef7eb2e8f9f7 963
<> 144:ef7eb2e8f9f7 964 /*!
<> 144:ef7eb2e8f9f7 965 * @brief Get the OSC0 external reference undivided clock frequency (OSC0ERCLK_UNDIV).
<> 144:ef7eb2e8f9f7 966 *
<> 144:ef7eb2e8f9f7 967 * @return Clock frequency in Hz.
<> 144:ef7eb2e8f9f7 968 */
<> 144:ef7eb2e8f9f7 969 uint32_t CLOCK_GetOsc0ErClkUndivFreq(void);
<> 144:ef7eb2e8f9f7 970
<> 144:ef7eb2e8f9f7 971 /*!
<> 144:ef7eb2e8f9f7 972 * @brief Set the clock configure in SIM module.
<> 144:ef7eb2e8f9f7 973 *
<> 144:ef7eb2e8f9f7 974 * This function sets system layer clock settings in SIM module.
<> 144:ef7eb2e8f9f7 975 *
<> 144:ef7eb2e8f9f7 976 * @param config Pointer to the configure structure.
<> 144:ef7eb2e8f9f7 977 */
<> 144:ef7eb2e8f9f7 978 void CLOCK_SetSimConfig(sim_clock_config_t const *config);
<> 144:ef7eb2e8f9f7 979
<> 144:ef7eb2e8f9f7 980 /*!
<> 144:ef7eb2e8f9f7 981 * @brief Set the system clock dividers in SIM to safe value.
<> 144:ef7eb2e8f9f7 982 *
<> 144:ef7eb2e8f9f7 983 * The system level clocks (core clock, bus clock, flexbus clock and flash clock)
<> 144:ef7eb2e8f9f7 984 * must be in allowed ranges. During MCG clock mode switch, the MCG output clock
<> 144:ef7eb2e8f9f7 985 * changes then the system level clocks may be out of range. This function could
<> 144:ef7eb2e8f9f7 986 * be used before MCG mode change, to make sure system level clocks are in allowed
<> 144:ef7eb2e8f9f7 987 * range.
<> 144:ef7eb2e8f9f7 988 *
<> 144:ef7eb2e8f9f7 989 * @param config Pointer to the configure structure.
<> 144:ef7eb2e8f9f7 990 */
<> 144:ef7eb2e8f9f7 991 static inline void CLOCK_SetSimSafeDivs(void)
<> 144:ef7eb2e8f9f7 992 {
<> 144:ef7eb2e8f9f7 993 SIM->CLKDIV1 = 0x02260000U;
<> 144:ef7eb2e8f9f7 994 }
<> 144:ef7eb2e8f9f7 995
<> 144:ef7eb2e8f9f7 996 /*! @name MCG frequency functions. */
<> 144:ef7eb2e8f9f7 997 /*@{*/
<> 144:ef7eb2e8f9f7 998
<> 144:ef7eb2e8f9f7 999 /*!
<> 144:ef7eb2e8f9f7 1000 * @brief Get the MCG output clock(MCGOUTCLK) frequency.
<> 144:ef7eb2e8f9f7 1001 *
<> 144:ef7eb2e8f9f7 1002 * This function gets the MCG output clock frequency (Hz) based on current MCG
<> 144:ef7eb2e8f9f7 1003 * register value.
<> 144:ef7eb2e8f9f7 1004 *
<> 144:ef7eb2e8f9f7 1005 * @return The frequency of MCGOUTCLK.
<> 144:ef7eb2e8f9f7 1006 */
<> 144:ef7eb2e8f9f7 1007 uint32_t CLOCK_GetOutClkFreq(void);
<> 144:ef7eb2e8f9f7 1008
<> 144:ef7eb2e8f9f7 1009 /*!
<> 144:ef7eb2e8f9f7 1010 * @brief Get the MCG FLL clock(MCGFLLCLK) frequency.
<> 144:ef7eb2e8f9f7 1011 *
<> 144:ef7eb2e8f9f7 1012 * This function gets the MCG FLL clock frequency (Hz) based on current MCG
<> 144:ef7eb2e8f9f7 1013 * register value. The FLL is only enabled in FEI/FBI/FEE/FBE mode, in other
<> 144:ef7eb2e8f9f7 1014 * modes, FLL is disabled in low power state.
<> 144:ef7eb2e8f9f7 1015 *
<> 144:ef7eb2e8f9f7 1016 * @return The frequency of MCGFLLCLK.
<> 144:ef7eb2e8f9f7 1017 */
<> 144:ef7eb2e8f9f7 1018 uint32_t CLOCK_GetFllFreq(void);
<> 144:ef7eb2e8f9f7 1019
<> 144:ef7eb2e8f9f7 1020 /*!
<> 144:ef7eb2e8f9f7 1021 * @brief Get the MCG internal reference clock(MCGIRCLK) frequency.
<> 144:ef7eb2e8f9f7 1022 *
<> 144:ef7eb2e8f9f7 1023 * This function gets the MCG internal reference clock frequency (Hz) based
<> 144:ef7eb2e8f9f7 1024 * on current MCG register value.
<> 144:ef7eb2e8f9f7 1025 *
<> 144:ef7eb2e8f9f7 1026 * @return The frequency of MCGIRCLK.
<> 144:ef7eb2e8f9f7 1027 */
<> 144:ef7eb2e8f9f7 1028 uint32_t CLOCK_GetInternalRefClkFreq(void);
<> 144:ef7eb2e8f9f7 1029
<> 144:ef7eb2e8f9f7 1030 /*!
<> 144:ef7eb2e8f9f7 1031 * @brief Get the MCG fixed frequency clock(MCGFFCLK) frequency.
<> 144:ef7eb2e8f9f7 1032 *
<> 144:ef7eb2e8f9f7 1033 * This function gets the MCG fixed frequency clock frequency (Hz) based
<> 144:ef7eb2e8f9f7 1034 * on current MCG register value.
<> 144:ef7eb2e8f9f7 1035 *
<> 144:ef7eb2e8f9f7 1036 * @return The frequency of MCGFFCLK.
<> 144:ef7eb2e8f9f7 1037 */
<> 144:ef7eb2e8f9f7 1038 uint32_t CLOCK_GetFixedFreqClkFreq(void);
<> 144:ef7eb2e8f9f7 1039
<> 144:ef7eb2e8f9f7 1040 /*!
<> 144:ef7eb2e8f9f7 1041 * @brief Get the MCG PLL0 clock(MCGPLL0CLK) frequency.
<> 144:ef7eb2e8f9f7 1042 *
<> 144:ef7eb2e8f9f7 1043 * This function gets the MCG PLL0 clock frequency (Hz) based on current MCG
<> 144:ef7eb2e8f9f7 1044 * register value.
<> 144:ef7eb2e8f9f7 1045 *
<> 144:ef7eb2e8f9f7 1046 * @return The frequency of MCGPLL0CLK.
<> 144:ef7eb2e8f9f7 1047 */
<> 144:ef7eb2e8f9f7 1048 uint32_t CLOCK_GetPll0Freq(void);
<> 144:ef7eb2e8f9f7 1049
<> 144:ef7eb2e8f9f7 1050 /*!
<> 144:ef7eb2e8f9f7 1051 * @brief Get the MCG external PLL frequency.
<> 144:ef7eb2e8f9f7 1052 *
<> 144:ef7eb2e8f9f7 1053 * This function gets the MCG external PLL frequency (Hz).
<> 144:ef7eb2e8f9f7 1054 *
<> 144:ef7eb2e8f9f7 1055 * @return The frequency of MCG external PLL.
<> 144:ef7eb2e8f9f7 1056 */
<> 144:ef7eb2e8f9f7 1057 uint32_t CLOCK_GetExtPllFreq(void);
<> 144:ef7eb2e8f9f7 1058
<> 144:ef7eb2e8f9f7 1059 /*!
<> 144:ef7eb2e8f9f7 1060 * @brief Set the MCG external PLL frequency.
<> 144:ef7eb2e8f9f7 1061 *
<> 144:ef7eb2e8f9f7 1062 * This function sets the MCG external PLL frequency (Hz), the MCG external PLL
<> 144:ef7eb2e8f9f7 1063 * frequency is passed in to MCG driver through this function. Please call this
<> 144:ef7eb2e8f9f7 1064 * function after the external PLL frequency is changed, otherwise the APIs for
<> 144:ef7eb2e8f9f7 1065 * get frequency may returns wrong value.
<> 144:ef7eb2e8f9f7 1066 *
<> 144:ef7eb2e8f9f7 1067 * @param The frequency of MCG external PLL.
<> 144:ef7eb2e8f9f7 1068 */
<> 144:ef7eb2e8f9f7 1069 void CLOCK_SetExtPllFreq(uint32_t freq);
<> 144:ef7eb2e8f9f7 1070
<> 144:ef7eb2e8f9f7 1071 /*@}*/
<> 144:ef7eb2e8f9f7 1072
<> 144:ef7eb2e8f9f7 1073 /*! @name MCG clock configuration. */
<> 144:ef7eb2e8f9f7 1074 /*@{*/
<> 144:ef7eb2e8f9f7 1075
<> 144:ef7eb2e8f9f7 1076 /*!
<> 144:ef7eb2e8f9f7 1077 * @brief Enable or disable MCG low power.
<> 144:ef7eb2e8f9f7 1078 *
<> 144:ef7eb2e8f9f7 1079 * Enable MCG low power will disable the PLL and FLL in bypass modes. That is,
<> 144:ef7eb2e8f9f7 1080 * in FBE and PBE modes, enable low power will set MCG to BLPE mode, in FBI and
<> 144:ef7eb2e8f9f7 1081 * PBI mode, enable low power will set MCG to BLPI mode.
<> 144:ef7eb2e8f9f7 1082 * When disable MCG low power, the PLL or FLL will be enabled based on MCG setting.
<> 144:ef7eb2e8f9f7 1083 *
<> 144:ef7eb2e8f9f7 1084 * @param enable True to enable MCG low power, false to disable MCG low power.
<> 144:ef7eb2e8f9f7 1085 */
<> 144:ef7eb2e8f9f7 1086 static inline void CLOCK_SetLowPowerEnable(bool enable)
<> 144:ef7eb2e8f9f7 1087 {
<> 144:ef7eb2e8f9f7 1088 if (enable)
<> 144:ef7eb2e8f9f7 1089 {
<> 144:ef7eb2e8f9f7 1090 MCG->C2 |= MCG_C2_LP_MASK;
<> 144:ef7eb2e8f9f7 1091 }
<> 144:ef7eb2e8f9f7 1092 else
<> 144:ef7eb2e8f9f7 1093 {
<> 144:ef7eb2e8f9f7 1094 MCG->C2 &= ~MCG_C2_LP_MASK;
<> 144:ef7eb2e8f9f7 1095 }
<> 144:ef7eb2e8f9f7 1096 }
<> 144:ef7eb2e8f9f7 1097
<> 144:ef7eb2e8f9f7 1098 /*!
<> 144:ef7eb2e8f9f7 1099 * @brief Configure the Internal Reference clock (MCGIRCLK)
<> 144:ef7eb2e8f9f7 1100 *
<> 144:ef7eb2e8f9f7 1101 * This function setups the \c MCGIRCLK base on parameters. It selects the IRC
<> 144:ef7eb2e8f9f7 1102 * source, if fast IRC is used, this function also sets the fast IRC divider.
<> 144:ef7eb2e8f9f7 1103 * This function also sets whether enable \c MCGIRCLK in stop mode.
<> 144:ef7eb2e8f9f7 1104 * Calling this function in FBI/PBI/BLPI modes may change the system clock, so
<> 144:ef7eb2e8f9f7 1105 * it is not allowed to use this in these modes.
<> 144:ef7eb2e8f9f7 1106 *
<> 144:ef7eb2e8f9f7 1107 * @param enableMode MCGIRCLK enable mode, OR'ed value of @ref _mcg_irclk_enable_mode.
<> 144:ef7eb2e8f9f7 1108 * @param ircs MCGIRCLK clock source, choose fast or slow.
<> 144:ef7eb2e8f9f7 1109 * @param fcrdiv Fast IRC divider setting (\c FCRDIV).
<> 144:ef7eb2e8f9f7 1110 * @retval kStatus_MCG_SourceUsed MCGIRCLK is used as system clock, should not configure MCGIRCLK.
<> 144:ef7eb2e8f9f7 1111 * @retval kStatus_Success MCGIRCLK configuration finished successfully.
<> 144:ef7eb2e8f9f7 1112 */
<> 144:ef7eb2e8f9f7 1113 status_t CLOCK_SetInternalRefClkConfig(uint8_t enableMode, mcg_irc_mode_t ircs, uint8_t fcrdiv);
<> 144:ef7eb2e8f9f7 1114
<> 144:ef7eb2e8f9f7 1115 /*!
<> 144:ef7eb2e8f9f7 1116 * @brief Select the MCG external reference clock.
<> 144:ef7eb2e8f9f7 1117 *
<> 144:ef7eb2e8f9f7 1118 * Select the MCG external reference clock source, it changes the MCG_C7[OSCSEL]
<> 144:ef7eb2e8f9f7 1119 * and wait for the clock source stable. Should not change external reference
<> 144:ef7eb2e8f9f7 1120 * clock in FEE/FBE/BLPE/PBE/PEE mdes, so don't call this function in these modes.
<> 144:ef7eb2e8f9f7 1121 *
<> 144:ef7eb2e8f9f7 1122 * @param oscsel MCG external reference clock source, MCG_C7[OSCSEL].
<> 144:ef7eb2e8f9f7 1123 * @retval kStatus_MCG_SourceUsed External reference clock is used, should not change.
<> 144:ef7eb2e8f9f7 1124 * @retval kStatus_Success External reference clock set successfully.
<> 144:ef7eb2e8f9f7 1125 */
<> 144:ef7eb2e8f9f7 1126 status_t CLOCK_SetExternalRefClkConfig(mcg_oscsel_t oscsel);
<> 144:ef7eb2e8f9f7 1127
<> 144:ef7eb2e8f9f7 1128 /*!
<> 144:ef7eb2e8f9f7 1129 * @brief Enables the PLL0 in FLL mode.
<> 144:ef7eb2e8f9f7 1130 *
<> 144:ef7eb2e8f9f7 1131 * This function setups the PLL0 in FLL mode, make sure the PLL reference
<> 144:ef7eb2e8f9f7 1132 * clock is enabled before calling this function. This function reconfigures
<> 144:ef7eb2e8f9f7 1133 * the PLL0, make sure the PLL0 is not used as a clock source while calling
<> 144:ef7eb2e8f9f7 1134 * this function. The function CLOCK_CalcPllDiv can help to get the proper PLL
<> 144:ef7eb2e8f9f7 1135 * divider values.
<> 144:ef7eb2e8f9f7 1136 *
<> 144:ef7eb2e8f9f7 1137 * @param config Pointer to the configuration structure.
<> 144:ef7eb2e8f9f7 1138 */
<> 144:ef7eb2e8f9f7 1139 void CLOCK_EnablePll0(mcg_pll_config_t const *config);
<> 144:ef7eb2e8f9f7 1140
<> 144:ef7eb2e8f9f7 1141 /*!
<> 144:ef7eb2e8f9f7 1142 * @brief Disables the PLL0 in FLL mode.
<> 144:ef7eb2e8f9f7 1143 *
<> 144:ef7eb2e8f9f7 1144 * This function disables the PLL0 in FLL mode, it should be used together with
<> 144:ef7eb2e8f9f7 1145 * @ref CLOCK_EnablePll0.
<> 144:ef7eb2e8f9f7 1146 */
<> 144:ef7eb2e8f9f7 1147 static inline void CLOCK_DisablePll0(void)
<> 144:ef7eb2e8f9f7 1148 {
<> 144:ef7eb2e8f9f7 1149 MCG->C5 &= ~(MCG_C5_PLLCLKEN0_MASK | MCG_C5_PLLSTEN0_MASK);
<> 144:ef7eb2e8f9f7 1150 }
<> 144:ef7eb2e8f9f7 1151
<> 144:ef7eb2e8f9f7 1152 /*!
<> 144:ef7eb2e8f9f7 1153 * @brief Calculates the PLL divider setting for desired output frequency.
<> 144:ef7eb2e8f9f7 1154 *
<> 144:ef7eb2e8f9f7 1155 * This function calculates the proper reference clock divider (\c PRDIV) and
<> 144:ef7eb2e8f9f7 1156 * VCO divider (\c VDIV) to generate desired PLL output frequency. It returns the
<> 144:ef7eb2e8f9f7 1157 * closest frequency PLL could generate, the corresponding \c PRDIV/VDIV are
<> 144:ef7eb2e8f9f7 1158 * returned from parameters. If desired frequency is not valid, this function
<> 144:ef7eb2e8f9f7 1159 * returns 0.
<> 144:ef7eb2e8f9f7 1160 *
<> 144:ef7eb2e8f9f7 1161 * @param refFreq PLL reference clock frequency.
<> 144:ef7eb2e8f9f7 1162 * @param desireFreq Desired PLL output frequency.
<> 144:ef7eb2e8f9f7 1163 * @param prdiv PRDIV value to generate desired PLL frequency.
<> 144:ef7eb2e8f9f7 1164 * @param vdiv VDIV value to generate desired PLL frequency.
<> 144:ef7eb2e8f9f7 1165 * @return Closest frequency PLL could generate.
<> 144:ef7eb2e8f9f7 1166 */
<> 144:ef7eb2e8f9f7 1167 uint32_t CLOCK_CalcPllDiv(uint32_t refFreq, uint32_t desireFreq, uint8_t *prdiv, uint8_t *vdiv);
<> 144:ef7eb2e8f9f7 1168
<> 144:ef7eb2e8f9f7 1169 /*@}*/
<> 144:ef7eb2e8f9f7 1170
<> 144:ef7eb2e8f9f7 1171 /*! @name MCG clock lock monitor functions. */
<> 144:ef7eb2e8f9f7 1172 /*@{*/
<> 144:ef7eb2e8f9f7 1173
<> 144:ef7eb2e8f9f7 1174 /*!
<> 144:ef7eb2e8f9f7 1175 * @brief Set the OSC0 clock monitor mode.
<> 144:ef7eb2e8f9f7 1176 *
<> 144:ef7eb2e8f9f7 1177 * Set the OSC0 clock monitor mode, see @ref mcg_monitor_mode_t for details.
<> 144:ef7eb2e8f9f7 1178 *
<> 144:ef7eb2e8f9f7 1179 * @param mode The monitor mode to set.
<> 144:ef7eb2e8f9f7 1180 */
<> 144:ef7eb2e8f9f7 1181 void CLOCK_SetOsc0MonitorMode(mcg_monitor_mode_t mode);
<> 144:ef7eb2e8f9f7 1182
<> 144:ef7eb2e8f9f7 1183 /*!
<> 144:ef7eb2e8f9f7 1184 * @brief Set the RTC OSC clock monitor mode.
<> 144:ef7eb2e8f9f7 1185 *
<> 144:ef7eb2e8f9f7 1186 * Set the RTC OSC clock monitor mode, see @ref mcg_monitor_mode_t for details.
<> 144:ef7eb2e8f9f7 1187 *
<> 144:ef7eb2e8f9f7 1188 * @param mode The monitor mode to set.
<> 144:ef7eb2e8f9f7 1189 */
<> 144:ef7eb2e8f9f7 1190 void CLOCK_SetRtcOscMonitorMode(mcg_monitor_mode_t mode);
<> 144:ef7eb2e8f9f7 1191
<> 144:ef7eb2e8f9f7 1192 /*!
<> 144:ef7eb2e8f9f7 1193 * @brief Set the PLL0 clock monitor mode.
<> 144:ef7eb2e8f9f7 1194 *
<> 144:ef7eb2e8f9f7 1195 * Set the PLL0 clock monitor mode, see @ref mcg_monitor_mode_t for details.
<> 144:ef7eb2e8f9f7 1196 *
<> 144:ef7eb2e8f9f7 1197 * @param mode The monitor mode to set.
<> 144:ef7eb2e8f9f7 1198 */
<> 144:ef7eb2e8f9f7 1199 void CLOCK_SetPll0MonitorMode(mcg_monitor_mode_t mode);
<> 144:ef7eb2e8f9f7 1200
<> 144:ef7eb2e8f9f7 1201 /*!
<> 144:ef7eb2e8f9f7 1202 * @brief Set the external PLL clock monitor mode.
<> 144:ef7eb2e8f9f7 1203 *
<> 144:ef7eb2e8f9f7 1204 * Set the external PLL clock monitor mode, see @ref mcg_monitor_mode_t
<> 144:ef7eb2e8f9f7 1205 * for details.
<> 144:ef7eb2e8f9f7 1206 *
<> 144:ef7eb2e8f9f7 1207 * @param mode The monitor mode to set.
<> 144:ef7eb2e8f9f7 1208 */
<> 144:ef7eb2e8f9f7 1209 void CLOCK_SetExtPllMonitorMode(mcg_monitor_mode_t mode);
<> 144:ef7eb2e8f9f7 1210
<> 144:ef7eb2e8f9f7 1211 /*!
<> 144:ef7eb2e8f9f7 1212 * @brief Get the MCG status flags.
<> 144:ef7eb2e8f9f7 1213 *
<> 144:ef7eb2e8f9f7 1214 * This function gets the MCG clock status flags, all the status flags are
<> 144:ef7eb2e8f9f7 1215 * returned as a logical OR of the enumeration @ref _mcg_status_flags_t. To
<> 144:ef7eb2e8f9f7 1216 * check specific flags, compare the return value with the flags.
<> 144:ef7eb2e8f9f7 1217 *
<> 144:ef7eb2e8f9f7 1218 * Example:
<> 144:ef7eb2e8f9f7 1219 * @code
<> 144:ef7eb2e8f9f7 1220 // To check the clock lost lock status of OSC0 and PLL0.
<> 144:ef7eb2e8f9f7 1221 uint32_t mcgFlags;
<> 144:ef7eb2e8f9f7 1222
<> 144:ef7eb2e8f9f7 1223 mcgFlags = CLOCK_GetStatusFlags();
<> 144:ef7eb2e8f9f7 1224
<> 144:ef7eb2e8f9f7 1225 if (mcgFlags & kMCG_Osc0LostFlag)
<> 144:ef7eb2e8f9f7 1226 {
<> 144:ef7eb2e8f9f7 1227 // OSC0 clock lock lost. Do something.
<> 144:ef7eb2e8f9f7 1228 }
<> 144:ef7eb2e8f9f7 1229 if (mcgFlags & kMCG_Pll0LostFlag)
<> 144:ef7eb2e8f9f7 1230 {
<> 144:ef7eb2e8f9f7 1231 // PLL0 clock lock lost. Do something.
<> 144:ef7eb2e8f9f7 1232 }
<> 144:ef7eb2e8f9f7 1233 @endcode
<> 144:ef7eb2e8f9f7 1234 *
<> 144:ef7eb2e8f9f7 1235 * @return Logical OR value of the @ref _mcg_status_flags_t.
<> 144:ef7eb2e8f9f7 1236 */
<> 144:ef7eb2e8f9f7 1237 uint32_t CLOCK_GetStatusFlags(void);
<> 144:ef7eb2e8f9f7 1238
<> 144:ef7eb2e8f9f7 1239 /*!
<> 144:ef7eb2e8f9f7 1240 * @brief Clears the MCG status flags.
<> 144:ef7eb2e8f9f7 1241 *
<> 144:ef7eb2e8f9f7 1242 * This function clears the MCG clock lock lost status. The parameter is logical
<> 144:ef7eb2e8f9f7 1243 * OR value of the flags to clear, see @ref _mcg_status_flags_t.
<> 144:ef7eb2e8f9f7 1244 *
<> 144:ef7eb2e8f9f7 1245 * Example:
<> 144:ef7eb2e8f9f7 1246 * @code
<> 144:ef7eb2e8f9f7 1247 // To clear the clock lost lock status flags of OSC0 and PLL0.
<> 144:ef7eb2e8f9f7 1248
<> 144:ef7eb2e8f9f7 1249 CLOCK_ClearStatusFlags(kMCG_Osc0LostFlag | kMCG_Pll0LostFlag);
<> 144:ef7eb2e8f9f7 1250 @endcode
<> 144:ef7eb2e8f9f7 1251 *
<> 144:ef7eb2e8f9f7 1252 * @param mask The status flags to clear. This is a logical OR of members of the
<> 144:ef7eb2e8f9f7 1253 * enumeration @ref _mcg_status_flags_t.
<> 144:ef7eb2e8f9f7 1254 */
<> 144:ef7eb2e8f9f7 1255 void CLOCK_ClearStatusFlags(uint32_t mask);
<> 144:ef7eb2e8f9f7 1256
<> 144:ef7eb2e8f9f7 1257 /*@}*/
<> 144:ef7eb2e8f9f7 1258
<> 144:ef7eb2e8f9f7 1259 /*!
<> 144:ef7eb2e8f9f7 1260 * @name OSC configuration
<> 144:ef7eb2e8f9f7 1261 * @{
<> 144:ef7eb2e8f9f7 1262 */
<> 144:ef7eb2e8f9f7 1263
<> 144:ef7eb2e8f9f7 1264 /*!
<> 144:ef7eb2e8f9f7 1265 * @brief Configures the OSC external reference clock (OSCERCLK).
<> 144:ef7eb2e8f9f7 1266 *
<> 144:ef7eb2e8f9f7 1267 * This function configures the OSC external reference clock (OSCERCLK).
<> 144:ef7eb2e8f9f7 1268 * For example, to enable the OSCERCLK in normal mode and stop mode, and also set
<> 144:ef7eb2e8f9f7 1269 * the output divider to 1, as follows:
<> 144:ef7eb2e8f9f7 1270 *
<> 144:ef7eb2e8f9f7 1271 @code
<> 144:ef7eb2e8f9f7 1272 oscer_config_t config =
<> 144:ef7eb2e8f9f7 1273 {
<> 144:ef7eb2e8f9f7 1274 .enableMode = kOSC_ErClkEnable | kOSC_ErClkEnableInStop,
<> 144:ef7eb2e8f9f7 1275 .erclkDiv = 1U,
<> 144:ef7eb2e8f9f7 1276 };
<> 144:ef7eb2e8f9f7 1277
<> 144:ef7eb2e8f9f7 1278 OSC_SetExtRefClkConfig(OSC, &config);
<> 144:ef7eb2e8f9f7 1279 @endcode
<> 144:ef7eb2e8f9f7 1280 *
<> 144:ef7eb2e8f9f7 1281 * @param base OSC peripheral address.
<> 144:ef7eb2e8f9f7 1282 * @param config Pointer to the configuration structure.
<> 144:ef7eb2e8f9f7 1283 */
<> 144:ef7eb2e8f9f7 1284 static inline void OSC_SetExtRefClkConfig(OSC_Type *base, oscer_config_t const *config)
<> 144:ef7eb2e8f9f7 1285 {
<> 144:ef7eb2e8f9f7 1286 uint8_t reg = base->CR;
<> 144:ef7eb2e8f9f7 1287
<> 144:ef7eb2e8f9f7 1288 reg &= ~(OSC_CR_ERCLKEN_MASK | OSC_CR_EREFSTEN_MASK);
<> 144:ef7eb2e8f9f7 1289 reg |= config->enableMode;
<> 144:ef7eb2e8f9f7 1290
<> 144:ef7eb2e8f9f7 1291 base->CR = reg;
<> 144:ef7eb2e8f9f7 1292
<> 144:ef7eb2e8f9f7 1293 base->DIV = OSC_DIV_ERPS(config->erclkDiv);
<> 144:ef7eb2e8f9f7 1294 }
<> 144:ef7eb2e8f9f7 1295
<> 144:ef7eb2e8f9f7 1296 /*!
<> 144:ef7eb2e8f9f7 1297 * @brief Sets the capacitor load configuration for the oscillator.
<> 144:ef7eb2e8f9f7 1298 *
<> 144:ef7eb2e8f9f7 1299 * This function sets the specified capacitors configuration for the oscillator.
<> 144:ef7eb2e8f9f7 1300 * This should be done in the early system level initialization function call
<> 144:ef7eb2e8f9f7 1301 * based on the system configuration.
<> 144:ef7eb2e8f9f7 1302 *
<> 144:ef7eb2e8f9f7 1303 * @param base OSC peripheral address.
<> 144:ef7eb2e8f9f7 1304 * @param capLoad OR'ed value for the capacitor load option, see \ref _osc_cap_load.
<> 144:ef7eb2e8f9f7 1305 *
<> 144:ef7eb2e8f9f7 1306 * Example:
<> 144:ef7eb2e8f9f7 1307 @code
<> 144:ef7eb2e8f9f7 1308 // To enable only 2 pF and 8 pF capacitor load, please use like this.
<> 144:ef7eb2e8f9f7 1309 OSC_SetCapLoad(OSC, kOSC_Cap2P | kOSC_Cap8P);
<> 144:ef7eb2e8f9f7 1310 @endcode
<> 144:ef7eb2e8f9f7 1311 */
<> 144:ef7eb2e8f9f7 1312 static inline void OSC_SetCapLoad(OSC_Type *base, uint8_t capLoad)
<> 144:ef7eb2e8f9f7 1313 {
<> 144:ef7eb2e8f9f7 1314 uint8_t reg = base->CR;
<> 144:ef7eb2e8f9f7 1315
<> 144:ef7eb2e8f9f7 1316 reg &= ~(OSC_CR_SC2P_MASK | OSC_CR_SC4P_MASK | OSC_CR_SC8P_MASK | OSC_CR_SC16P_MASK);
<> 144:ef7eb2e8f9f7 1317 reg |= capLoad;
<> 144:ef7eb2e8f9f7 1318
<> 144:ef7eb2e8f9f7 1319 base->CR = reg;
<> 144:ef7eb2e8f9f7 1320 }
<> 144:ef7eb2e8f9f7 1321
<> 144:ef7eb2e8f9f7 1322 /*!
<> 144:ef7eb2e8f9f7 1323 * @brief Initialize OSC0.
<> 144:ef7eb2e8f9f7 1324 *
<> 144:ef7eb2e8f9f7 1325 * This function initializes OSC0 according to board configuration.
<> 144:ef7eb2e8f9f7 1326 *
<> 144:ef7eb2e8f9f7 1327 * @param config Pointer to the OSC0 configuration structure.
<> 144:ef7eb2e8f9f7 1328 */
<> 144:ef7eb2e8f9f7 1329 void CLOCK_InitOsc0(osc_config_t const *config);
<> 144:ef7eb2e8f9f7 1330
<> 144:ef7eb2e8f9f7 1331 /*!
<> 144:ef7eb2e8f9f7 1332 * @brief Deinitialize OSC0.
<> 144:ef7eb2e8f9f7 1333 *
<> 144:ef7eb2e8f9f7 1334 * This function deinitializes OSC0.
<> 144:ef7eb2e8f9f7 1335 */
<> 144:ef7eb2e8f9f7 1336 void CLOCK_DeinitOsc0(void);
<> 144:ef7eb2e8f9f7 1337
<> 144:ef7eb2e8f9f7 1338 /* @} */
<> 144:ef7eb2e8f9f7 1339
<> 144:ef7eb2e8f9f7 1340 /*!
<> 144:ef7eb2e8f9f7 1341 * @name MCG auto-trim machine.
<> 144:ef7eb2e8f9f7 1342 * @{
<> 144:ef7eb2e8f9f7 1343 */
<> 144:ef7eb2e8f9f7 1344
<> 144:ef7eb2e8f9f7 1345 /*!
<> 144:ef7eb2e8f9f7 1346 * @brief Auto trim the internal reference clock.
<> 144:ef7eb2e8f9f7 1347 *
<> 144:ef7eb2e8f9f7 1348 * This function trims the internal reference clock using external clock. If
<> 144:ef7eb2e8f9f7 1349 * successful, it returns the kStatus_Success and the frequency after
<> 144:ef7eb2e8f9f7 1350 * trimming is received in the parameter @p actualFreq. If an error occurs,
<> 144:ef7eb2e8f9f7 1351 * the error code is returned.
<> 144:ef7eb2e8f9f7 1352 *
<> 144:ef7eb2e8f9f7 1353 * @param extFreq External clock frequency, should be bus clock.
<> 144:ef7eb2e8f9f7 1354 * @param desireFreq Frequency want to trim to.
<> 144:ef7eb2e8f9f7 1355 * @param actualFreq Actual frequency after trim.
<> 144:ef7eb2e8f9f7 1356 * @param atms Trim fast or slow internal reference clock.
<> 144:ef7eb2e8f9f7 1357 * @retval kStatus_Success ATM success.
<> 144:ef7eb2e8f9f7 1358 * @retval kStatus_MCG_AtmBusClockInvalid The bus clock is not in allowed range for ATM.
<> 144:ef7eb2e8f9f7 1359 * @retval kStatus_MCG_AtmDesiredFreqInvalid MCGIRCLK could not be trimmed to the desired frequency.
<> 144:ef7eb2e8f9f7 1360 * @retval kStatus_MCG_AtmIrcUsed Could not trim because MCGIRCLK is used as bus clock source.
<> 144:ef7eb2e8f9f7 1361 * @retval kStatus_MCG_AtmHardwareFail Hardware fails during trim.
<> 144:ef7eb2e8f9f7 1362 */
<> 144:ef7eb2e8f9f7 1363 status_t CLOCK_TrimInternalRefClk(uint32_t extFreq, uint32_t desireFreq, uint32_t *actualFreq, mcg_atm_select_t atms);
<> 144:ef7eb2e8f9f7 1364 /* @} */
<> 144:ef7eb2e8f9f7 1365
<> 144:ef7eb2e8f9f7 1366 /*! @name MCG mode functions. */
<> 144:ef7eb2e8f9f7 1367 /*@{*/
<> 144:ef7eb2e8f9f7 1368
<> 144:ef7eb2e8f9f7 1369 /*!
<> 144:ef7eb2e8f9f7 1370 * @brief Gets the current MCG mode.
<> 144:ef7eb2e8f9f7 1371 *
<> 144:ef7eb2e8f9f7 1372 * This function checks the MCG registers and determine current MCG mode.
<> 144:ef7eb2e8f9f7 1373 *
<> 144:ef7eb2e8f9f7 1374 * @return Current MCG mode or error code, see @ref mcg_mode_t.
<> 144:ef7eb2e8f9f7 1375 */
<> 144:ef7eb2e8f9f7 1376 mcg_mode_t CLOCK_GetMode(void);
<> 144:ef7eb2e8f9f7 1377
<> 144:ef7eb2e8f9f7 1378 /*!
<> 144:ef7eb2e8f9f7 1379 * @brief Set MCG to FEI mode.
<> 144:ef7eb2e8f9f7 1380 *
<> 144:ef7eb2e8f9f7 1381 * This function sets MCG to FEI mode. If could not set to FEI mode directly
<> 144:ef7eb2e8f9f7 1382 * from current mode, this function returns error. @ref kMCG_Dmx32Default is used in this
<> 144:ef7eb2e8f9f7 1383 * mode because using kMCG_Dmx32Fine with internal reference clock source
<> 144:ef7eb2e8f9f7 1384 * might damage hardware.
<> 144:ef7eb2e8f9f7 1385 *
<> 144:ef7eb2e8f9f7 1386 * @param drs The DCO range selection.
<> 144:ef7eb2e8f9f7 1387 * @param fllStableDelay Delay function to make sure FLL is stable, if pass
<> 144:ef7eb2e8f9f7 1388 * in NULL, then does not delay.
<> 144:ef7eb2e8f9f7 1389 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1390 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1391 */
<> 144:ef7eb2e8f9f7 1392 status_t CLOCK_SetFeiMode(mcg_drs_t drs, void (*fllStableDelay)(void));
<> 144:ef7eb2e8f9f7 1393
<> 144:ef7eb2e8f9f7 1394 /*!
<> 144:ef7eb2e8f9f7 1395 * @brief Set MCG to FEE mode.
<> 144:ef7eb2e8f9f7 1396 *
<> 144:ef7eb2e8f9f7 1397 * This function sets MCG to FEE mode. If could not set to FEE mode directly
<> 144:ef7eb2e8f9f7 1398 * from current mode, this function returns error.
<> 144:ef7eb2e8f9f7 1399 *
<> 144:ef7eb2e8f9f7 1400 * @param frdiv FLL reference clock divider setting, FRDIV.
<> 144:ef7eb2e8f9f7 1401 * @param dmx32 DMX32 in FEE mode.
<> 144:ef7eb2e8f9f7 1402 * @param drs The DCO range selection.
<> 144:ef7eb2e8f9f7 1403 * @param fllStableDelay Delay function to make sure FLL is stable, if pass
<> 144:ef7eb2e8f9f7 1404 * in NULL, then does not delay.
<> 144:ef7eb2e8f9f7 1405 *
<> 144:ef7eb2e8f9f7 1406 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1407 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1408 */
<> 144:ef7eb2e8f9f7 1409 status_t CLOCK_SetFeeMode(uint8_t frdiv, mcg_dmx32_t dmx32, mcg_drs_t drs, void (*fllStableDelay)(void));
<> 144:ef7eb2e8f9f7 1410
<> 144:ef7eb2e8f9f7 1411 /*!
<> 144:ef7eb2e8f9f7 1412 * @brief Set MCG to FBI mode.
<> 144:ef7eb2e8f9f7 1413 *
<> 144:ef7eb2e8f9f7 1414 * This function sets MCG to FBI mode. If could not set to FBI mode directly
<> 144:ef7eb2e8f9f7 1415 * from current mode, this function returns error.
<> 144:ef7eb2e8f9f7 1416 *
<> 144:ef7eb2e8f9f7 1417 * @param drs The DCO range selection.
<> 144:ef7eb2e8f9f7 1418 * @param fllStableDelay Delay function to make sure FLL is stable. If FLL
<> 144:ef7eb2e8f9f7 1419 * is not used in FBI mode, this parameter could be NULL. Pass in
<> 144:ef7eb2e8f9f7 1420 * NULL does not delay.
<> 144:ef7eb2e8f9f7 1421 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1422 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1423 */
<> 144:ef7eb2e8f9f7 1424 status_t CLOCK_SetFbiMode(mcg_drs_t drs, void (*fllStableDelay)(void));
<> 144:ef7eb2e8f9f7 1425
<> 144:ef7eb2e8f9f7 1426 /*!
<> 144:ef7eb2e8f9f7 1427 * @brief Set MCG to FBE mode.
<> 144:ef7eb2e8f9f7 1428 *
<> 144:ef7eb2e8f9f7 1429 * This function sets MCG to FBE mode. If could not set to FBE mode directly
<> 144:ef7eb2e8f9f7 1430 * from current mode, this function returns error.
<> 144:ef7eb2e8f9f7 1431 *
<> 144:ef7eb2e8f9f7 1432 * @param frdiv FLL reference clock divider setting, FRDIV.
<> 144:ef7eb2e8f9f7 1433 * @param dmx32 DMX32 in FBE mode.
<> 144:ef7eb2e8f9f7 1434 * @param drs The DCO range selection.
<> 144:ef7eb2e8f9f7 1435 * @param fllStableDelay Delay function to make sure FLL is stable. If FLL
<> 144:ef7eb2e8f9f7 1436 * is not used in FBE mode, this parameter could be NULL. Pass in NULL
<> 144:ef7eb2e8f9f7 1437 * does not delay.
<> 144:ef7eb2e8f9f7 1438 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1439 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1440 */
<> 144:ef7eb2e8f9f7 1441 status_t CLOCK_SetFbeMode(uint8_t frdiv, mcg_dmx32_t dmx32, mcg_drs_t drs, void (*fllStableDelay)(void));
<> 144:ef7eb2e8f9f7 1442
<> 144:ef7eb2e8f9f7 1443 /*!
<> 144:ef7eb2e8f9f7 1444 * @brief Set MCG to BLPI mode.
<> 144:ef7eb2e8f9f7 1445 *
<> 144:ef7eb2e8f9f7 1446 * This function sets MCG to BLPI mode. If could not set to BLPI mode directly
<> 144:ef7eb2e8f9f7 1447 * from current mode, this function returns error.
<> 144:ef7eb2e8f9f7 1448 *
<> 144:ef7eb2e8f9f7 1449 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1450 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1451 */
<> 144:ef7eb2e8f9f7 1452 status_t CLOCK_SetBlpiMode(void);
<> 144:ef7eb2e8f9f7 1453
<> 144:ef7eb2e8f9f7 1454 /*!
<> 144:ef7eb2e8f9f7 1455 * @brief Set MCG to BLPE mode.
<> 144:ef7eb2e8f9f7 1456 *
<> 144:ef7eb2e8f9f7 1457 * This function sets MCG to BLPE mode. If could not set to BLPE mode directly
<> 144:ef7eb2e8f9f7 1458 * from current mode, this function returns error.
<> 144:ef7eb2e8f9f7 1459 *
<> 144:ef7eb2e8f9f7 1460 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1461 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1462 */
<> 144:ef7eb2e8f9f7 1463 status_t CLOCK_SetBlpeMode(void);
<> 144:ef7eb2e8f9f7 1464
<> 144:ef7eb2e8f9f7 1465 /*!
<> 144:ef7eb2e8f9f7 1466 * @brief Set MCG to PBE mode.
<> 144:ef7eb2e8f9f7 1467 *
<> 144:ef7eb2e8f9f7 1468 * This function sets MCG to PBE mode. If could not set to PBE mode directly
<> 144:ef7eb2e8f9f7 1469 * from current mode, this function returns error.
<> 144:ef7eb2e8f9f7 1470 *
<> 144:ef7eb2e8f9f7 1471 * @param pllcs The PLL selection, PLLCS.
<> 144:ef7eb2e8f9f7 1472 * @param config Pointer to the PLL configuration.
<> 144:ef7eb2e8f9f7 1473 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1474 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1475 *
<> 144:ef7eb2e8f9f7 1476 * @note
<> 144:ef7eb2e8f9f7 1477 * 1. The parameter \c pllcs selects the PLL, for some platforms, there is
<> 144:ef7eb2e8f9f7 1478 * only one PLL, the parameter pllcs is kept for interface compatible.
<> 144:ef7eb2e8f9f7 1479 * 2. The parameter \c config is the PLL configuration structure, on some
<> 144:ef7eb2e8f9f7 1480 * platforms, could choose the external PLL directly. This means that the
<> 144:ef7eb2e8f9f7 1481 * configuration structure is not necessary, pass in NULL for this case.
<> 144:ef7eb2e8f9f7 1482 * For example: CLOCK_SetPbeMode(kMCG_OscselOsc, kMCG_PllClkSelExtPll, NULL);
<> 144:ef7eb2e8f9f7 1483 */
<> 144:ef7eb2e8f9f7 1484 status_t CLOCK_SetPbeMode(mcg_pll_clk_select_t pllcs, mcg_pll_config_t const *config);
<> 144:ef7eb2e8f9f7 1485
<> 144:ef7eb2e8f9f7 1486 /*!
<> 144:ef7eb2e8f9f7 1487 * @brief Set MCG to PEE mode.
<> 144:ef7eb2e8f9f7 1488 *
<> 144:ef7eb2e8f9f7 1489 * This function sets MCG to PEE mode.
<> 144:ef7eb2e8f9f7 1490 *
<> 144:ef7eb2e8f9f7 1491 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1492 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1493 *
<> 144:ef7eb2e8f9f7 1494 * @note This function only change CLKS to use PLL/FLL output. If the
<> 144:ef7eb2e8f9f7 1495 * PRDIV/VDIV are different from PBE mode, please setup these
<> 144:ef7eb2e8f9f7 1496 * settings in PBE mode and wait for stable then switch to PEE mode.
<> 144:ef7eb2e8f9f7 1497 */
<> 144:ef7eb2e8f9f7 1498 status_t CLOCK_SetPeeMode(void);
<> 144:ef7eb2e8f9f7 1499
<> 144:ef7eb2e8f9f7 1500 /*!
<> 144:ef7eb2e8f9f7 1501 * @brief Switch MCG to FBE mode quickly from external mode.
<> 144:ef7eb2e8f9f7 1502 *
<> 144:ef7eb2e8f9f7 1503 * This function changes MCG from external modes (PEE/PBE/BLPE/FEE) to FBE mode quickly.
<> 144:ef7eb2e8f9f7 1504 * It only changes to use external clock as the system clock souce and disable PLL, but does not
<> 144:ef7eb2e8f9f7 1505 * configure FLL settings. This is a lite function with small code size, it is useful
<> 144:ef7eb2e8f9f7 1506 * during mode switch. For example, to switch from PEE mode to FEI mode:
<> 144:ef7eb2e8f9f7 1507 *
<> 144:ef7eb2e8f9f7 1508 * @code
<> 144:ef7eb2e8f9f7 1509 * CLOCK_ExternalModeToFbeModeQuick();
<> 144:ef7eb2e8f9f7 1510 * CLOCK_SetFeiMode(...);
<> 144:ef7eb2e8f9f7 1511 * @endcode
<> 144:ef7eb2e8f9f7 1512 *
<> 144:ef7eb2e8f9f7 1513 * @retval kStatus_Success Change successfully.
<> 144:ef7eb2e8f9f7 1514 * @retval kStatus_MCG_ModeInvalid Current mode is not external modes, should not call this function.
<> 144:ef7eb2e8f9f7 1515 */
<> 144:ef7eb2e8f9f7 1516 status_t CLOCK_ExternalModeToFbeModeQuick(void);
<> 144:ef7eb2e8f9f7 1517
<> 144:ef7eb2e8f9f7 1518 /*!
<> 144:ef7eb2e8f9f7 1519 * @brief Switch MCG to FBI mode quickly from internal modes.
<> 144:ef7eb2e8f9f7 1520 *
<> 144:ef7eb2e8f9f7 1521 * This function changes MCG from internal modes (PEI/PBI/BLPI/FEI) to FBI mode quickly.
<> 144:ef7eb2e8f9f7 1522 * It only changes to use MCGIRCLK as the system clock souce and disable PLL, but does not
<> 144:ef7eb2e8f9f7 1523 * configure FLL settings. This is a lite function with small code size, it is useful
<> 144:ef7eb2e8f9f7 1524 * during mode switch. For example, to switch from PEI mode to FEE mode:
<> 144:ef7eb2e8f9f7 1525 *
<> 144:ef7eb2e8f9f7 1526 * @code
<> 144:ef7eb2e8f9f7 1527 * CLOCK_InternalModeToFbiModeQuick();
<> 144:ef7eb2e8f9f7 1528 * CLOCK_SetFeeMode(...);
<> 144:ef7eb2e8f9f7 1529 * @endcode
<> 144:ef7eb2e8f9f7 1530 *
<> 144:ef7eb2e8f9f7 1531 * @retval kStatus_Success Change successfully.
<> 144:ef7eb2e8f9f7 1532 * @retval kStatus_MCG_ModeInvalid Current mode is not internal mode, should not call this function.
<> 144:ef7eb2e8f9f7 1533 */
<> 144:ef7eb2e8f9f7 1534 status_t CLOCK_InternalModeToFbiModeQuick(void);
<> 144:ef7eb2e8f9f7 1535
<> 144:ef7eb2e8f9f7 1536 /*!
<> 144:ef7eb2e8f9f7 1537 * @brief Set MCG to FEI mode during system boot up.
<> 144:ef7eb2e8f9f7 1538 *
<> 144:ef7eb2e8f9f7 1539 * This function sets MCG to FEI mode from reset mode, it could be used to
<> 144:ef7eb2e8f9f7 1540 * set up MCG during system boot up. @ref kMCG_Dmx32Default is used in this
<> 144:ef7eb2e8f9f7 1541 * mode because using kMCG_Dmx32Fine with internal reference clock source
<> 144:ef7eb2e8f9f7 1542 * might damage hardware.
<> 144:ef7eb2e8f9f7 1543 *
<> 144:ef7eb2e8f9f7 1544 * @param drs The DCO range selection.
<> 144:ef7eb2e8f9f7 1545 * @param fllStableDelay Delay function to make sure FLL is stable.
<> 144:ef7eb2e8f9f7 1546 *
<> 144:ef7eb2e8f9f7 1547 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1548 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1549 */
<> 144:ef7eb2e8f9f7 1550 status_t CLOCK_BootToFeiMode(mcg_drs_t drs, void (*fllStableDelay)(void));
<> 144:ef7eb2e8f9f7 1551
<> 144:ef7eb2e8f9f7 1552 /*!
<> 144:ef7eb2e8f9f7 1553 * @brief Set MCG to FEE mode during system bootup.
<> 144:ef7eb2e8f9f7 1554 *
<> 144:ef7eb2e8f9f7 1555 * This function sets MCG to FEE mode from reset mode, it could be used to
<> 144:ef7eb2e8f9f7 1556 * set up MCG during system boot up.
<> 144:ef7eb2e8f9f7 1557 *
<> 144:ef7eb2e8f9f7 1558 * @param oscsel OSC clock select, OSCSEL.
<> 144:ef7eb2e8f9f7 1559 * @param frdiv FLL reference clock divider setting, FRDIV.
<> 144:ef7eb2e8f9f7 1560 * @param dmx32 DMX32 in FEE mode.
<> 144:ef7eb2e8f9f7 1561 * @param drs The DCO range selection.
<> 144:ef7eb2e8f9f7 1562 * @param fllStableDelay Delay function to make sure FLL is stable.
<> 144:ef7eb2e8f9f7 1563 *
<> 144:ef7eb2e8f9f7 1564 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1565 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1566 */
<> 144:ef7eb2e8f9f7 1567 status_t CLOCK_BootToFeeMode(
<> 144:ef7eb2e8f9f7 1568 mcg_oscsel_t oscsel, uint8_t frdiv, mcg_dmx32_t dmx32, mcg_drs_t drs, void (*fllStableDelay)(void));
<> 144:ef7eb2e8f9f7 1569
<> 144:ef7eb2e8f9f7 1570 /*!
<> 144:ef7eb2e8f9f7 1571 * @brief Set MCG to BLPI mode during system boot up.
<> 144:ef7eb2e8f9f7 1572 *
<> 144:ef7eb2e8f9f7 1573 * This function sets MCG to BLPI mode from reset mode, it could be used to
<> 144:ef7eb2e8f9f7 1574 * setup MCG during sytem boot up.
<> 144:ef7eb2e8f9f7 1575 *
<> 144:ef7eb2e8f9f7 1576 * @param fcrdiv Fast IRC divider, FCRDIV.
<> 144:ef7eb2e8f9f7 1577 * @param ircs The internal reference clock to select, IRCS.
<> 144:ef7eb2e8f9f7 1578 * @param ircEnableMode The MCGIRCLK enable mode, OR'ed value of @ref _mcg_irclk_enable_mode.
<> 144:ef7eb2e8f9f7 1579 *
<> 144:ef7eb2e8f9f7 1580 * @retval kStatus_MCG_SourceUsed Could not change MCGIRCLK setting.
<> 144:ef7eb2e8f9f7 1581 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1582 */
<> 144:ef7eb2e8f9f7 1583 status_t CLOCK_BootToBlpiMode(uint8_t fcrdiv, mcg_irc_mode_t ircs, uint8_t ircEnableMode);
<> 144:ef7eb2e8f9f7 1584
<> 144:ef7eb2e8f9f7 1585 /*!
<> 144:ef7eb2e8f9f7 1586 * @brief Set MCG to BLPE mode during sytem boot up.
<> 144:ef7eb2e8f9f7 1587 *
<> 144:ef7eb2e8f9f7 1588 * This function sets MCG to BLPE mode from reset mode, it could be used to
<> 144:ef7eb2e8f9f7 1589 * setup MCG during sytem boot up.
<> 144:ef7eb2e8f9f7 1590 *
<> 144:ef7eb2e8f9f7 1591 * @param oscsel OSC clock select, MCG_C7[OSCSEL].
<> 144:ef7eb2e8f9f7 1592 *
<> 144:ef7eb2e8f9f7 1593 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1594 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1595 */
<> 144:ef7eb2e8f9f7 1596 status_t CLOCK_BootToBlpeMode(mcg_oscsel_t oscsel);
<> 144:ef7eb2e8f9f7 1597
<> 144:ef7eb2e8f9f7 1598 /*!
<> 144:ef7eb2e8f9f7 1599 * @brief Set MCG to PEE mode during system boot up.
<> 144:ef7eb2e8f9f7 1600 *
<> 144:ef7eb2e8f9f7 1601 * This function sets MCG to PEE mode from reset mode, it could be used to
<> 144:ef7eb2e8f9f7 1602 * setup MCG during system boot up.
<> 144:ef7eb2e8f9f7 1603 *
<> 144:ef7eb2e8f9f7 1604 * @param oscsel OSC clock select, MCG_C7[OSCSEL].
<> 144:ef7eb2e8f9f7 1605 * @param pllcs The PLL selection, PLLCS.
<> 144:ef7eb2e8f9f7 1606 * @param config Pointer to the PLL configuration.
<> 144:ef7eb2e8f9f7 1607 *
<> 144:ef7eb2e8f9f7 1608 * @retval kStatus_MCG_ModeUnreachable Could not switch to the target mode.
<> 144:ef7eb2e8f9f7 1609 * @retval kStatus_Success Switch to target mode successfully.
<> 144:ef7eb2e8f9f7 1610 */
<> 144:ef7eb2e8f9f7 1611 status_t CLOCK_BootToPeeMode(mcg_oscsel_t oscsel, mcg_pll_clk_select_t pllcs, mcg_pll_config_t const *config);
<> 144:ef7eb2e8f9f7 1612
<> 144:ef7eb2e8f9f7 1613 /*!
<> 144:ef7eb2e8f9f7 1614 * @brief Set MCG to some target mode.
<> 144:ef7eb2e8f9f7 1615 *
<> 144:ef7eb2e8f9f7 1616 * This function sets MCG to some target mode defined by the configure
<> 144:ef7eb2e8f9f7 1617 * structure, if cannot switch to target mode directly, this function will
<> 144:ef7eb2e8f9f7 1618 * choose the proper path.
<> 144:ef7eb2e8f9f7 1619 *
<> 144:ef7eb2e8f9f7 1620 * @param config Pointer to the target MCG mode configuration structure.
<> 144:ef7eb2e8f9f7 1621 * @return Return kStatus_Success if switch successfully, otherwise return error code #_mcg_status.
<> 144:ef7eb2e8f9f7 1622 *
<> 144:ef7eb2e8f9f7 1623 * @note If external clock is used in the target mode, please make sure it is
<> 144:ef7eb2e8f9f7 1624 * enabled, for example, if the OSC0 is used, please setup OSC0 correctly before
<> 144:ef7eb2e8f9f7 1625 * this funciton.
<> 144:ef7eb2e8f9f7 1626 */
<> 144:ef7eb2e8f9f7 1627 status_t CLOCK_SetMcgConfig(mcg_config_t const *config);
<> 144:ef7eb2e8f9f7 1628
<> 144:ef7eb2e8f9f7 1629 /*@}*/
<> 144:ef7eb2e8f9f7 1630
<> 144:ef7eb2e8f9f7 1631 #if defined(__cplusplus)
<> 144:ef7eb2e8f9f7 1632 }
<> 144:ef7eb2e8f9f7 1633 #endif /* __cplusplus */
<> 144:ef7eb2e8f9f7 1634
<> 144:ef7eb2e8f9f7 1635 /*! @} */
<> 144:ef7eb2e8f9f7 1636
<> 144:ef7eb2e8f9f7 1637 #endif /* _FSL_CLOCK_H_ */