ISSDK  1.7
IoT Sensing Software Development Kit
clock_config.c
Go to the documentation of this file.
1 /*
2  * The Clear BSD License
3  * Copyright (c) 2016, Freescale Semiconductor, Inc.
4  * Copyright 2016-2017 NXP
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without modification,
8  * are permitted (subject to the limitations in the disclaimer below) provided
9  * that the following conditions are met:
10  *
11  * o Redistributions of source code must retain the above copyright notice, this list
12  * of conditions and the following disclaimer.
13  *
14  * o Redistributions in binary form must reproduce the above copyright notice, this
15  * list of conditions and the following disclaimer in the documentation and/or
16  * other materials provided with the distribution.
17  *
18  * o Neither the name of the copyright holder nor the names of its
19  * contributors may be used to endorse or promote products derived from this
20  * software without specific prior written permission.
21  *
22  * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
27  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
30  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 /*
36  * How to setup clock using clock driver functions:
37  *
38  * 1. Call CLOCK_InitXXX() to configure corresponding SCG clock source.
39  * Note: The clock could not be set when it is being used as system clock.
40  * In default out of reset, the CPU is clocked from FIRC(IRC48M),
41  * so before setting FIRC, change to use another avaliable clock source.
42  *
43  * 2. Call CLOCK_SetXtal0Freq() to set XTAL0 frequency based on board settings.
44  *
45  * 3. Call CLOCK_SetXxxModeSysClkConfig() to set SCG mode for Xxx run mode.
46  * Wait until the system clock source is changed to target source.
47  *
48  * 4. If power mode change is needed, call SMC_SetPowerModeProtection() to allow
49  * corresponding power mode and SMC_SetPowerModeXxx() to change to Xxx mode.
50  * Supported run mode and clock restrictions could be found in Reference Manual.
51  */
52 
53 /* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL *****************************
54 !!ClocksProfile
55 product: Clocks v1.0
56 processor: MKE15Z256xxx7
57 package_id: MKE15Z256VLL7
58 mcu_data: ksdk2_0
59 processor_version: 1.1.0
60  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/
61 
62 #include "fsl_smc.h"
63 #include "clock_config.h"
64 
65 /*******************************************************************************
66  * Definitions
67  ******************************************************************************/
68 
69 /*******************************************************************************
70  * Variables
71  ******************************************************************************/
72 /* System clock frequency. */
73 extern uint32_t SystemCoreClock;
74 
75 /*******************************************************************************
76  * Code
77  ******************************************************************************/
78 /*FUNCTION**********************************************************************
79  *
80  * Function Name : CLOCK_CONFIG_FircSafeConfig
81  * Description : This function is used to safely configure FIRC clock.
82  * In default out of reset, the CPU is clocked from FIRC(IRC48M).
83  * Before setting FIRC, change to use SIRC as system clock,
84  * then configure FIRC. After FIRC is set, change back to use FIRC
85  * in case SIRC need to be configured.
86  * Param fircConfig : FIRC configuration.
87  *
88  *END**************************************************************************/
89 static void CLOCK_CONFIG_FircSafeConfig(const scg_firc_config_t *fircConfig)
90 {
91  scg_sys_clk_config_t curConfig;
92  const scg_sirc_config_t scgSircConfig = {.enableMode = kSCG_SircEnable,
93  .div1 = kSCG_AsyncClkDisable,
94  .div2 = kSCG_AsyncClkDivBy2,
95  .range = kSCG_SircRangeHigh};
96  scg_sys_clk_config_t sysClkSafeConfigSource = {
97  .divSlow = kSCG_SysClkDivBy4, /* Slow clock divider */
98  .divCore = kSCG_SysClkDivBy1, /* Core clock divider */
99  .src = kSCG_SysClkSrcSirc /* System clock source */
100  };
101  /* Init Sirc. */
102  CLOCK_InitSirc(&scgSircConfig);
103  /* Change to use SIRC as system clock source to prepare to change FIRCCFG register. */
104  CLOCK_SetRunModeSysClkConfig(&sysClkSafeConfigSource);
105  /* Wait for clock source switch finished. */
106  do
107  {
108  CLOCK_GetCurSysClkConfig(&curConfig);
109  } while (curConfig.src != sysClkSafeConfigSource.src);
110 
111  /* Init Firc. */
112  CLOCK_InitFirc(fircConfig);
113  /* Change back to use FIRC as system clock source in order to configure SIRC if needed. */
114  sysClkSafeConfigSource.src = kSCG_SysClkSrcFirc;
115  CLOCK_SetRunModeSysClkConfig(&sysClkSafeConfigSource);
116  /* Wait for clock source switch finished. */
117  do
118  {
119  CLOCK_GetCurSysClkConfig(&curConfig);
120  } while (curConfig.src != sysClkSafeConfigSource.src);
121 }
122 
123 /*******************************************************************************
124  ********************** Configuration BOARD_BootClockRUN ***********************
125  ******************************************************************************/
126 /* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL *****************************
127 !!Configuration
128 name: BOARD_BootClockRUN
129 outputs:
130 - {id: Bus_clock.outFreq, value: 24 MHz}
131 - {id: Core_clock.outFreq, value: 72 MHz}
132 - {id: FIRCDIV2_CLK.outFreq, value: 48 MHz}
133 - {id: FLLDIV2_CLK.outFreq, value: 36 MHz}
134 - {id: Flash_clock.outFreq, value: 24 MHz}
135 - {id: LPO1KCLK.outFreq, value: 1 kHz}
136 - {id: LPO_clock.outFreq, value: 128 kHz}
137 - {id: SIRCDIV2_CLK.outFreq, value: 4 MHz}
138 - {id: SIRC_CLK.outFreq, value: 8 MHz}
139 - {id: SOSCDIV2_CLK.outFreq, value: 8 MHz}
140 - {id: SOSC_CLK.outFreq, value: 8 MHz}
141 - {id: System_clock.outFreq, value: 72 MHz}
142 settings:
143 - {id: SCGMode, value: LPFLL}
144 - {id: OSC32_CR_ROSCE_CFG, value: Enabled}
145 - {id: SCG.DIVCORE.scale, value: '1', locked: true}
146 - {id: SCG.DIVSLOW.scale, value: '3', locked: true}
147 - {id: SCG.FIRCDIV2.scale, value: '1'}
148 - {id: SCG.LPFLLDIV2.scale, value: '2'}
149 - {id: SCG.LPFLL_mul.scale, value: '36', locked: true}
150 - {id: SCG.SCSSEL.sel, value: SCG.LPFLL}
151 - {id: SCG.SIRCDIV2.scale, value: '2'}
152 - {id: SCG.SOSCDIV2.scale, value: '1'}
153 - {id: SCG.TRIMDIV.scale, value: '4'}
154 - {id: SCG_LPFLLCSR_LPFLLEN_CFG, value: Enabled}
155 - {id: SCG_SIRCCSR_SIRCLPEN_CFG, value: Disabled}
156 - {id: SCG_SOSCCFG_OSC_MODE_CFG, value: ModeOscLowPower}
157 - {id: SCG_SOSCCFG_RANGE_CFG, value: Medium}
158 - {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}
159 - {id: SCG_SOSCCSR_SOSCLPEN_CFG, value: Enabled}
160 sources:
161 - {id: SCG.SOSC.outFreq, value: 8 MHz, enabled: true}
162  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/
163 
164 /*******************************************************************************
165  * Variables for BOARD_BootClockRUN configuration
166  ******************************************************************************/
167 const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockRUN =
168  {
169  .divSlow = kSCG_SysClkDivBy3, /* Slow Clock Divider: divided by 3 */
170  .divCore = kSCG_SysClkDivBy1, /* Core Clock Divider: divided by 1 */
171  .src = kSCG_SysClkSrcLpFll, /* Low power FLL is selected as System Clock Source */
172  };
173 const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockRUN =
174  {
175  .freq = 8000000U, /* System Oscillator frequency: 8000000Hz */
176  .enableMode = kSCG_SysOscEnable | kSCG_SysOscEnableInLowPower,/* Enable System OSC clock, Enable System OSC in low power mode */
177  .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */
178  .div2 = kSCG_AsyncClkDivBy1, /* System OSC Clock Divider 2: divided by 1 */
179  .workMode = kSCG_SysOscModeOscLowPower, /* Oscillator low power */
180  };
181 const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockRUN =
182  {
183  .enableMode = kSCG_SircEnable, /* Enable SIRC clock */
184  .div2 = kSCG_AsyncClkDivBy2, /* Slow IRC Clock Divider 2: divided by 2 */
185  .range = kSCG_SircRangeHigh, /* Slow IRC high range clock (8 MHz) */
186  };
187 const scg_firc_config_t g_scgFircConfig_BOARD_BootClockRUN =
188  {
189  .enableMode = kSCG_FircEnable, /* Enable FIRC clock */
190  .div2 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 2: divided by 1 */
191  .range = kSCG_FircRange48M, /* Fast IRC is trimmed to 48MHz */
192  .trimConfig = NULL, /* Fast IRC Trim disabled */
193  };
194 const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockRUN =
195  {
196  .enableMode = kSCG_LpFllEnable, /* Enable LPFLL clock */
197  .div2 = kSCG_AsyncClkDivBy2, /* Low Power FLL Clock Divider 2: divided by 2 */
198  .range = kSCG_LpFllRange72M, /* LPFLL is trimmed to 72MHz */
199  .trimConfig = NULL,
200  };
201 /*******************************************************************************
202  * Code for BOARD_BootClockRUN configuration
203  ******************************************************************************/
205 {
206  scg_sys_clk_config_t curConfig;
207 
208  /* Init SOSC according to board configuration. */
209  CLOCK_InitSysOsc(&g_scgSysOscConfig_BOARD_BootClockRUN);
210  /* Set the XTAL0 frequency based on board settings. */
211  CLOCK_SetXtal0Freq(g_scgSysOscConfig_BOARD_BootClockRUN.freq);
212  /* Init FIRC. */
213  CLOCK_CONFIG_FircSafeConfig(&g_scgFircConfig_BOARD_BootClockRUN);
214  /* Init SIRC. */
215  CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockRUN);
216  /* Init LPFLL. */
217  CLOCK_InitLpFll(&g_scgLpFllConfig_BOARD_BootClockRUN);
218  /* Set SCG to LPFLL mode. */
219  CLOCK_SetRunModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockRUN);
220  /* Wait for clock source switch finished. */
221  do
222  {
223  CLOCK_GetCurSysClkConfig(&curConfig);
224  } while (curConfig.src != g_sysClkConfig_BOARD_BootClockRUN.src);
225  /* Set SystemCoreClock variable. */
227 }
228 
229 /*******************************************************************************
230  ********************* Configuration BOARD_BootClockVLPR ***********************
231  ******************************************************************************/
232 /* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL *****************************
233 !!Configuration
234 name: BOARD_BootClockVLPR
235 outputs:
236 - {id: Bus_clock.outFreq, value: 1 MHz}
237 - {id: Core_clock.outFreq, value: 4 MHz}
238 - {id: Flash_clock.outFreq, value: 1 MHz}
239 - {id: LPO1KCLK.outFreq, value: 1 kHz}
240 - {id: LPO_clock.outFreq, value: 128 kHz}
241 - {id: SOSCDIV2_CLK.outFreq, value: 8 MHz}
242 - {id: SOSC_CLK.outFreq, value: 8 MHz}
243 - {id: System_clock.outFreq, value: 4 MHz}
244 settings:
245 - {id: SCGMode, value: SOSC}
246 - {id: powerMode, value: VLPR}
247 - {id: OSC32_CR_ROSCE_CFG, value: Enabled}
248 - {id: SCG.DIVCORE.scale, value: '2', locked: true}
249 - {id: SCG.DIVSLOW.scale, value: '4', locked: true}
250 - {id: SCG.FIRCDIV2.scale, value: '1'}
251 - {id: SCG.LPFLLDIV2.scale, value: '2'}
252 - {id: SCG.LPFLL_mul.scale, value: '36', locked: true}
253 - {id: SCG.SCSSEL.sel, value: SCG.SOSC}
254 - {id: SCG.SIRCDIV2.scale, value: '2'}
255 - {id: SCG.SOSCDIV2.scale, value: '1'}
256 - {id: SCG.TRIMDIV.scale, value: '4'}
257 - {id: 'SCG::RCCR[DIVSLOW].bitField', value: Divide-by-3}
258 - {id: SCG_LPFLLCSR_LPFLLEN_CFG, value: Enabled}
259 - {id: SCG_SIRCCSR_SIRCLPEN_CFG, value: Disabled}
260 - {id: SCG_SOSCCFG_OSC_MODE_CFG, value: ModeOscLowPower}
261 - {id: SCG_SOSCCFG_RANGE_CFG, value: Medium}
262 - {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}
263 - {id: SCG_SOSCCSR_SOSCLPEN_CFG, value: Enabled}
264 sources:
265 - {id: SCG.SOSC.outFreq, value: 8 MHz, enabled: true}
266  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/
267 
268 /*******************************************************************************
269  * Variables for BOARD_BootClockVLPR configuration
270  ******************************************************************************/
271 const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockVLPR =
272  {
273  .divSlow = kSCG_SysClkDivBy4, /* Slow Clock Divider: divided by 4 */
274  .divCore = kSCG_SysClkDivBy2, /* Core Clock Divider: divided by 2 */
275  .src = kSCG_SysClkSrcSysOsc, /* System OSC is selected as System Clock Source */
276  };
277 const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockVLPR =
278  {
279  .freq = 8000000U, /* System Oscillator frequency: 8000000Hz */
280  .enableMode = kSCG_SysOscEnable | kSCG_SysOscEnableInLowPower,/* Enable System OSC clock, Enable System OSC in low power mode */
281  .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */
282  .div2 = kSCG_AsyncClkDivBy1, /* System OSC Clock Divider 2: divided by 1 */
283  .workMode = kSCG_SysOscModeOscLowPower, /* Oscillator low power */
284  };
285 const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockVLPR =
286  {
287  .enableMode = kSCG_SircEnable, /* Enable SIRC clock */
288  .div2 = kSCG_AsyncClkDivBy2, /* Slow IRC Clock Divider 2: divided by 2 */
289  .range = kSCG_SircRangeHigh, /* Slow IRC high range clock (8 MHz) */
290  };
291 const scg_firc_config_t g_scgFircConfig_BOARD_BootClockVLPR =
292  {
293  .enableMode = kSCG_FircEnable, /* Enable FIRC clock */
294  .div2 = kSCG_AsyncClkDivBy1, /* Fast IRC Clock Divider 2: divided by 1 */
295  .range = kSCG_FircRange48M, /* Fast IRC is trimmed to 48MHz */
296  .trimConfig = NULL, /* Fast IRC Trim disabled */
297  };
298 const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockVLPR =
299  {
300  .enableMode = kSCG_LpFllEnable, /* Enable LPFLL clock */
301  .div2 = kSCG_AsyncClkDivBy2, /* Low Power FLL Clock Divider 2: divided by 2 */
302  .range = kSCG_LpFllRange72M, /* LPFLL is trimmed to 72MHz */
303  .trimConfig = NULL,
304  };
305 /*******************************************************************************
306  * Code for BOARD_BootClockVLPR configuration
307  ******************************************************************************/
309 {
310  /* Init SOSC according to board configuration. */
311  CLOCK_InitSysOsc(&g_scgSysOscConfig_BOARD_BootClockVLPR);
312  /* Set the XTAL0 frequency based on board settings. */
313  CLOCK_SetXtal0Freq(g_scgSysOscConfig_BOARD_BootClockVLPR.freq);
314  /* Set SCG to SOSC mode. */
315  CLOCK_SetVlprModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockVLPR);
316  /* Allow SMC all power modes. */
317  SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);
318  /* Set VLPR power mode. */
319  SMC_SetPowerModeVlpr(SMC);
320  while (SMC_GetPowerModeState(SMC) != kSMC_PowerStateVlpr)
321  {
322  }
323  /* Set SystemCoreClock variable. */
325 }
326 
void BOARD_BootClockRUN(void)
This function executes configuration of clocks.
Definition: clock_config.c:194
const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockVLPR
Definition: clock_config.c:298
const scg_firc_config_t g_scgFircConfig_BOARD_BootClockVLPR
Definition: clock_config.c:291
const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockVLPR
SCG set for BOARD_BootClockVLPR configuration.
Definition: clock_config.c:271
void BOARD_BootClockVLPR(void)
This function executes configuration of clocks.
Definition: clock_config.c:292
const scg_firc_config_t g_scgFircConfig_BOARD_BootClockRUN
Definition: clock_config.c:187
const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockRUN
SIRC set for BOARD_BootClockRUN configuration.
Definition: clock_config.c:181
#define BOARD_BOOTCLOCKVLPR_CORE_CLOCK
Definition: clock_config.h:86
const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockRUN
System OSC set for BOARD_BootClockRUN configuration.
Definition: clock_config.c:173
const scg_lpfll_config_t g_scgLpFllConfig_BOARD_BootClockRUN
Definition: clock_config.c:194
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK
Definition: clock_config.h:51
const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockVLPR
SIRC set for BOARD_BootClockVLPR configuration.
Definition: clock_config.c:285
uint32_t SystemCoreClock
const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockVLPR
System OSC set for BOARD_BootClockVLPR configuration.
Definition: clock_config.c:277
const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockRUN
SCG set for BOARD_BootClockRUN configuration.
Definition: clock_config.c:167
#define SMC
Definition: lpc54114.h:144