1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017,2019 ,2021 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /*
10  * How to set up clock using clock driver functions:
11  *
12  * 1. Setup clock sources.
13  *
14  * 2. Setup voltage for the fastest of the clock outputs
15  *
16  * 3. Set up wait states of the flash.
17  *
18  * 4. Set up all dividers.
19  *
20  * 5. Set up all selectors to provide selected clocks.
21  */
22 
23 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
24 !!GlobalInfo
25 product: Clocks v7.0
26 processor: LPC51U68
27 package_id: LPC51U68JBD64
28 mcu_data: ksdk2_0
29 processor_version: 9.0.0
30 board: LPCXpresso51U68
31  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
32 
33 #include "fsl_power.h"
34 #include "fsl_clock.h"
35 #include "clock_config.h"
36 
37 /*******************************************************************************
38  * Definitions
39  ******************************************************************************/
40 
41 /*******************************************************************************
42  * Variables
43  ******************************************************************************/
44 /* System clock frequency. */
45 extern uint32_t SystemCoreClock;
46 
47 /*******************************************************************************
48  ************************ BOARD_InitBootClocks function ************************
49  ******************************************************************************/
BOARD_InitBootClocks(void)50 void BOARD_InitBootClocks(void)
51 {
52     BOARD_BootClockPLL150M();
53 }
54 
55 /*******************************************************************************
56  ******************** Configuration BOARD_BootClockFRO12M **********************
57  ******************************************************************************/
58 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
59 !!Configuration
60 name: BOARD_BootClockFRO12M
61 outputs:
62 - {id: System_clock.outFreq, value: 12 MHz}
63  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
64 
65 /*******************************************************************************
66  * Variables for BOARD_BootClockFRO12M configuration
67  ******************************************************************************/
68 /*******************************************************************************
69  * Code for BOARD_BootClockFRO12M configuration
70  ******************************************************************************/
BOARD_BootClockFRO12M(void)71 void BOARD_BootClockFRO12M(void)
72 {
73     /*!< Set up the clock sources */
74     /*!< Set up FRO */
75     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN);                   /*!< Ensure FRO is on  */
76     CLOCK_SetupFROClocking(12000000U);                    /*!< Set up FRO to the 12 MHz, just for sure */
77     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                  /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally
78                                                                 being below the voltage for current speed */
79     POWER_SetVoltageForFreq(12000000U);             /*!< Set voltage for the one of the fastest clock outputs: System clock output */
80     CLOCK_SetFLASHAccessCyclesForFreq(12000000U);   /*!< Set FLASH wait states for core */
81 
82     /*!< Set up dividers */
83     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);                  /*!< Set AHBCLKDIV divider to value 1 */
84 
85     /*!< Set up clock selectors - Attach clocks to the peripheries */
86     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                  /*!< Switch MAIN_CLK to FRO12M */
87     /*!< Set SystemCoreClock variable. */
88     SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;
89 }
90 
91 /*******************************************************************************
92  ******************* Configuration BOARD_BootClockFROHF48M *********************
93  ******************************************************************************/
94 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
95 !!Configuration
96 name: BOARD_BootClockFROHF48M
97 outputs:
98 - {id: System_clock.outFreq, value: 48 MHz}
99 settings:
100 - {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf}
101  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
102 
103 /*******************************************************************************
104  * Variables for BOARD_BootClockFROHF48M configuration
105  ******************************************************************************/
106 /*******************************************************************************
107  * Code for BOARD_BootClockFROHF48M configuration
108  ******************************************************************************/
BOARD_BootClockFROHF48M(void)109 void BOARD_BootClockFROHF48M(void)
110 {
111     /*!< Set up the clock sources */
112     /*!< Set up FRO */
113     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN);                   /*!< Ensure FRO is on  */
114     CLOCK_SetupFROClocking(12000000U);                    /*!< Set up FRO to the 12 MHz, just for sure */
115     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                  /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally
116                                                                 being below the voltage for current speed */
117     POWER_SetVoltageForFreq(48000000U);             /*!< Set voltage for the one of the fastest clock outputs: System clock output */
118     CLOCK_SetFLASHAccessCyclesForFreq(48000000U);   /*!< Set FLASH wait states for core */
119 
120     CLOCK_SetupFROClocking(48000000U);              /*!< Set up high frequency FRO output to selected frequency */
121 
122     /*!< Set up dividers */
123     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);                  /*!< Set AHBCLKDIV divider to value 1 */
124 
125     /*!< Set up clock selectors - Attach clocks to the peripheries */
126     CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                  /*!< Switch MAIN_CLK to FRO_HF */
127     /*!< Set SystemCoreClock variable. */
128     SystemCoreClock = BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK;
129 }
130 
131 /*******************************************************************************
132  ******************* Configuration BOARD_BootClockFROHF96M *********************
133  ******************************************************************************/
134 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
135 !!Configuration
136 name: BOARD_BootClockFROHF96M
137 outputs:
138 - {id: System_clock.outFreq, value: 96 MHz}
139 settings:
140 - {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf}
141 sources:
142 - {id: SYSCON.fro_hf.outFreq, value: 96 MHz}
143  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
144 
145 /*******************************************************************************
146  * Variables for BOARD_BootClockFROHF96M configuration
147  ******************************************************************************/
148 /*******************************************************************************
149  * Code for BOARD_BootClockFROHF96M configuration
150  ******************************************************************************/
BOARD_BootClockFROHF96M(void)151 void BOARD_BootClockFROHF96M(void)
152 {
153     /*!< Set up the clock sources */
154     /*!< Set up FRO */
155     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN);                   /*!< Ensure FRO is on  */
156     CLOCK_SetupFROClocking(12000000U);                    /*!< Set up FRO to the 12 MHz, just for sure */
157     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                  /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally
158                                                                 being below the voltage for current speed */
159     POWER_SetVoltageForFreq(96000000U);             /*!< Set voltage for the one of the fastest clock outputs: System clock output */
160     CLOCK_SetFLASHAccessCyclesForFreq(96000000U);   /*!< Set FLASH wait states for core */
161 
162     CLOCK_SetupFROClocking(96000000U);              /*!< Set up high frequency FRO output to selected frequency */
163 
164     /*!< Set up dividers */
165     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);                  /*!< Set AHBCLKDIV divider to value 1 */
166 
167     /*!< Set up clock selectors - Attach clocks to the peripheries */
168     CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                  /*!< Switch MAIN_CLK to FRO_HF */
169     /*!< Set SystemCoreClock variable. */
170     SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;
171 }
172 
173 /*******************************************************************************
174  ******************** Configuration BOARD_BootClockPLL150M *********************
175  ******************************************************************************/
176 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
177 !!Configuration
178 name: BOARD_BootClockPLL150M
179 called_from_default_init: true
180 outputs:
181 - {id: PLL_clock.outFreq, value: 150 MHz}
182 - {id: System_clock.outFreq, value: 150 MHz}
183 settings:
184 - {id: SYSCON.DIRECTO.sel, value: SYSCON.PLL}
185 - {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL_BYPASS}
186 - {id: SYSCON.M_MULT.scale, value: '153600', locked: true}
187 - {id: SYSCON.N_DIV.scale, value: '6', locked: true}
188 - {id: SYSCON.SYSPLLCLKSEL.sel, value: SYSCON.fro_12m}
189  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
190 
191 /*******************************************************************************
192  * Variables for BOARD_BootClockPLL150M configuration
193  ******************************************************************************/
194 /*******************************************************************************
195  * Code for BOARD_BootClockPLL150M configuration
196  ******************************************************************************/
BOARD_BootClockPLL150M(void)197 void BOARD_BootClockPLL150M(void)
198 {
199     /*!< Set up the clock sources */
200     /*!< Set up FRO */
201     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN);                   /*!< Ensure FRO is on  */
202     CLOCK_SetupFROClocking(12000000U);                    /*!< Set up FRO to the 12 MHz, just for sure */
203     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                  /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally
204                                                                 being below the voltage for current speed */
205     POWER_SetVoltageForFreq(150000000U);             /*!< Set voltage for the one of the fastest clock outputs: System clock output */
206     CLOCK_SetFLASHAccessCyclesForFreq(150000000U);   /*!< Set FLASH wait states for core */
207 
208     /*!< Set up PLL */
209     CLOCK_AttachClk(kFRO12M_to_SYS_PLL);                  /*!< Switch PLL clock source selector to FRO12M */
210     const pll_setup_t pllSetup = {
211         .syspllctrl = SYSCON_SYSPLLCTRL_UPLIMOFF_MASK | SYSCON_SYSPLLCTRL_DIRECTO_MASK,
212         .syspllndec = SYSCON_SYSPLLNDEC_NDEC(11U),
213         .syspllpdec = SYSCON_SYSPLLPDEC_PDEC(2U),
214         .syspllssctrl = {0x0U,(SYSCON_SYSPLLSSCTRL1_MD(76800U) | (uint32_t)(kSS_MF_512) | (uint32_t)(kSS_MR_K0) | (uint32_t)(kSS_MC_NOC))},
215         .pllRate = 150000000U,
216         .flags =  PLL_SETUPFLAG_POWERUP
217     };
218     CLOCK_SetPLLFreq(&pllSetup); /*!< Configure PLL to the desired values */
219 
220     /* PLL in Fractional/Spread spectrum mode */
221     /* SYSTICK is used for waiting for PLL stabilization */
222 
223     SysTick->LOAD = 111999UL;                              /*!< Set SysTick count value */
224     SysTick->VAL = 0UL;                                           /*!< Reset current count value */
225     SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;                      /*!< Enable SYSTICK */
226     while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk){}   /*!< Waiting for PLL stabilization */
227     SysTick->CTRL = 0UL;                                          /*!< Stop SYSTICK */
228 
229     /*!< Set up dividers */
230     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);                  /*!< Set AHBCLKDIV divider to value 1 */
231 
232     /*!< Set up clock selectors - Attach clocks to the peripheries */
233     CLOCK_AttachClk(kSYS_PLL_to_MAIN_CLK);                  /*!< Switch MAIN_CLK to SYS_PLL */
234     SYSCON->MAINCLKSELA = ((SYSCON->MAINCLKSELA & ~SYSCON_MAINCLKSELA_SEL_MASK) | SYSCON_MAINCLKSELA_SEL(0U)); /*!< Switch MAINCLKSELA to FRO12M even it is not used for MAINCLKSELB */
235     /*!< Set SystemCoreClock variable. */
236     SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;
237 }
238 
239