]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_LPC54018_MCUXpresso/NXP_Code/board/clock_config.c
Add MPU demo project for LPC54018 board.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_LPC54018_MCUXpresso / NXP_Code / board / clock_config.c
1 /*\r
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.\r
3  * Copyright 2016-2017,2019 NXP\r
4  * All rights reserved.\r
5  *\r
6  * SPDX-License-Identifier: BSD-3-Clause\r
7  */\r
8 /***********************************************************************************************************************\r
9  * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\r
10  * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\r
11  **********************************************************************************************************************/\r
12 /*\r
13  * How to set up clock using clock driver functions:\r
14  *\r
15  * 1. Setup clock sources.\r
16  *\r
17  * 2. Setup voltage for the fastest of the clock outputs\r
18  *\r
19  * 3. Set up wait states of the flash.\r
20  *\r
21  * 4. Set up all dividers.\r
22  *\r
23  * 5. Set up all selectors to provide selected clocks.\r
24  */\r
25 \r
26 /* clang-format off */\r
27 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r
28 !!GlobalInfo\r
29 product: Clocks v7.0\r
30 processor: LPC54018\r
31 package_id: LPC54018JET180\r
32 mcu_data: ksdk2_0\r
33 processor_version: 0.7.1\r
34  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r
35 /* clang-format on */\r
36 \r
37 #include "fsl_power.h"\r
38 #include "fsl_clock.h"\r
39 #include "clock_config.h"\r
40 \r
41 /*******************************************************************************\r
42  * Definitions\r
43  ******************************************************************************/\r
44 \r
45 /*******************************************************************************\r
46  * Variables\r
47  ******************************************************************************/\r
48 /* System clock frequency. */\r
49 extern uint32_t SystemCoreClock;\r
50 \r
51 /*******************************************************************************\r
52  ************************ BOARD_InitBootClocks function ************************\r
53  ******************************************************************************/\r
54 void BOARD_InitBootClocks(void)\r
55 {\r
56     BOARD_BootClockPLL180M();\r
57 }\r
58 \r
59 /*******************************************************************************\r
60  ******************** Configuration BOARD_BootClockFRO12M **********************\r
61  ******************************************************************************/\r
62 /* clang-format off */\r
63 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r
64 !!Configuration\r
65 name: BOARD_BootClockFRO12M\r
66 outputs:\r
67 - {id: FRO12M_clock.outFreq, value: 12 MHz}\r
68 - {id: FROHF_clock.outFreq, value: 48 MHz}\r
69 - {id: MAIN_clock.outFreq, value: 12 MHz}\r
70 - {id: System_clock.outFreq, value: 12 MHz}\r
71 settings:\r
72 - {id: SYSCON.EMCCLKDIV.scale, value: '1', locked: true}\r
73  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r
74 /* clang-format on */\r
75 \r
76 /*******************************************************************************\r
77  * Variables for BOARD_BootClockFRO12M configuration\r
78  ******************************************************************************/\r
79 /*******************************************************************************\r
80  * Code for BOARD_BootClockFRO12M configuration\r
81  ******************************************************************************/\r
82 void BOARD_BootClockFRO12M(void)\r
83 {\r
84     /*!< Set up the clock sources */\r
85     /*!< Set up FRO */\r
86     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on  */\r
87     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without\r
88                                              accidentally being below the voltage for current speed */\r
89     /*!< Need to make sure ROM and OTP has power(PDRUNCFG0[17,29]= 0U)\r
90          before calling this API since this API is implemented in ROM code */\r
91     CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */\r
92     POWER_SetVoltageForFreq(\r
93         12000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */\r
94 \r
95     /*!< Set up dividers */\r
96     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */\r
97 \r
98     /*!< Set up clock selectors - Attach clocks to the peripheries */\r
99     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO12M */\r
100     /* Set SystemCoreClock variable. */\r
101     SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\r
102 }\r
103 \r
104 /*******************************************************************************\r
105  ******************* Configuration BOARD_BootClockFROHF48M *********************\r
106  ******************************************************************************/\r
107 /* clang-format off */\r
108 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r
109 !!Configuration\r
110 name: BOARD_BootClockFROHF48M\r
111 outputs:\r
112 - {id: FRO12M_clock.outFreq, value: 12 MHz}\r
113 - {id: FROHF_clock.outFreq, value: 48 MHz}\r
114 - {id: MAIN_clock.outFreq, value: 48 MHz}\r
115 - {id: System_clock.outFreq, value: 48 MHz}\r
116 settings:\r
117 - {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf}\r
118  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r
119 /* clang-format on */\r
120 \r
121 /*******************************************************************************\r
122  * Variables for BOARD_BootClockFROHF48M configuration\r
123  ******************************************************************************/\r
124 /*******************************************************************************\r
125  * Code for BOARD_BootClockFROHF48M configuration\r
126  ******************************************************************************/\r
127 void BOARD_BootClockFROHF48M(void)\r
128 {\r
129     /*!< Set up the clock sources */\r
130     /*!< Set up FRO */\r
131     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on  */\r
132     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without\r
133                                              accidentally being below the voltage for current speed */\r
134     POWER_SetVoltageForFreq(\r
135         48000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */\r
136     /*!< Need to make sure ROM and OTP has power(PDRUNCFG0[17,29]= 0U)\r
137          before calling this API since this API is implemented in ROM code */\r
138     CLOCK_SetupFROClocking(48000000U); /*!< Set up high frequency FRO output to selected frequency */\r
139 \r
140     /*!< Set up dividers */\r
141     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */\r
142 \r
143     /*!< Set up clock selectors - Attach clocks to the peripheries */\r
144     CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */\r
145     /* Set SystemCoreClock variable. */\r
146     SystemCoreClock = BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK;\r
147 }\r
148 \r
149 /*******************************************************************************\r
150  ******************* Configuration BOARD_BootClockFROHF96M *********************\r
151  ******************************************************************************/\r
152 /* clang-format off */\r
153 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r
154 !!Configuration\r
155 name: BOARD_BootClockFROHF96M\r
156 outputs:\r
157 - {id: FRO12M_clock.outFreq, value: 12 MHz}\r
158 - {id: FROHF_clock.outFreq, value: 96 MHz}\r
159 - {id: MAIN_clock.outFreq, value: 96 MHz}\r
160 - {id: System_clock.outFreq, value: 96 MHz}\r
161 settings:\r
162 - {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf}\r
163 sources:\r
164 - {id: SYSCON.fro_hf.outFreq, value: 96 MHz}\r
165  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r
166 /* clang-format on */\r
167 \r
168 /*******************************************************************************\r
169  * Variables for BOARD_BootClockFROHF96M configuration\r
170  ******************************************************************************/\r
171 /*******************************************************************************\r
172  * Code for BOARD_BootClockFROHF96M configuration\r
173  ******************************************************************************/\r
174 void BOARD_BootClockFROHF96M(void)\r
175 {\r
176     /*!< Set up the clock sources */\r
177     /*!< Set up FRO */\r
178     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on  */\r
179     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without\r
180                                              accidentally being below the voltage for current speed */\r
181     POWER_SetVoltageForFreq(\r
182         96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */\r
183     /*!< Need to make sure ROM and OTP has power(PDRUNCFG0[17,29]= 0U)\r
184          before calling this API since this API is implemented in ROM code */\r
185     CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */\r
186 \r
187     /*!< Set up dividers */\r
188     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */\r
189 \r
190     /*!< Set up clock selectors - Attach clocks to the peripheries */\r
191     CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */\r
192     /* Set SystemCoreClock variable. */\r
193     SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;\r
194 }\r
195 \r
196 /*******************************************************************************\r
197  ******************** Configuration BOARD_BootClockPLL180M *********************\r
198  ******************************************************************************/\r
199 /* clang-format off */\r
200 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r
201 !!Configuration\r
202 name: BOARD_BootClockPLL180M\r
203 called_from_default_init: true\r
204 outputs:\r
205 - {id: FRO12M_clock.outFreq, value: 12 MHz}\r
206 - {id: FROHF_clock.outFreq, value: 96 MHz}\r
207 - {id: MAIN_clock.outFreq, value: 180 MHz}\r
208 - {id: SYSPLL_clock.outFreq, value: 180 MHz}\r
209 - {id: System_clock.outFreq, value: 180 MHz}\r
210 - {id: USB0_clock.outFreq, value: 96 MHz}\r
211 settings:\r
212 - {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL_BYPASS}\r
213 - {id: SYSCON.M_MULT.scale, value: '30', locked: true}\r
214 - {id: SYSCON.N_DIV.scale, value: '1', locked: true}\r
215 - {id: SYSCON.PDEC.scale, value: '2', locked: true}\r
216 - {id: SYSCON.USB0CLKSEL.sel, value: SYSCON.fro_hf}\r
217 - {id: SYSCON_PDRUNCFG0_PDEN_SYS_PLL_CFG, value: Power_up}\r
218 sources:\r
219 - {id: SYSCON._clk_in.outFreq, value: 12 MHz, enabled: true}\r
220 - {id: SYSCON.fro_hf.outFreq, value: 96 MHz}\r
221  * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r
222 /* clang-format on */\r
223 \r
224 /*******************************************************************************\r
225  * Variables for BOARD_BootClockPLL180M configuration\r
226  ******************************************************************************/\r
227 /*******************************************************************************\r
228  * Code for BOARD_BootClockPLL180M configuration\r
229  ******************************************************************************/\r
230 void BOARD_BootClockPLL180M(void)\r
231 {\r
232     /*!< Set up the clock sources */\r
233     /*!< Set up FRO */\r
234     POWER_DisablePD(kPDRUNCFG_PD_FRO_EN);  /*!< Ensure FRO is on  */\r
235     CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);  /*!< Switch to FRO 12MHz first to ensure we can change voltage without\r
236                                               accidentally  being below the voltage for current speed */\r
237     POWER_DisablePD(kPDRUNCFG_PD_SYS_OSC); /*!< Enable System Oscillator Power */\r
238     SYSCON->SYSOSCCTRL = ((SYSCON->SYSOSCCTRL & ~SYSCON_SYSOSCCTRL_FREQRANGE_MASK) |\r
239                           SYSCON_SYSOSCCTRL_FREQRANGE(0U)); /*!< Set system oscillator range */\r
240     POWER_SetVoltageForFreq(\r
241         180000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */\r
242     /*!< Set up SYS PLL */\r
243     const pll_setup_t pllSetup = {\r
244         .pllctrl = SYSCON_SYSPLLCTRL_SELI(32U) | SYSCON_SYSPLLCTRL_SELP(16U) | SYSCON_SYSPLLCTRL_SELR(0U),\r
245         .pllmdec = (SYSCON_SYSPLLMDEC_MDEC(8191U)),\r
246         .pllndec = (SYSCON_SYSPLLNDEC_NDEC(770U)),\r
247         .pllpdec = (SYSCON_SYSPLLPDEC_PDEC(98U)),\r
248         .pllRate = 180000000U,\r
249         .flags   = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP};\r
250     CLOCK_AttachClk(kFRO12M_to_SYS_PLL); /*!< Set sys pll clock source*/\r
251     CLOCK_SetPLLFreq(&pllSetup);         /*!< Configure PLL to the desired value */\r
252     /*!< Need to make sure ROM and OTP has power(PDRUNCFG0[17,29]= 0U)\r
253          before calling this API since this API is implemented in ROM code */\r
254     CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */\r
255 \r
256     /*!< Set up dividers */\r
257     CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);  /*!< Reset divider counter and set divider to value 1 */\r
258     CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true);  /*!< Reset USB0CLKDIV divider counter and halt it */\r
259     CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 1U, false); /*!< Set USB0CLKDIV divider to value 1 */\r
260 \r
261     /*!< Set up clock selectors - Attach clocks to the peripheries */\r
262     CLOCK_AttachClk(kSYS_PLL_to_MAIN_CLK); /*!< Switch MAIN_CLK to SYS_PLL */\r
263     CLOCK_AttachClk(kFRO_HF_to_USB0_CLK);  /*!< Switch USB0_CLK to FRO_HF */\r
264     SYSCON->MAINCLKSELA =\r
265         ((SYSCON->MAINCLKSELA & ~SYSCON_MAINCLKSELA_SEL_MASK) |\r
266          SYSCON_MAINCLKSELA_SEL(0U)); /*!< Switch MAINCLKSELA to FRO12M even it is not used for MAINCLKSELB */\r
267     /* Set SystemCoreClock variable. */\r
268     SystemCoreClock = BOARD_BOOTCLOCKPLL180M_CORE_CLOCK;\r
269 }\r