1 /* 2 ** ################################################################### 3 ** Processors: MIMXRT758SGAWAR_hifi1 4 ** MIMXRT758SGFOA_hifi1 5 ** 6 ** Compiler: Xtensa Compiler 7 ** Reference manual: iMXRT700RM Rev.2 DraftA, 05/2024 8 ** Version: rev. 2.0, 2024-05-28 9 ** Build: b240528 10 ** 11 ** Abstract: 12 ** Provides a system configuration function and a global variable that 13 ** contains the system frequency. It configures the device and initializes 14 ** the oscillator (PLL) that is part of the microcontroller device. 15 ** 16 ** Copyright 2016 Freescale Semiconductor, Inc. 17 ** Copyright 2016-2024 NXP 18 ** SPDX-License-Identifier: BSD-3-Clause 19 ** 20 ** http: www.nxp.com 21 ** mail: support@nxp.com 22 ** 23 ** Revisions: 24 ** - rev. 1.0 (2022-09-15) 25 ** Initial version. 26 ** - rev. 2.0 (2024-05-28) 27 ** Rev2 DraftA. 28 ** 29 ** ################################################################### 30 */ 31 32 /*! 33 * @file MIMXRT758S 34 * @version 1.0 35 * @date 2024-05-28 36 * @brief Device specific configuration file for MIMXRT758S 37 * (implementation file) 38 * 39 * Provides a system configuration function and a global variable that contains 40 * the system frequency. It configures the device and initializes the oscillator 41 * (PLL) that is part of the microcontroller device. 42 */ 43 44 #include <stdint.h> 45 #include "fsl_device_registers.h" 46 47 /* ---------------------------------------------------------------------------- 48 -- Core clock 49 ---------------------------------------------------------------------------- */ 50 uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; 51 52 /* ---------------------------------------------------------------------------- 53 -- SystemInit() 54 ---------------------------------------------------------------------------- */ 55 SystemInit(void)56__attribute__((weak)) void SystemInit(void) 57 { 58 SystemInitHook(); 59 } 60 61 /* ---------------------------------------------------------------------------- 62 -- SystemCoreClockUpdate() 63 ---------------------------------------------------------------------------- */ getFro2MaxFreq(void)64static uint32_t getFro2MaxFreq(void) 65 { 66 return CLK_FRO2_CLK; 67 } 68 getFro1MaxFreq(void)69static uint32_t getFro1MaxFreq(void) 70 { 71 return CLK_FRO1_MAX_CLK; 72 } 73 getFro1Div3Freq(void)74static uint32_t getFro1Div3Freq(void) 75 { 76 return getFro1MaxFreq() / 3U; 77 } 78 getFro2Div3Freq(void)79static uint32_t getFro2Div3Freq(void) 80 { 81 return getFro2MaxFreq() / 3U; 82 } 83 getLpOscFreq(void)84static uint32_t getLpOscFreq(void) 85 { 86 return CLK_LPOSC_1MHZ; 87 } 88 getBaseClkSense(void)89static uint32_t getBaseClkSense(void) 90 { 91 uint32_t freq = 0U; 92 93 switch (CLKCTL1->SENSEBASECLKSEL & CLKCTL1_SENSEBASECLKSEL_SEL_MASK) 94 { 95 case CLKCTL1_SENSEBASECLKSEL_SEL(0): 96 freq = getFro1Div3Freq(); 97 break; 98 case CLKCTL1_SENSEBASECLKSEL_SEL(1): 99 freq = getFro1MaxFreq(); 100 break; 101 case CLKCTL1_SENSEBASECLKSEL_SEL(2): 102 freq = getFro2Div3Freq(); 103 break; 104 case CLKCTL1_SENSEBASECLKSEL_SEL(3): 105 freq = getLpOscFreq(); 106 break; 107 default: 108 freq = 0U; 109 break; 110 } 111 112 return freq; 113 } 114 getAudioPllFreq(void)115static uint32_t getAudioPllFreq(void) 116 { 117 uint32_t freq = 0U; 118 uint64_t freqTmp; 119 120 switch ((CLKCTL2->AUDIOPLL0CLKSEL) & CLKCTL2_AUDIOPLL0CLKSEL_SEL_MASK) 121 { 122 case CLKCTL2_AUDIOPLL0CLKSEL_SEL(0): 123 freq = getFro1MaxFreq() / 8U; 124 break; 125 case CLKCTL2_AUDIOPLL0CLKSEL_SEL(1): 126 freq = CLK_OSC_CLK; 127 break; 128 default: 129 freq = 0U; 130 break; 131 } 132 133 if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL) 134 { 135 /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */ 136 freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL2->AUDIOPLL0NUM))) / ((uint64_t)(CLKCTL2->AUDIOPLL0DENOM)); 137 freq *= ((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_MULT_MASK) >> CLKCTL2_AUDIOPLL0CTL0_MULT_SHIFT; 138 freq += (uint32_t)freqTmp; 139 } 140 return freq; 141 } 142 getAudioPllPfd1Freq(void)143static uint32_t getAudioPllPfd1Freq(void) 144 { 145 uint32_t freq = getAudioPllFreq(); 146 147 if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL) 148 { 149 freq = 150 (uint32_t)((uint64_t)freq * 18U / 151 ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD1_MASK) >> CLKCTL2_AUDIOPLL0PFD_PFD1_SHIFT)); 152 } 153 return freq; 154 } 155 SystemCoreClockUpdate(void)156void SystemCoreClockUpdate(void) 157 { 158 uint32_t freq = 0U; 159 160 switch ((CLKCTL1->SENSEDSPCPUCLKSEL) & CLKCTL1_SENSEDSPCPUCLKSEL_SEL_MASK) 161 { 162 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(0): 163 freq = getBaseClkSense(); 164 break; 165 166 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(1): 167 freq = getFro2MaxFreq(); 168 break; 169 170 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(2): 171 freq = getAudioPllPfd1Freq(); 172 break; 173 174 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(3): 175 freq = getFro1MaxFreq(); 176 break; 177 178 default: 179 freq = 0U; 180 break; 181 } 182 183 SystemCoreClock = freq / ((CLKCTL1->SENSEDSPCPUCLKDIV & CLKCTL1_SENSEDSPCPUCLKDIV_DIV_MASK) + 1U); 184 } 185 186 /* ---------------------------------------------------------------------------- 187 -- SystemInitHook() 188 ---------------------------------------------------------------------------- */ 189 SystemInitHook(void)190__attribute__((weak)) void SystemInitHook(void) 191 { 192 /* Void implementation of the weak function. */ 193 } 194