ISSDK  1.8
IoT Sensing Software Development Kit
clock_config.c
Go to the documentation of this file.
1 /*
2  * Copyright 2019 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 /*
9  * How to setup clock using clock driver functions:
10  *
11  * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.
12  *
13  * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.
14  *
15  * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.
16  *
17  * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.
18  *
19  * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.
20  *
21  */
22 
23 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
24 !!GlobalInfo
25 product: Clocks v5.0
26 processor: MIMXRT1011xxxxx
27 package_id: MIMXRT1011DAE5A
28 mcu_data: ksdk2_0
29 processor_version: 0.0.0
30  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
31 
32 #include "clock_config.h"
33 #include "fsl_iomuxc.h"
34 
35 /*******************************************************************************
36  * Definitions
37  ******************************************************************************/
38 
39 /*******************************************************************************
40  * Variables
41  ******************************************************************************/
42 /* System clock frequency. */
43 extern uint32_t SystemCoreClock;
44 
45 /*******************************************************************************
46  ************************ BOARD_InitBootClocks function ************************
47  ******************************************************************************/
49 {
51 }
52 
53 /*******************************************************************************
54  ********************** Configuration BOARD_BootClockRUN ***********************
55  ******************************************************************************/
56 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
57 !!Configuration
58 name: BOARD_BootClockRUN
59 called_from_default_init: true
60 outputs:
61 - {id: ADC_ALT_CLK.outFreq, value: 40 MHz}
62 - {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}
63 - {id: CLK_1M.outFreq, value: 1 MHz}
64 - {id: CLK_24M.outFreq, value: 24 MHz}
65 - {id: CORE_CLK_ROOT.outFreq, value: 500 MHz}
66 - {id: ENET_500M_REF_CLK.outFreq, value: 500 MHz}
67 - {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}
68 - {id: FLEXSPI_CLK_ROOT.outFreq, value: 132 MHz}
69 - {id: GPT1_ipg_clk_highfreq.outFreq, value: 62.5 MHz}
70 - {id: GPT2_ipg_clk_highfreq.outFreq, value: 62.5 MHz}
71 - {id: IPG_CLK_ROOT.outFreq, value: 125 MHz}
72 - {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}
73 - {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}
74 - {id: MQS_MCLK.outFreq, value: 1080/17 MHz}
75 - {id: PERCLK_CLK_ROOT.outFreq, value: 62.5 MHz}
76 - {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}
77 - {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}
78 - {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}
79 - {id: SAI1_MCLK3.outFreq, value: 30 MHz}
80 - {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}
81 - {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}
82 - {id: SAI3_MCLK3.outFreq, value: 30 MHz}
83 - {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}
84 - {id: TRACE_CLK_ROOT.outFreq, value: 352/3 MHz}
85 - {id: UART_CLK_ROOT.outFreq, value: 80 MHz}
86 settings:
87 - {id: CCM.ADC_ACLK_PODF.scale, value: '12', locked: true}
88 - {id: CCM.AHB_PODF.scale, value: '1', locked: true}
89 - {id: CCM.FLEXSPI_PODF.scale, value: '4', locked: true}
90 - {id: CCM.IPG_PODF.scale, value: '4'}
91 - {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}
92 - {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}
93 - {id: CCM.PRE_PERIPH_CLK_SEL.sel, value: CCM_ANALOG.ENET_500M_REF_CLK}
94 - {id: CCM.SAI1_CLK_SEL.sel, value: CCM_ANALOG.PLL3_PFD2_CLK}
95 - {id: CCM.SAI3_CLK_SEL.sel, value: CCM_ANALOG.PLL3_PFD2_CLK}
96 - {id: CCM.TRACE_PODF.scale, value: '3', locked: true}
97 - {id: CCM_ANALOG.PLL2.denom, value: '1'}
98 - {id: CCM_ANALOG.PLL2.num, value: '0'}
99 - {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}
100 - {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}
101 - {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}
102 - {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}
103 - {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}
104 - {id: CCM_ANALOG.PLL2_PFD3_DIV.scale, value: '20'}
105 - {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}
106 - {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}
107 - {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}
108 - {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}
109 - {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}
110 - {id: CCM_ANALOG.PLL6_BYPASS.sel, value: CCM_ANALOG.PLL6}
111 - {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}
112 sources:
113 - {id: XTALOSC24M.OSC.outFreq, value: 24 MHz, enabled: true}
114 - {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}
115  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
116 
117 /*******************************************************************************
118  * Variables for BOARD_BootClockRUN configuration
119  ******************************************************************************/
120 const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN = {
121  .loopDivider = 1, /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */
122  .numerator = 0, /* 30 bit numerator of fractional loop divider */
123  .denominator = 1, /* 30 bit denominator of fractional loop divider */
124  .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
125 };
126 const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN = {
127  .loopDivider = 0, /* PLL loop divider, Fout = Fin * 20 */
128  .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
129 };
130 const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN = {
131  .enableClkOutput500M = true, /* Enable the PLL providing the ENET 500MHz reference clock */
132  .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
133 };
134 /*******************************************************************************
135  * Code for BOARD_BootClockRUN configuration
136  ******************************************************************************/
138 {
139  /* Init RTC OSC clock frequency. */
140  CLOCK_SetRtcXtalFreq(32768U);
141  /* Enable 1MHz clock output. */
142  XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;
143  /* Use free 1MHz clock output. */
144  XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;
145  /* Set XTAL 24MHz clock frequency. */
146  CLOCK_SetXtalFreq(24000000U);
147  /* Enable XTAL 24MHz clock source. */
148  CLOCK_InitExternalClk(0);
149  /* Enable internal RC. */
150  CLOCK_InitRcOsc24M();
151  /* Switch clock source to external OSC. */
152  CLOCK_SwitchOsc(kCLOCK_XtalOsc);
153  /* Set Oscillator ready counter value. */
154  CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);
155  /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */
156  CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */
157  CLOCK_SetMux(kCLOCK_PeriphMux, 1); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
158  /* Setting the VDD_SOC to 1.5V. It is necessary to config CORE to 500Mhz. */
159  DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);
160  /* Waiting for DCDC_STS_DC_OK bit is asserted */
161  while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))
162  {
163  }
164  /* Set AHB_PODF. */
165  CLOCK_SetDiv(kCLOCK_AhbDiv, 0);
166  /* Disable IPG clock gate. */
167  CLOCK_DisableClock(kCLOCK_Adc1);
168  CLOCK_DisableClock(kCLOCK_Xbar1);
169  /* Set IPG_PODF. */
170  CLOCK_SetDiv(kCLOCK_IpgDiv, 3);
171  /* Disable PERCLK clock gate. */
172  CLOCK_DisableClock(kCLOCK_Gpt1);
173  CLOCK_DisableClock(kCLOCK_Gpt1S);
174  CLOCK_DisableClock(kCLOCK_Gpt2);
175  CLOCK_DisableClock(kCLOCK_Gpt2S);
176  CLOCK_DisableClock(kCLOCK_Pit);
177  /* Set PERCLK_PODF. */
178  CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);
179  /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.
180  * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left
181  * unchanged. Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as
182  * well.*/
183 #if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))
184  /* Disable Flexspi clock gate. */
185  CLOCK_DisableClock(kCLOCK_FlexSpi);
186  /* Set FLEXSPI_PODF. */
187  CLOCK_SetDiv(kCLOCK_FlexspiDiv, 3);
188  /* Set Flexspi clock source. */
189  CLOCK_SetMux(kCLOCK_FlexspiMux, 0);
190  CLOCK_SetMux(kCLOCK_FlexspiSrcMux, 0);
191 #endif
192  /* Disable ADC_ACLK_EN clock gate. */
193  CCM->CSCMR2 &= ~CCM_CSCMR2_ADC_ACLK_EN_MASK;
194  /* Set ADC_ACLK_PODF. */
195  CLOCK_SetDiv(kCLOCK_AdcDiv, 11);
196  /* Disable LPSPI clock gate. */
197  CLOCK_DisableClock(kCLOCK_Lpspi1);
198  CLOCK_DisableClock(kCLOCK_Lpspi2);
199  /* Set LPSPI_PODF. */
200  CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);
201  /* Set Lpspi clock source. */
202  CLOCK_SetMux(kCLOCK_LpspiMux, 2);
203  /* Disable TRACE clock gate. */
204  CLOCK_DisableClock(kCLOCK_Trace);
205  /* Set TRACE_PODF. */
206  CLOCK_SetDiv(kCLOCK_TraceDiv, 2);
207  /* Set Trace clock source. */
208  CLOCK_SetMux(kCLOCK_TraceMux, 2);
209  /* Disable SAI1 clock gate. */
210  CLOCK_DisableClock(kCLOCK_Sai1);
211  /* Set SAI1_CLK_PRED. */
212  CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);
213  /* Set SAI1_CLK_PODF. */
214  CLOCK_SetDiv(kCLOCK_Sai1Div, 1);
215  /* Set Sai1 clock source. */
216  CLOCK_SetMux(kCLOCK_Sai1Mux, 0);
217  /* Disable SAI3 clock gate. */
218  CLOCK_DisableClock(kCLOCK_Sai3);
219  /* Set SAI3_CLK_PRED. */
220  CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);
221  /* Set SAI3_CLK_PODF. */
222  CLOCK_SetDiv(kCLOCK_Sai3Div, 1);
223  /* Set Sai3 clock source. */
224  CLOCK_SetMux(kCLOCK_Sai3Mux, 0);
225  /* Disable Lpi2c clock gate. */
226  CLOCK_DisableClock(kCLOCK_Lpi2c1);
227  CLOCK_DisableClock(kCLOCK_Lpi2c2);
228  /* Set LPI2C_CLK_PODF. */
229  CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);
230  /* Set Lpi2c clock source. */
231  CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);
232  /* Disable UART clock gate. */
233  CLOCK_DisableClock(kCLOCK_Lpuart1);
234  CLOCK_DisableClock(kCLOCK_Lpuart2);
235  CLOCK_DisableClock(kCLOCK_Lpuart3);
236  CLOCK_DisableClock(kCLOCK_Lpuart4);
237  /* Set UART_CLK_PODF. */
238  CLOCK_SetDiv(kCLOCK_UartDiv, 0);
239  /* Set Uart clock source. */
240  CLOCK_SetMux(kCLOCK_UartMux, 0);
241  /* Disable SPDIF clock gate. */
242  CLOCK_DisableClock(kCLOCK_Spdif);
243  /* Set SPDIF0_CLK_PRED. */
244  CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);
245  /* Set SPDIF0_CLK_PODF. */
246  CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);
247  /* Set Spdif clock source. */
248  CLOCK_SetMux(kCLOCK_SpdifMux, 3);
249  /* Disable Flexio1 clock gate. */
250  CLOCK_DisableClock(kCLOCK_Flexio1);
251  /* Set FLEXIO1_CLK_PRED. */
252  CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);
253  /* Set FLEXIO1_CLK_PODF. */
254  CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);
255  /* Set Flexio1 clock source. */
256  CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);
257  /* Set Pll3 sw clock source. */
258  CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);
259  /* Init System PLL. */
260  CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);
261  /* Init System pfd0. */
262  CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);
263  /* Init System pfd1. */
264  CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);
265  /* Init System pfd2. */
266  CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);
267  /* Init System pfd3. */
268  CLOCK_InitSysPfd(kCLOCK_Pfd3, 20);
269  /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.
270  * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left
271  * unchanged. Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as
272  * well.*/
273 #if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))
274  /* Init Usb1 PLL. */
275  CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);
276  /* Init Usb1 pfd0. */
277  CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 12);
278  /* Init Usb1 pfd1. */
279  CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);
280  /* Init Usb1 pfd2. */
281  CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);
282  /* Init Usb1 pfd3. */
283  CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);
284  /* Disable Usb1 PLL output for USBPHY1. */
285  CCM_ANALOG->PLL_USB1 &= ~CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK;
286 #endif
287  /* DeInit Audio PLL. */
288  CLOCK_DeinitAudioPll();
289  /* Bypass Audio PLL. */
290  CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);
291  /* Set divider for Audio PLL. */
292  CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;
293  CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;
294  /* Enable Audio PLL output. */
295  CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;
296  /* Init Enet PLL. */
297  CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
298  /* Set preperiph clock source. */
299  CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
300  /* Set periph clock source. */
301  CLOCK_SetMux(kCLOCK_PeriphMux, 0);
302  /* Set periph clock2 clock source. */
303  CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);
304  /* Set per clock source. */
305  CLOCK_SetMux(kCLOCK_PerclkMux, 0);
306  /* Set clock out1 divider. */
307  CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);
308  /* Set clock out1 source. */
309  CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);
310  /* Set clock out2 divider. */
311  CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);
312  /* Set clock out2 source. */
313  CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);
314  /* Set clock out1 drives clock out1. */
315  CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;
316  /* Disable clock out1. */
317  CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;
318  /* Disable clock out2. */
319  CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;
320  /* Set SAI1 MCLK1 clock source. */
321  IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);
322  /* Set SAI1 MCLK2 clock source. */
323  IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);
324  /* Set SAI1 MCLK3 clock source. */
325  IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);
326  /* Set SAI3 MCLK3 clock source. */
327  IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);
328  /* Set MQS configuration. */
329  IOMUXC_MQSConfig(IOMUXC_GPR, kIOMUXC_MqsPwmOverSampleRate32, 0);
330  /* Set GPT1 High frequency reference clock source. */
331  IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;
332  /* Set GPT2 High frequency reference clock source. */
333  IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;
334  /* Set SystemCoreClock variable. */
336 }
const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN
Enet PLL set for BOARD_BootClockRUN configuration.
Definition: clock_config.c:130
const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN
Sys PLL for BOARD_BootClockRUN configuration.
Definition: clock_config.c:120
void BOARD_InitBootClocks(void)
This function executes default configuration of clocks.
Definition: clock_config.c:52
uint32_t SystemCoreClock
void BOARD_BootClockRUN(void)
This function executes configuration of clocks.
Definition: clock_config.c:168
const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN
Usb1 PLL set for BOARD_BootClockRUN configuration.
Definition: clock_config.c:126
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK
Definition: clock_config.h:25