1 /**************************************************************************//**
2 * @file clk.c
3 * @version V3.00
4 * @brief M460 series CLK driver source file
5 *
6 * @copyright SPDX-License-Identifier: Apache-2.0
7 * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
8 *****************************************************************************/
9
10 #include "NuMicro.h"
11
12 /** @addtogroup Standard_Driver Standard Driver
13 @{
14 */
15
16 /** @addtogroup CLK_Driver CLK Driver
17 @{
18 */
19
20 /** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions
21 @{
22 */
23
24 /**
25 * @brief Disable clock divider output function
26 * @param None
27 * @return None
28 * @details This function disable clock divider output function.
29 */
CLK_DisableCKO(void)30 void CLK_DisableCKO(void)
31 {
32 /* Disable CKO clock source */
33 CLK->APBCLK0 &= (~CLK_APBCLK0_CLKOCKEN_Msk);
34 }
35
36 /**
37 * @brief This function enable clock divider output module clock,
38 * enable clock divider output function and set frequency selection.
39 * @param[in] u32ClkSrc is frequency divider function clock source. Including :
40 * - \ref CLK_CLKSEL1_CLKOSEL_HXT
41 * - \ref CLK_CLKSEL1_CLKOSEL_LXT
42 * - \ref CLK_CLKSEL1_CLKOSEL_HCLK
43 * - \ref CLK_CLKSEL1_CLKOSEL_HIRC
44 * - \ref CLK_CLKSEL1_CLKOSEL_LIRC
45 * - \ref CLK_CLKSEL1_CLKOSEL_PLLFN_DIV2
46 * - \ref CLK_CLKSEL1_CLKOSEL_PLL_DIV2
47 * @param[in] u32ClkDiv is divider output frequency selection. It could be 0~15.
48 * @param[in] u32ClkDivBy1En is clock divided by one enabled.
49 * @return None
50 * @details Output selected clock to CKO. The output clock frequency is divided by u32ClkDiv. \n
51 * The formula is: \n
52 * CKO frequency = (Clock source frequency) / 2^(u32ClkDiv + 1) \n
53 * This function is just used to set CKO clock.
54 * User must enable I/O for CKO clock output pin by themselves. \n
55 */
CLK_EnableCKO(uint32_t u32ClkSrc,uint32_t u32ClkDiv,uint32_t u32ClkDivBy1En)56 void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En)
57 {
58 /* CKO = clock source / 2^(u32ClkDiv + 1) */
59 CLK->CLKOCTL = CLK_CLKOCTL_CLKOEN_Msk | (u32ClkDiv) | (u32ClkDivBy1En << CLK_CLKOCTL_DIV1EN_Pos);
60
61 /* Enable CKO clock source */
62 CLK->APBCLK0 |= CLK_APBCLK0_CLKOCKEN_Msk;
63
64 /* Select CKO clock source */
65 CLK->CLKSEL1 = (CLK->CLKSEL1 & (~CLK_CLKSEL1_CLKOSEL_Msk)) | (u32ClkSrc);
66 }
67
68 /**
69 * @brief Enter to Power-down mode
70 * @param None
71 * @return None
72 * @details This function is used to let system enter to Power-down mode. \n
73 * The register write-protection function should be disabled before using this function.
74 */
CLK_PowerDown(void)75 void CLK_PowerDown(void)
76 {
77 volatile uint32_t u32SysTickTICKINT = 0, u32HIRCTCTL = 0, u32IRCTCTL = 0;
78
79 /* Set the processor uses deep sleep as its low power mode */
80 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
81
82 /* Set system Power-down enabled */
83 CLK->PWRCTL |= (CLK_PWRCTL_PDEN_Msk);
84
85 /* Store SysTick interrupt and HIRC auto trim setting */
86 u32SysTickTICKINT = SysTick->CTRL & SysTick_CTRL_TICKINT_Msk;
87 u32HIRCTCTL = SYS->HIRCTCTL;
88 u32IRCTCTL = SYS->IRCTCTL;
89
90 /* Disable SysTick interrupt and HIRC auto trim */
91 SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
92 SYS->HIRCTCTL &= (~SYS_HIRCTCTL_FREQSEL_Msk);
93 SYS->IRCTCTL &= (~SYS_IRCTCTL_FREQSEL_Msk);
94
95 /* Chip enter Power-down mode after CPU run WFI instruction */
96 __WFI();
97
98 /* Restore SysTick interrupt and HIRC auto trim setting */
99 if(u32SysTickTICKINT) SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
100 SYS->HIRCTCTL = u32HIRCTCTL;
101 SYS->IRCTCTL = u32IRCTCTL;
102 }
103
104 /**
105 * @brief Enter to Idle mode
106 * @param None
107 * @return None
108 * @details This function let system enter to Idle mode. \n
109 * The register write-protection function should be disabled before using this function.
110 */
CLK_Idle(void)111 void CLK_Idle(void)
112 {
113 /* Set the processor uses sleep as its low power mode */
114 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
115
116 /* Set chip in idle mode because of WFI command */
117 CLK->PWRCTL &= ~CLK_PWRCTL_PDEN_Msk;
118
119 /* Chip enter idle mode after CPU run WFI instruction */
120 __WFI();
121 }
122
123 /**
124 * @brief Get external high speed crystal clock frequency
125 * @param None
126 * @return External high frequency crystal frequency
127 * @details This function get external high frequency crystal frequency. The frequency unit is Hz.
128 */
CLK_GetHXTFreq(void)129 uint32_t CLK_GetHXTFreq(void)
130 {
131 uint32_t u32Freq;
132
133 if(CLK->PWRCTL & CLK_PWRCTL_HXTEN_Msk)
134 {
135 u32Freq = __HXT;
136 }
137 else
138 {
139 u32Freq = 0UL;
140 }
141
142 return u32Freq;
143 }
144
145
146 /**
147 * @brief Get external low speed crystal clock frequency
148 * @param None
149 * @return External low speed crystal clock frequency
150 * @details This function get external low frequency crystal frequency. The frequency unit is Hz.
151 */
CLK_GetLXTFreq(void)152 uint32_t CLK_GetLXTFreq(void)
153 {
154 uint32_t u32Freq;
155
156 if(CLK->PWRCTL & CLK_PWRCTL_LXTEN_Msk)
157 {
158 u32Freq = __LXT;
159 }
160 else
161 {
162 u32Freq = 0UL;
163 }
164
165 return u32Freq;
166 }
167
168 /**
169 * @brief Get PCLK0 frequency
170 * @param None
171 * @return PCLK0 frequency
172 * @details This function get PCLK0 frequency. The frequency unit is Hz.
173 */
CLK_GetPCLK0Freq(void)174 uint32_t CLK_GetPCLK0Freq(void)
175 {
176 uint32_t u32Freq;
177 SystemCoreClockUpdate();
178
179 if((CLK->PCLKDIV & CLK_PCLKDIV_APB0DIV_Msk) == CLK_PCLKDIV_APB0DIV_DIV1)
180 {
181 u32Freq = SystemCoreClock;
182 }
183 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB0DIV_Msk) == CLK_PCLKDIV_APB0DIV_DIV2)
184 {
185 u32Freq = SystemCoreClock>>1;
186 }
187 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB0DIV_Msk) == CLK_PCLKDIV_APB0DIV_DIV4)
188 {
189 u32Freq = SystemCoreClock>>2;
190 }
191 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB0DIV_Msk) == CLK_PCLKDIV_APB0DIV_DIV8)
192 {
193 u32Freq = SystemCoreClock>>3;
194 }
195 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB0DIV_Msk) == CLK_PCLKDIV_APB0DIV_DIV16)
196 {
197 u32Freq = SystemCoreClock>>4;
198 }
199 else
200 {
201 u32Freq = SystemCoreClock;
202 }
203
204 return u32Freq;
205 }
206
207
208 /**
209 * @brief Get PCLK1 frequency
210 * @param None
211 * @return PCLK1 frequency
212 * @details This function get PCLK1 frequency. The frequency unit is Hz.
213 */
CLK_GetPCLK1Freq(void)214 uint32_t CLK_GetPCLK1Freq(void)
215 {
216 uint32_t u32Freq;
217 SystemCoreClockUpdate();
218
219 if((CLK->PCLKDIV & CLK_PCLKDIV_APB1DIV_Msk) == CLK_PCLKDIV_APB1DIV_DIV1)
220 {
221 u32Freq = SystemCoreClock;
222 }
223 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB1DIV_Msk) == CLK_PCLKDIV_APB1DIV_DIV2)
224 {
225 u32Freq = SystemCoreClock>>1;
226 }
227 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB1DIV_Msk) == CLK_PCLKDIV_APB1DIV_DIV4)
228 {
229 u32Freq = SystemCoreClock>>2;
230 }
231 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB1DIV_Msk) == CLK_PCLKDIV_APB1DIV_DIV8)
232 {
233 u32Freq = SystemCoreClock>>3;
234 }
235 else if((CLK->PCLKDIV & CLK_PCLKDIV_APB1DIV_Msk) == CLK_PCLKDIV_APB1DIV_DIV16)
236 {
237 u32Freq = SystemCoreClock>>4;
238 }
239 else
240 {
241 u32Freq = SystemCoreClock;
242 }
243
244 return u32Freq;
245 }
246
247
248 /**
249 * @brief Get HCLK frequency
250 * @param None
251 * @return HCLK frequency
252 * @details This function get HCLK frequency. The frequency unit is Hz.
253 */
CLK_GetHCLKFreq(void)254 uint32_t CLK_GetHCLKFreq(void)
255 {
256 SystemCoreClockUpdate();
257 return SystemCoreClock;
258 }
259
260
261 /**
262 * @brief Get CPU frequency
263 * @param None
264 * @return CPU frequency
265 * @details This function get CPU frequency. The frequency unit is Hz.
266 */
CLK_GetCPUFreq(void)267 uint32_t CLK_GetCPUFreq(void)
268 {
269 SystemCoreClockUpdate();
270 return SystemCoreClock;
271 }
272
273
274 /**
275 * @brief Set HCLK frequency
276 * @param[in] u32Hclk is HCLK frequency. The range of u32Hclk is 50MHz ~ 200MHz.
277 * @return HCLK frequency
278 * @details This function is used to set HCLK frequency by using PLL. The frequency unit is Hz. \n
279 * Power level and flash access cycle are also set according to HCLK frequency. \n
280 * The register write-protection function should be disabled before using this function.
281 */
CLK_SetCoreClock(uint32_t u32Hclk)282 uint32_t CLK_SetCoreClock(uint32_t u32Hclk)
283 {
284 uint32_t u32HIRCSTB;
285
286 /* Read HIRC clock source stable flag */
287 u32HIRCSTB = CLK->STATUS & CLK_STATUS_HIRCSTB_Msk;
288
289 /* Check HCLK frequency range is 50MHz ~ 200MHz */
290 if(u32Hclk > FREQ_200MHZ)
291 {
292 u32Hclk = FREQ_200MHZ;
293 }
294 else if(u32Hclk < FREQ_50MHZ)
295 {
296 u32Hclk = FREQ_50MHZ;
297 }
298
299 /* Switch HCLK clock source to HIRC clock for safe */
300 CLK->PWRCTL |= CLK_PWRCTL_HIRCEN_Msk;
301 CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
302 CLK->CLKSEL0 |= CLK_CLKSEL0_HCLKSEL_Msk;
303 CLK->CLKDIV0 &= (~CLK_CLKDIV0_HCLKDIV_Msk);
304
305 /* Configure PLL setting if HXT clock is stable */
306 if(CLK->STATUS & CLK_STATUS_HXTSTB_Msk)
307 {
308 u32Hclk = CLK_EnablePLL(CLK_PLLCTL_PLLSRC_HXT, u32Hclk);
309 }
310 /* Configure PLL setting if HXT clock is not stable */
311 else
312 {
313 u32Hclk = CLK_EnablePLL(CLK_PLLCTL_PLLSRC_HIRC, u32Hclk);
314
315 /* Read HIRC clock source stable flag */
316 u32HIRCSTB = CLK->STATUS & CLK_STATUS_HIRCSTB_Msk;
317 }
318
319 /* Select HCLK clock source to PLL,
320 select HCLK clock source divider as 1,
321 adjust power level, flash access cycle and update system core clock
322 */
323 CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(1UL));
324
325 /* Disable HIRC if HIRC is disabled before setting core clock */
326 if(u32HIRCSTB == 0UL)
327 {
328 CLK->PWRCTL &= ~CLK_PWRCTL_HIRCEN_Msk;
329 }
330
331 /* Return actually HCLK frequency is PLL frequency divide 1 */
332 return u32Hclk;
333 }
334
335 /**
336 * @brief Set HCLK clock source and HCLK clock divider
337 * @param[in] u32ClkSrc is HCLK clock source. Including :
338 * - \ref CLK_CLKSEL0_HCLKSEL_HXT
339 * - \ref CLK_CLKSEL0_HCLKSEL_LXT
340 * - \ref CLK_CLKSEL0_HCLKSEL_PLL
341 * - \ref CLK_CLKSEL0_HCLKSEL_LIRC
342 * - \ref CLK_CLKSEL0_HCLKSEL_HIRC
343 * @param[in] u32ClkDiv is HCLK clock divider. Including :
344 * - \ref CLK_CLKDIV0_HCLK(x)
345 * @return None
346 * @details This function set HCLK clock source and HCLK clock divider. \n
347 * Power level and flash access cycle are also set according to HCLK operation frequency. \n
348 * The register write-protection function should be disabled before using this function.
349 */
CLK_SetHCLK(uint32_t u32ClkSrc,uint32_t u32ClkDiv)350 void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv)
351 {
352 uint32_t u32HIRCSTB, u32TimeOutCount;
353
354 /* Read HIRC clock source stable flag */
355 u32HIRCSTB = CLK->STATUS & CLK_STATUS_HIRCSTB_Msk;
356
357 /* Switch to HIRC for safe. Avoid HCLK too high when applying new divider. */
358 CLK->PWRCTL |= CLK_PWRCTL_HIRCEN_Msk;
359 CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
360 CLK->CLKSEL0 |= CLK_CLKSEL0_HCLKSEL_Msk;
361
362 /* Switch to power level 0 for safe */
363 SYS->PLCTL = (SYS->PLCTL & (~SYS_PLCTL_PLSEL_Msk)) | SYS_PLCTL_PLSEL_PL0;
364 u32TimeOutCount = SystemCoreClock; /* 1 second time-out */
365 while(SYS->PLSTS & SYS_PLSTS_PLCBUSY_Msk)
366 {
367 if(u32TimeOutCount-- == 0) break;
368 }
369
370 /* Set Flash Access Cycle to 8 for safe */
371 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (8);
372
373 /* Apply new Divider */
374 CLK->CLKDIV0 = (CLK->CLKDIV0 & (~CLK_CLKDIV0_HCLKDIV_Msk)) | u32ClkDiv;
375
376 /* Switch HCLK to new HCLK source */
377 CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLKSEL_Msk)) | u32ClkSrc;
378
379 /* Update System Core Clock */
380 SystemCoreClockUpdate();
381
382 /* Set power level according to new HCLK */
383 if(SystemCoreClock <= FREQ_180MHZ)
384 {
385 SYS->PLCTL = (SYS->PLCTL & (~SYS_PLCTL_PLSEL_Msk)) | SYS_PLCTL_PLSEL_PL1;
386 }
387 u32TimeOutCount = SystemCoreClock; /* 1 second time-out */
388 while(SYS->PLSTS & SYS_PLSTS_PLCBUSY_Msk)
389 {
390 if(u32TimeOutCount-- == 0) break;
391 }
392
393 /* Switch flash access cycle to suitable value base on HCLK */
394 if (SystemCoreClock >= FREQ_175MHZ)
395 {
396 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (8);
397 }
398 else if (SystemCoreClock >= FREQ_150MHZ)
399 {
400 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (7);
401 }
402 else if (SystemCoreClock >= FREQ_125MHZ)
403 {
404 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (6);
405 }
406 else if (SystemCoreClock >= FREQ_100MHZ)
407 {
408 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (5);
409 }
410 else if (SystemCoreClock >= FREQ_75MHZ)
411 {
412 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (4);
413 }
414 else if (SystemCoreClock >= FREQ_50MHZ)
415 {
416 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (3);
417 }
418 else if (SystemCoreClock >= FREQ_25MHZ)
419 {
420 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (2);
421 }
422 else /* SystemCoreClock < FREQ_25MHZ */
423 {
424 FMC->CYCCTL = (FMC->CYCCTL & (~FMC_CYCCTL_CYCLE_Msk)) | (1);
425 }
426
427 /* Disable HIRC if HIRC is disabled before switching HCLK source */
428 if(u32HIRCSTB == 0UL)
429 {
430 CLK->PWRCTL &= ~CLK_PWRCTL_HIRCEN_Msk;
431 }
432 }
433
434 /**
435 * @brief This function set selected module clock source and module clock divider
436 * @param[in] u32ModuleIdx is module index.
437 * @param[in] u32ClkSrc is module clock source.
438 * @param[in] u32ClkDiv is module clock divider.
439 * @return None
440 * @details Valid parameter combinations listed in following table:
441 *
442 * |Module index |Clock source |Divider |
443 * | :---------------- | :----------------------------------- | :-------------------------- |
444 * |\ref USBH_MODULE |\ref CLK_CLKSEL0_USBSEL_HIRC48M |\ref CLK_CLKDIV0_USB(x) |
445 * |\ref USBH_MODULE |\ref CLK_CLKSEL0_USBSEL_PLL_DIV2 |\ref CLK_CLKDIV0_USB(x) |
446 * |\ref OTG_MODULE |\ref CLK_CLKSEL0_USBSEL_HIRC48M |\ref CLK_CLKDIV0_USB(x) |
447 * |\ref OTG_MODULE |\ref CLK_CLKSEL0_USBSEL_PLL_DIV2 |\ref CLK_CLKDIV0_USB(x) |
448 * |\ref USBD_MODULE |\ref CLK_CLKSEL0_USBSEL_HIRC48M |\ref CLK_CLKDIV0_USB(x) |
449 * |\ref USBD_MODULE |\ref CLK_CLKSEL0_USBSEL_PLL_DIV2 |\ref CLK_CLKDIV0_USB(x) |
450 * |\ref EADC0_MODULE |\ref CLK_CLKSEL0_EADC0SEL_PLLFN_DIV2 |\ref CLK_CLKDIV0_EADC0(x) |
451 * |\ref EADC0_MODULE |\ref CLK_CLKSEL0_EADC0SEL_PLL_DIV2 |\ref CLK_CLKDIV0_EADC0(x) |
452 * |\ref EADC0_MODULE |\ref CLK_CLKSEL0_EADC0SEL_HCLK |\ref CLK_CLKDIV0_EADC0(x) |
453 * |\ref EADC1_MODULE |\ref CLK_CLKSEL0_EADC1SEL_PLLFN_DIV2 |\ref CLK_CLKDIV2_EADC1(x) |
454 * |\ref EADC1_MODULE |\ref CLK_CLKSEL0_EADC1SEL_PLL_DIV2 |\ref CLK_CLKDIV2_EADC1(x) |
455 * |\ref EADC1_MODULE |\ref CLK_CLKSEL0_EADC1SEL_HCLK |\ref CLK_CLKDIV2_EADC1(x) |
456 * |\ref EADC2_MODULE |\ref CLK_CLKSEL0_EADC2SEL_PLLFN_DIV2 |\ref CLK_CLKDIV5_EADC2(x) |
457 * |\ref EADC2_MODULE |\ref CLK_CLKSEL0_EADC2SEL_PLL_DIV2 |\ref CLK_CLKDIV5_EADC2(x) |
458 * |\ref EADC2_MODULE |\ref CLK_CLKSEL0_EADC2SEL_HCLK |\ref CLK_CLKDIV5_EADC2(x) |
459 * |\ref CCAP_MODULE | x | x |
460 * |\ref CCAP_MODULE | x | x |
461 * |\ref CCAP_MODULE | x | x |
462 * |\ref CCAP_MODULE | x | x |
463 * |\ref SEN_MODULE |\ref CLK_CLKSEL0_CCAPSEL_HXT |\ref CLK_CLKDIV3_VSENSE(x) |
464 * |\ref SEN_MODULE |\ref CLK_CLKSEL0_CCAPSEL_PLL_DIV2 |\ref CLK_CLKDIV3_VSENSE(x) |
465 * |\ref SEN_MODULE |\ref CLK_CLKSEL0_CCAPSEL_HCLK |\ref CLK_CLKDIV3_VSENSE(x) |
466 * |\ref SEN_MODULE |\ref CLK_CLKSEL0_CCAPSEL_HIRC |\ref CLK_CLKDIV3_VSENSE(x) |
467 * |\ref SDH0_MODULE |\ref CLK_CLKSEL0_SDH0SEL_HXT |\ref CLK_CLKDIV0_SDH0(x) |
468 * |\ref SDH0_MODULE |\ref CLK_CLKSEL0_SDH0SEL_PLL_DIV2 |\ref CLK_CLKDIV0_SDH0(x) |
469 * |\ref SDH0_MODULE |\ref CLK_CLKSEL0_SDH0SEL_HIRC |\ref CLK_CLKDIV0_SDH0(x) |
470 * |\ref SDH0_MODULE |\ref CLK_CLKSEL0_SDH0SEL_HCLK |\ref CLK_CLKDIV0_SDH0(x) |
471 * |\ref SDH1_MODULE |\ref CLK_CLKSEL0_SDH1SEL_HXT |\ref CLK_CLKDIV3_SDH1(x) |
472 * |\ref SDH1_MODULE |\ref CLK_CLKSEL0_SDH1SEL_PLL_DIV2 |\ref CLK_CLKDIV3_SDH1(x) |
473 * |\ref SDH1_MODULE |\ref CLK_CLKSEL0_SDH1SEL_HIRC |\ref CLK_CLKDIV3_SDH1(x) |
474 * |\ref SDH1_MODULE |\ref CLK_CLKSEL0_SDH1SEL_HCLK |\ref CLK_CLKDIV3_SDH1(x) |
475 * |\ref CANFD0_MODULE |\ref CLK_CLKSEL0_CANFD0SEL_HXT |\ref CLK_CLKDIV5_CANFD0(x) |
476 * |\ref CANFD0_MODULE |\ref CLK_CLKSEL0_CANFD0SEL_PLL_DIV2 |\ref CLK_CLKDIV5_CANFD0(x) |
477 * |\ref CANFD0_MODULE |\ref CLK_CLKSEL0_CANFD0SEL_HCLK |\ref CLK_CLKDIV5_CANFD0(x) |
478 * |\ref CANFD0_MODULE |\ref CLK_CLKSEL0_CANFD0SEL_HIRC |\ref CLK_CLKDIV5_CANFD0(x) |
479 * |\ref CANFD1_MODULE |\ref CLK_CLKSEL0_CANFD1SEL_HXT |\ref CLK_CLKDIV5_CANFD1(x) |
480 * |\ref CANFD1_MODULE |\ref CLK_CLKSEL0_CANFD1SEL_PLL_DIV2 |\ref CLK_CLKDIV5_CANFD1(x) |
481 * |\ref CANFD1_MODULE |\ref CLK_CLKSEL0_CANFD1SEL_HCLK |\ref CLK_CLKDIV5_CANFD1(x) |
482 * |\ref CANFD1_MODULE |\ref CLK_CLKSEL0_CANFD1SEL_HIRC |\ref CLK_CLKDIV5_CANFD1(x) |
483 * |\ref CANFD2_MODULE |\ref CLK_CLKSEL0_CANFD2SEL_HXT |\ref CLK_CLKDIV5_CANFD2(x) |
484 * |\ref CANFD2_MODULE |\ref CLK_CLKSEL0_CANFD2SEL_PLL_DIV2 |\ref CLK_CLKDIV5_CANFD2(x) |
485 * |\ref CANFD2_MODULE |\ref CLK_CLKSEL0_CANFD2SEL_HCLK |\ref CLK_CLKDIV5_CANFD2(x) |
486 * |\ref CANFD2_MODULE |\ref CLK_CLKSEL0_CANFD2SEL_HIRC |\ref CLK_CLKDIV5_CANFD2(x) |
487 * |\ref CANFD3_MODULE |\ref CLK_CLKSEL0_CANFD3SEL_HXT |\ref CLK_CLKDIV5_CANFD3(x) |
488 * |\ref CANFD3_MODULE |\ref CLK_CLKSEL0_CANFD3SEL_PLL_DIV2 |\ref CLK_CLKDIV5_CANFD3(x) |
489 * |\ref CANFD3_MODULE |\ref CLK_CLKSEL0_CANFD3SEL_HCLK |\ref CLK_CLKDIV5_CANFD3(x) |
490 * |\ref CANFD3_MODULE |\ref CLK_CLKSEL0_CANFD3SEL_HIRC |\ref CLK_CLKDIV5_CANFD3(x) |
491 * |\ref EMAC0_MODULE | x | x |
492 * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDTSEL_LXT | x |
493 * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDTSEL_HCLK_DIV2048 | x |
494 * |\ref WDT_MODULE |\ref CLK_CLKSEL1_WDTSEL_LIRC | x |
495 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_HXT | x |
496 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_LXT | x |
497 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_HCLK | x |
498 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_HIRC | x |
499 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_LIRC | x |
500 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_PLLFN_DIV2 | x |
501 * |\ref CLKO_MODULE |\ref CLK_CLKSEL1_CLKOSEL_PLL_DIV2 | x |
502 * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_HXT | x |
503 * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_LXT | x |
504 * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_PCLK0 | x |
505 * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_EXT | x |
506 * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_LIRC | x |
507 * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_HIRC | x |
508 * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_HXT | x |
509 * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_LXT | x |
510 * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_PCLK0 | x |
511 * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_EXT | x |
512 * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_LIRC | x |
513 * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_HIRC | x |
514 * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_HXT | x |
515 * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_LXT | x |
516 * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_PCLK1 | x |
517 * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_EXT | x |
518 * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_LIRC | x |
519 * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_HIRC | x |
520 * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_HXT | x |
521 * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_LXT | x |
522 * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_PCLK1 | x |
523 * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_EXT | x |
524 * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_LIRC | x |
525 * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_HIRC | x |
526 * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART0SEL_HXT |\ref CLK_CLKDIV0_UART0(x) |
527 * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART0SEL_PLL_DIV2 |\ref CLK_CLKDIV0_UART0(x) |
528 * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART0SEL_LXT |\ref CLK_CLKDIV0_UART0(x) |
529 * |\ref UART0_MODULE |\ref CLK_CLKSEL1_UART0SEL_HIRC |\ref CLK_CLKDIV0_UART0(x) |
530 * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART1SEL_HXT |\ref CLK_CLKDIV0_UART1(x) |
531 * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART1SEL_PLL_DIV2 |\ref CLK_CLKDIV0_UART1(x) |
532 * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART1SEL_LXT |\ref CLK_CLKDIV0_UART1(x) |
533 * |\ref UART1_MODULE |\ref CLK_CLKSEL1_UART1SEL_HIRC |\ref CLK_CLKDIV0_UART1(x) |
534 * |\ref WWDT_MODULE |\ref CLK_CLKSEL1_WWDTSEL_HCLK_DIV2048 | x |
535 * |\ref WWDT_MODULE |\ref CLK_CLKSEL1_WWDTSEL_LIRC | x |
536 * |\ref EPWM0_MODULE |\ref CLK_CLKSEL2_EPWM0SEL_HCLK | x |
537 * |\ref EPWM0_MODULE |\ref CLK_CLKSEL2_EPWM0SEL_PCLK0 | x |
538 * |\ref EPWM1_MODULE |\ref CLK_CLKSEL2_EPWM1SEL_HCLK | x |
539 * |\ref EPWM1_MODULE |\ref CLK_CLKSEL2_EPWM1SEL_PCLK1 | x |
540 * |\ref QSPI0_MODULE |\ref CLK_CLKSEL2_QSPI0SEL_HXT | x |
541 * |\ref QSPI0_MODULE |\ref CLK_CLKSEL2_QSPI0SEL_PLL_DIV2 | x |
542 * |\ref QSPI0_MODULE |\ref CLK_CLKSEL2_QSPI0SEL_PCLK0 | x |
543 * |\ref QSPI0_MODULE |\ref CLK_CLKSEL2_QSPI0SEL_HIRC | x |
544 * |\ref SPI0_MODULE |\ref CLK_CLKSEL2_SPI0SEL_HXT | x |
545 * |\ref SPI0_MODULE |\ref CLK_CLKSEL2_SPI0SEL_PLL_DIV2 | x |
546 * |\ref SPI0_MODULE |\ref CLK_CLKSEL2_SPI0SEL_PCLK1 | x |
547 * |\ref SPI0_MODULE |\ref CLK_CLKSEL2_SPI0SEL_HIRC | x |
548 * |\ref SPI0_MODULE |\ref CLK_CLKSEL2_SPI0SEL_HIRC48M | x |
549 * |\ref SPI0_MODULE |\ref CLK_CLKSEL2_SPI0SEL_PLLFN_DIV2 | x |
550 * |\ref BPWM0_MODULE |\ref CLK_CLKSEL2_BPWM0SEL_HCLK | x |
551 * |\ref BPWM0_MODULE |\ref CLK_CLKSEL2_BPWM0SEL_PCLK0 | x |
552 * |\ref BPWM1_MODULE |\ref CLK_CLKSEL2_BPWM1SEL_HCLK | x |
553 * |\ref BPWM1_MODULE |\ref CLK_CLKSEL2_BPWM1SEL_PCLK1 | x |
554 * |\ref QSPI1_MODULE |\ref CLK_CLKSEL3_QSPI1SEL_HXT | x |
555 * |\ref QSPI1_MODULE |\ref CLK_CLKSEL3_QSPI1SEL_PLL_DIV2 | x |
556 * |\ref QSPI1_MODULE |\ref CLK_CLKSEL3_QSPI1SEL_PCLK1 | x |
557 * |\ref QSPI1_MODULE |\ref CLK_CLKSEL3_QSPI1SEL_HIRC | x |
558 * |\ref SPI1_MODULE |\ref CLK_CLKSEL2_SPI1SEL_HXT | x |
559 * |\ref SPI1_MODULE |\ref CLK_CLKSEL2_SPI1SEL_PLL_DIV2 | x |
560 * |\ref SPI1_MODULE |\ref CLK_CLKSEL2_SPI1SEL_PCLK0 | x |
561 * |\ref SPI1_MODULE |\ref CLK_CLKSEL2_SPI1SEL_HIRC | x |
562 * |\ref SPI1_MODULE |\ref CLK_CLKSEL2_SPI1SEL_HIRC48M | x |
563 * |\ref SPI1_MODULE |\ref CLK_CLKSEL2_SPI1SEL_PLLFN_DIV2 | x |
564 * |\ref I2S1_MODULE |\ref CLK_CLKSEL2_I2S1SEL_HXT |\ref CLK_CLKDIV2_I2S1(x) |
565 * |\ref I2S1_MODULE |\ref CLK_CLKSEL2_I2S1SEL_PLL_DIV2 |\ref CLK_CLKDIV2_I2S1(x) |
566 * |\ref I2S1_MODULE |\ref CLK_CLKSEL2_I2S1SEL_PCLK1 |\ref CLK_CLKDIV2_I2S1(x) |
567 * |\ref I2S1_MODULE |\ref CLK_CLKSEL2_I2S1SEL_HIRC |\ref CLK_CLKDIV2_I2S1(x) |
568 * |\ref I2S1_MODULE |\ref CLK_CLKSEL2_I2S1SEL_HIRC48M |\ref CLK_CLKDIV2_I2S1(x) |
569 * |\ref I2S1_MODULE |\ref CLK_CLKSEL2_I2S1SEL_PLLFN_DIV2 |\ref CLK_CLKDIV2_I2S1(x) |
570 * |\ref UART8_MODULE |\ref CLK_CLKSEL2_UART8SEL_HXT |\ref CLK_CLKDIV5_UART8(x) |
571 * |\ref UART8_MODULE |\ref CLK_CLKSEL2_UART8SEL_PLL_DIV2 |\ref CLK_CLKDIV5_UART8(x) |
572 * |\ref UART8_MODULE |\ref CLK_CLKSEL2_UART8SEL_LXT |\ref CLK_CLKDIV5_UART8(x) |
573 * |\ref UART8_MODULE |\ref CLK_CLKSEL2_UART8SEL_HIRC |\ref CLK_CLKDIV5_UART8(x) |
574 * |\ref UART9_MODULE |\ref CLK_CLKSEL2_UART9SEL_HXT |\ref CLK_CLKDIV5_UART9(x) |
575 * |\ref UART9_MODULE |\ref CLK_CLKSEL2_UART9SEL_PLL_DIV2 |\ref CLK_CLKDIV5_UART9(x) |
576 * |\ref UART9_MODULE |\ref CLK_CLKSEL2_UART9SEL_LXT |\ref CLK_CLKDIV5_UART9(x) |
577 * |\ref UART9_MODULE |\ref CLK_CLKSEL2_UART9SEL_HIRC |\ref CLK_CLKDIV5_UART9(x) |
578 * |\ref TRNG_MODULE |\ref CLK_CLKSEL2_TRNGSEL_LXT | x |
579 * |\ref TRNG_MODULE |\ref CLK_CLKSEL2_TRNGSEL_LIRC | x |
580 * |\ref PSIO_MODULE |\ref CLK_CLKSEL2_PSIOSEL_HXT |\ref CLK_CLKDIV1_PSIO(x) |
581 * |\ref PSIO_MODULE |\ref CLK_CLKSEL2_PSIOSEL_LXT |\ref CLK_CLKDIV1_PSIO(x) |
582 * |\ref PSIO_MODULE |\ref CLK_CLKSEL2_PSIOSEL_PCLK1 |\ref CLK_CLKDIV1_PSIO(x) |
583 * |\ref PSIO_MODULE |\ref CLK_CLKSEL2_PSIOSEL_PLL_DIV2 |\ref CLK_CLKDIV1_PSIO(x) |
584 * |\ref PSIO_MODULE |\ref CLK_CLKSEL2_PSIOSEL_LIRC |\ref CLK_CLKDIV1_PSIO(x) |
585 * |\ref PSIO_MODULE |\ref CLK_CLKSEL2_PSIOSEL_HIRC |\ref CLK_CLKDIV1_PSIO(x) |
586 * |\ref SC0_MODULE |\ref CLK_CLKSEL3_SC0SEL_HXT |\ref CLK_CLKDIV1_SC0(x) |
587 * |\ref SC0_MODULE |\ref CLK_CLKSEL3_SC0SEL_PLL_DIV2 |\ref CLK_CLKDIV1_SC0(x) |
588 * |\ref SC0_MODULE |\ref CLK_CLKSEL3_SC0SEL_PCLK0 |\ref CLK_CLKDIV1_SC0(x) |
589 * |\ref SC0_MODULE |\ref CLK_CLKSEL3_SC0SEL_HIRC |\ref CLK_CLKDIV1_SC0(x) |
590 * |\ref SC1_MODULE |\ref CLK_CLKSEL3_SC1SEL_HXT |\ref CLK_CLKDIV1_SC1(x) |
591 * |\ref SC1_MODULE |\ref CLK_CLKSEL3_SC1SEL_PLL_DIV2 |\ref CLK_CLKDIV1_SC1(x) |
592 * |\ref SC1_MODULE |\ref CLK_CLKSEL3_SC1SEL_PCLK1 |\ref CLK_CLKDIV1_SC1(x) |
593 * |\ref SC1_MODULE |\ref CLK_CLKSEL3_SC1SEL_HIRC |\ref CLK_CLKDIV1_SC1(x) |
594 * |\ref SC2_MODULE |\ref CLK_CLKSEL3_SC2SEL_HXT |\ref CLK_CLKDIV1_SC2(x) |
595 * |\ref SC2_MODULE |\ref CLK_CLKSEL3_SC2SEL_PLL_DIV2 |\ref CLK_CLKDIV1_SC2(x) |
596 * |\ref SC2_MODULE |\ref CLK_CLKSEL3_SC2SEL_PCLK0 |\ref CLK_CLKDIV1_SC2(x) |
597 * |\ref SC2_MODULE |\ref CLK_CLKSEL3_SC2SEL_HIRC |\ref CLK_CLKDIV1_SC2(x) |
598 * |\ref KPI_MODULE |\ref CLK_CLKSEL3_KPISEL_HXT |\ref CLK_CLKDIV2_KPI(x) |
599 * |\ref KPI_MODULE |\ref CLK_CLKSEL3_KPISEL_LIRC |\ref CLK_CLKDIV2_KPI(x) |
600 * |\ref KPI_MODULE |\ref CLK_CLKSEL3_KPISEL_HIRC |\ref CLK_CLKDIV2_KPI(x) |
601 * |\ref SPI2_MODULE |\ref CLK_CLKSEL3_SPI2SEL_HXT | x |
602 * |\ref SPI2_MODULE |\ref CLK_CLKSEL3_SPI2SEL_PLL_DIV2 | x |
603 * |\ref SPI2_MODULE |\ref CLK_CLKSEL3_SPI2SEL_PCLK1 | x |
604 * |\ref SPI2_MODULE |\ref CLK_CLKSEL3_SPI2SEL_HIRC | x |
605 * |\ref SPI2_MODULE |\ref CLK_CLKSEL3_SPI2SEL_HIRC48M | x |
606 * |\ref SPI2_MODULE |\ref CLK_CLKSEL3_SPI2SEL_PLLFN_DIV2 | x |
607 * |\ref SPI3_MODULE |\ref CLK_CLKSEL3_SPI3SEL_HXT | x |
608 * |\ref SPI3_MODULE |\ref CLK_CLKSEL3_SPI3SEL_PLL_DIV2 | x |
609 * |\ref SPI3_MODULE |\ref CLK_CLKSEL3_SPI3SEL_PCLK0 | x |
610 * |\ref SPI3_MODULE |\ref CLK_CLKSEL3_SPI3SEL_HIRC | x |
611 * |\ref SPI3_MODULE |\ref CLK_CLKSEL3_SPI3SEL_HIRC48M | x |
612 * |\ref SPI3_MODULE |\ref CLK_CLKSEL3_SPI3SEL_PLLFN_DIV2 | x |
613 * |\ref I2S0_MODULE |\ref CLK_CLKSEL3_I2S0SEL_HXT |\ref CLK_CLKDIV2_I2S0(x) |
614 * |\ref I2S0_MODULE |\ref CLK_CLKSEL3_I2S0SEL_PLL_DIV2 |\ref CLK_CLKDIV2_I2S0(x) |
615 * |\ref I2S0_MODULE |\ref CLK_CLKSEL3_I2S0SEL_PCLK0 |\ref CLK_CLKDIV2_I2S0(x) |
616 * |\ref I2S0_MODULE |\ref CLK_CLKSEL3_I2S0SEL_HIRC |\ref CLK_CLKDIV2_I2S0(x) |
617 * |\ref I2S0_MODULE |\ref CLK_CLKSEL3_I2S0SEL_HIRC48M |\ref CLK_CLKDIV2_I2S0(x) |
618 * |\ref I2S0_MODULE |\ref CLK_CLKSEL3_I2S0SEL_PLLFN_DIV2 |\ref CLK_CLKDIV2_I2S0(x) |
619 * |\ref UART6_MODULE |\ref CLK_CLKSEL3_UART6SEL_HXT |\ref CLK_CLKDIV4_UART6(x) |
620 * |\ref UART6_MODULE |\ref CLK_CLKSEL3_UART6SEL_PLL_DIV2 |\ref CLK_CLKDIV4_UART6(x) |
621 * |\ref UART6_MODULE |\ref CLK_CLKSEL3_UART6SEL_LXT |\ref CLK_CLKDIV4_UART6(x) |
622 * |\ref UART6_MODULE |\ref CLK_CLKSEL3_UART6SEL_HIRC |\ref CLK_CLKDIV4_UART6(x) |
623 * |\ref UART7_MODULE |\ref CLK_CLKSEL3_UART7SEL_HXT |\ref CLK_CLKDIV4_UART7(x) |
624 * |\ref UART7_MODULE |\ref CLK_CLKSEL3_UART7SEL_PLL_DIV2 |\ref CLK_CLKDIV4_UART7(x) |
625 * |\ref UART7_MODULE |\ref CLK_CLKSEL3_UART7SEL_LXT |\ref CLK_CLKDIV4_UART7(x) |
626 * |\ref UART7_MODULE |\ref CLK_CLKSEL3_UART7SEL_HIRC |\ref CLK_CLKDIV4_UART7(x) |
627 * |\ref UART2_MODULE |\ref CLK_CLKSEL3_UART2SEL_HXT |\ref CLK_CLKDIV4_UART2(x) |
628 * |\ref UART2_MODULE |\ref CLK_CLKSEL3_UART2SEL_PLL_DIV2 |\ref CLK_CLKDIV4_UART2(x) |
629 * |\ref UART2_MODULE |\ref CLK_CLKSEL3_UART2SEL_LXT |\ref CLK_CLKDIV4_UART2(x) |
630 * |\ref UART2_MODULE |\ref CLK_CLKSEL3_UART2SEL_HIRC |\ref CLK_CLKDIV4_UART2(x) |
631 * |\ref UART3_MODULE |\ref CLK_CLKSEL3_UART3SEL_HXT |\ref CLK_CLKDIV4_UART3(x) |
632 * |\ref UART3_MODULE |\ref CLK_CLKSEL3_UART3SEL_PLL_DIV2 |\ref CLK_CLKDIV4_UART3(x) |
633 * |\ref UART3_MODULE |\ref CLK_CLKSEL3_UART3SEL_LXT |\ref CLK_CLKDIV4_UART3(x) |
634 * |\ref UART3_MODULE |\ref CLK_CLKSEL3_UART3SEL_HIRC |\ref CLK_CLKDIV4_UART3(x) |
635 * |\ref UART4_MODULE |\ref CLK_CLKSEL3_UART4SEL_HXT |\ref CLK_CLKDIV4_UART4(x) |
636 * |\ref UART4_MODULE |\ref CLK_CLKSEL3_UART4SEL_PLL_DIV2 |\ref CLK_CLKDIV4_UART4(x) |
637 * |\ref UART4_MODULE |\ref CLK_CLKSEL3_UART4SEL_LXT |\ref CLK_CLKDIV4_UART4(x) |
638 * |\ref UART4_MODULE |\ref CLK_CLKSEL3_UART4SEL_HIRC |\ref CLK_CLKDIV4_UART4(x) |
639 * |\ref UART5_MODULE |\ref CLK_CLKSEL3_UART5SEL_HXT |\ref CLK_CLKDIV4_UART5(x) |
640 * |\ref UART5_MODULE |\ref CLK_CLKSEL3_UART5SEL_PLL_DIV2 |\ref CLK_CLKDIV4_UART5(x) |
641 * |\ref UART5_MODULE |\ref CLK_CLKSEL3_UART5SEL_LXT |\ref CLK_CLKDIV4_UART5(x) |
642 * |\ref UART5_MODULE |\ref CLK_CLKSEL3_UART5SEL_HIRC |\ref CLK_CLKDIV4_UART5(x) |
643 * |\ref RTC_MODULE |\ref RTC_LXTCTL_RTCCKSEL_LXT | x |
644 * |\ref RTC_MODULE |\ref RTC_LXTCTL_RTCCKSEL_LIRC | x |
645 * |\ref SPI4_MODULE |\ref CLK_CLKSEL4_SPI4SEL_HXT | x |
646 * |\ref SPI4_MODULE |\ref CLK_CLKSEL4_SPI4SEL_PLL_DIV2 | x |
647 * |\ref SPI4_MODULE |\ref CLK_CLKSEL4_SPI4SEL_PCLK1 | x |
648 * |\ref SPI4_MODULE |\ref CLK_CLKSEL4_SPI4SEL_HIRC | x |
649 * |\ref SPI5_MODULE |\ref CLK_CLKSEL4_SPI5SEL_HXT | x |
650 * |\ref SPI5_MODULE |\ref CLK_CLKSEL4_SPI5SEL_PLL_DIV2 | x |
651 * |\ref SPI5_MODULE |\ref CLK_CLKSEL4_SPI5SEL_PCLK0 | x |
652 * |\ref SPI5_MODULE |\ref CLK_CLKSEL4_SPI5SEL_HIRC | x |
653 * |\ref SPI6_MODULE |\ref CLK_CLKSEL4_SPI6SEL_HXT | x |
654 * |\ref SPI6_MODULE |\ref CLK_CLKSEL4_SPI6SEL_PLL_DIV2 | x |
655 * |\ref SPI6_MODULE |\ref CLK_CLKSEL4_SPI6SEL_PCLK1 | x |
656 * |\ref SPI6_MODULE |\ref CLK_CLKSEL4_SPI6SEL_HIRC | x |
657 * |\ref SPI7_MODULE |\ref CLK_CLKSEL4_SPI7SEL_HXT | x |
658 * |\ref SPI7_MODULE |\ref CLK_CLKSEL4_SPI7SEL_PLL_DIV2 | x |
659 * |\ref SPI7_MODULE |\ref CLK_CLKSEL4_SPI7SEL_PCLK0 | x |
660 * |\ref SPI7_MODULE |\ref CLK_CLKSEL4_SPI7SEL_HIRC | x |
661 * |\ref SPI8_MODULE |\ref CLK_CLKSEL4_SPI8SEL_HXT | x |
662 * |\ref SPI8_MODULE |\ref CLK_CLKSEL4_SPI8SEL_PLL_DIV2 | x |
663 * |\ref SPI8_MODULE |\ref CLK_CLKSEL4_SPI8SEL_PCLK1 | x |
664 * |\ref SPI8_MODULE |\ref CLK_CLKSEL4_SPI8SEL_HIRC | x |
665 * |\ref SPI9_MODULE |\ref CLK_CLKSEL4_SPI9SEL_HXT | x |
666 * |\ref SPI9_MODULE |\ref CLK_CLKSEL4_SPI9SEL_PLL_DIV2 | x |
667 * |\ref SPI9_MODULE |\ref CLK_CLKSEL4_SPI9SEL_PCLK0 | x |
668 * |\ref SPI9_MODULE |\ref CLK_CLKSEL4_SPI9SEL_HIRC | x |
669 * |\ref SPI10_MODULE |\ref CLK_CLKSEL4_SPI10SEL_HXT | x |
670 * |\ref SPI10_MODULE |\ref CLK_CLKSEL4_SPI10SEL_PLL_DIV2 | x |
671 * |\ref SPI10_MODULE |\ref CLK_CLKSEL4_SPI10SEL_PCLK1 | x |
672 * |\ref SPI10_MODULE |\ref CLK_CLKSEL4_SPI10SEL_HIRC | x |
673 *
674 */
CLK_SetModuleClock(uint32_t u32ModuleIdx,uint32_t u32ClkSrc,uint32_t u32ClkDiv)675 void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv)
676 {
677 uint32_t u32Sel = 0UL, u32Div = 0UL;
678 uint32_t au32SelTbl[5] = {0x0UL, 0x4UL, 0x8UL, 0xCUL, 0x4CUL}; /* CLK_CLKSEL0~4 */
679 uint32_t au32DivTbl[6] = {0x0UL, 0x4UL, 0x8UL, 0xCUL, 0x10UL, 0x1C}; /* CLK_CLKDIV0~5 */
680 uint32_t u32RTCCKEN = CLK->APBCLK0 & CLK_APBCLK0_RTCCKEN_Msk;
681
682 if(u32ModuleIdx == RTC_MODULE) /* RTC clock source configuration */
683 {
684 if(u32RTCCKEN == 0UL)
685 {
686 CLK->APBCLK0 |= CLK_APBCLK0_RTCCKEN_Msk; /* Enable RTC clock to get LXT clock source */
687 }
688
689 /* Select RTC clock source */
690 RTC->LXTCTL = (RTC->LXTCTL & (~RTC_LXTCTL_RTCCKSEL_Msk)) | (u32ClkSrc);
691
692 if(u32RTCCKEN == 0UL)
693 {
694 CLK->APBCLK0 &= (~CLK_APBCLK0_RTCCKEN_Msk); /* Disable RTC clock if it is disabled before */
695 }
696 }
697 else /* Others clock source configuration */
698 {
699 /* Configure clock source divider */
700 switch(u32ModuleIdx)
701 {
702 /* For 8 bits divider */
703 case EADC0_MODULE: CLK->CLKDIV0 = (CLK->CLKDIV0 & (~CLK_CLKDIV0_EADC0DIV_Msk)) | (u32ClkDiv); break;
704 case SDH0_MODULE: CLK->CLKDIV0 = (CLK->CLKDIV0 & (~CLK_CLKDIV0_SDH0DIV_Msk)) | (u32ClkDiv); break;
705 case SC0_MODULE: CLK->CLKDIV1 = (CLK->CLKDIV1 & (~CLK_CLKDIV1_SC0DIV_Msk)) | (u32ClkDiv); break;
706 case SC1_MODULE: CLK->CLKDIV1 = (CLK->CLKDIV1 & (~CLK_CLKDIV1_SC1DIV_Msk)) | (u32ClkDiv); break;
707 case SC2_MODULE: CLK->CLKDIV1 = (CLK->CLKDIV1 & (~CLK_CLKDIV1_SC2DIV_Msk)) | (u32ClkDiv); break;
708 case PSIO_MODULE: CLK->CLKDIV1 = (CLK->CLKDIV1 & (~CLK_CLKDIV1_PSIODIV_Msk)) | (u32ClkDiv); break;
709 case KPI_MODULE: CLK->CLKDIV2 = (CLK->CLKDIV2 & (~CLK_CLKDIV2_KPIDIV_Msk)) | (u32ClkDiv); break;
710 case EADC1_MODULE: CLK->CLKDIV2 = (CLK->CLKDIV2 & (~CLK_CLKDIV2_EADC1DIV_Msk)) | (u32ClkDiv); break;
711 case SEN_MODULE: CLK->CLKDIV3 = (CLK->CLKDIV3 & (~CLK_CLKDIV3_VSENSEDIV_Msk)) | (u32ClkDiv); break;
712 case SDH1_MODULE: CLK->CLKDIV3 = (CLK->CLKDIV3 & (~CLK_CLKDIV3_SDH1DIV_Msk)) | (u32ClkDiv); break;
713 case EADC2_MODULE: CLK->CLKDIV5 = (CLK->CLKDIV5 & (~CLK_CLKDIV5_EADC2DIV_Msk)) | (u32ClkDiv); break;
714
715 /* Others */
716 default:
717 {
718 if(MODULE_CLKDIV_Msk(u32ModuleIdx) != MODULE_NoMsk)
719 {
720 /* Get clock divider control register address */
721 u32Div = (uint32_t)&CLK->CLKDIV0 + (au32DivTbl[MODULE_CLKDIV(u32ModuleIdx)]);
722 /* Apply new divider */
723 M32(u32Div) = (M32(u32Div) & (~(MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx)))) | u32ClkDiv;
724 }
725 }
726 break;
727 }
728
729 /* Configure clock source */
730 if(MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk)
731 {
732 /* Get clock select control register address */
733 u32Sel = (uint32_t)&CLK->CLKSEL0 + (au32SelTbl[MODULE_CLKSEL(u32ModuleIdx)]);
734 /* Set new clock selection setting */
735 M32(u32Sel) = (M32(u32Sel) & (~(MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx)))) | u32ClkSrc;
736 }
737 }
738
739 }
740
741 /**
742 * @brief Set SysTick clock source
743 * @param[in] u32ClkSrc is module clock source. Including:
744 * - \ref CLK_CLKSEL0_STCLKSEL_HXT
745 * - \ref CLK_CLKSEL0_STCLKSEL_LXT
746 * - \ref CLK_CLKSEL0_STCLKSEL_HXT_DIV2
747 * - \ref CLK_CLKSEL0_STCLKSEL_HCLK_DIV2
748 * - \ref CLK_CLKSEL0_STCLKSEL_HIRC_DIV2
749 * @return None
750 * @details This function set SysTick clock source. \n
751 * The register write-protection function should be disabled before using this function.
752 */
CLK_SetSysTickClockSrc(uint32_t u32ClkSrc)753 void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc)
754 {
755 CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLKSEL_Msk) | u32ClkSrc;
756 }
757
758 /**
759 * @brief Enable clock source
760 * @param[in] u32ClkMask is clock source mask. Including :
761 * - \ref CLK_PWRCTL_HXTEN_Msk
762 * - \ref CLK_PWRCTL_LXTEN_Msk
763 * - \ref CLK_PWRCTL_HIRCEN_Msk
764 * - \ref CLK_PWRCTL_LIRCEN_Msk
765 * - \ref CLK_PWRCTL_HIRC48MEN_Msk
766 * @return None
767 * @details This function enable clock source. \n
768 * The register write-protection function should be disabled before using this function.
769 */
CLK_EnableXtalRC(uint32_t u32ClkMask)770 void CLK_EnableXtalRC(uint32_t u32ClkMask)
771 {
772 CLK->PWRCTL |= u32ClkMask;
773 }
774
775 /**
776 * @brief Disable clock source
777 * @param[in] u32ClkMask is clock source mask. Including :
778 * - \ref CLK_PWRCTL_HXTEN_Msk
779 * - \ref CLK_PWRCTL_LXTEN_Msk
780 * - \ref CLK_PWRCTL_HIRCEN_Msk
781 * - \ref CLK_PWRCTL_LIRCEN_Msk
782 * - \ref CLK_PWRCTL_HIRC48MEN_Msk
783 * @return None
784 * @details This function disable clock source. \n
785 * The register write-protection function should be disabled before using this function.
786 */
CLK_DisableXtalRC(uint32_t u32ClkMask)787 void CLK_DisableXtalRC(uint32_t u32ClkMask)
788 {
789 CLK->PWRCTL &= ~u32ClkMask;
790 }
791
792 /**
793 * @brief Enable module clock
794 * @param[in] u32ModuleIdx is module index. Including :
795 * - \ref PDMA0_MODULE
796 * - \ref PDMA1_MODULE
797 * - \ref ISP_MODULE
798 * - \ref EBI_MODULE
799 * - \ref ST_MODULE
800 * - \ref EMAC0_MODULE
801 * - \ref SDH0_MODULE
802 * - \ref SDH1_MODULE
803 * - \ref CRC_MODULE
804 * - \ref CCAP_MODULE
805 * - \ref SEN_MODULE
806 * - \ref HSUSBD_MODULE
807 * - \ref HSOTG_MODULE
808 * - \ref HBI_MODULE
809 * - \ref CRPT_MODULE
810 * - \ref KS_MODULE
811 * - \ref SPIM_MODULE
812 * - \ref FMCIDLE_MODULE
813 * - \ref USBH_MODULE
814 * - \ref OTG_MODULE
815 * - \ref USBD_MODULE
816 * - \ref TRACE_MODULE
817 * - \ref GPA_MODULE
818 * - \ref GPB_MODULE
819 * - \ref GPC_MODULE
820 * - \ref GPD_MODULE
821 * - \ref GPE_MODULE
822 * - \ref GPF_MODULE
823 * - \ref GPG_MODULE
824 * - \ref GPH_MODULE
825 * - \ref GPI_MODULE
826 * - \ref GPJ_MODULE
827 * - \ref CANFD0_MODULE
828 * - \ref CANFD1_MODULE
829 * - \ref CANFD2_MODULE
830 * - \ref CANFD3_MODULE
831 * - \ref WDT_MODULE
832 * - \ref WWDT_MODULE
833 * - \ref RTC_MODULE
834 * - \ref TMR0_MODULE
835 * - \ref TMR1_MODULE
836 * - \ref TMR2_MODULE
837 * - \ref TMR3_MODULE
838 * - \ref CLKO_MODULE
839 * - \ref ACMP01_MODULE
840 * - \ref ACMP23_MODULE
841 * - \ref I2C0_MODULE
842 * - \ref I2C1_MODULE
843 * - \ref I2C2_MODULE
844 * - \ref I2C3_MODULE
845 * - \ref I2C4_MODULE
846 * - \ref QSPI0_MODULE
847 * - \ref QSPI1_MODULE
848 * - \ref SPI0_MODULE
849 * - \ref SPI1_MODULE
850 * - \ref SPI2_MODULE
851 * - \ref SPI3_MODULE
852 * - \ref SPI4_MODULE
853 * - \ref SPI5_MODULE
854 * - \ref SPI6_MODULE
855 * - \ref SPI7_MODULE
856 * - \ref SPI8_MODULE
857 * - \ref SPI9_MODULE
858 * - \ref SPI10_MODULE
859 * - \ref UART0_MODULE
860 * - \ref UART1_MODULE
861 * - \ref UART2_MODULE
862 * - \ref UART3_MODULE
863 * - \ref UART4_MODULE
864 * - \ref UART5_MODULE
865 * - \ref UART6_MODULE
866 * - \ref UART7_MODULE
867 * - \ref UART8_MODULE
868 * - \ref UART9_MODULE
869 * - \ref EADC0_MODULE
870 * - \ref EADC1_MODULE
871 * - \ref EADC2_MODULE
872 * - \ref I2S0_MODULE
873 * - \ref I2S1_MODULE
874 * - \ref SC0_MODULE
875 * - \ref SC1_MODULE
876 * - \ref SC2_MODULE
877 * - \ref USCI0_MODULE
878 * - \ref PSIO_MODULE
879 * - \ref DAC_MODULE
880 * - \ref EPWM0_MODULE
881 * - \ref EPWM1_MODULE
882 * - \ref BPWM0_MODULE
883 * - \ref BPWM1_MODULE
884 * - \ref EQEI0_MODULE
885 * - \ref EQEI1_MODULE
886 * - \ref EQEI2_MODULE
887 * - \ref EQEI3_MODULE
888 * - \ref TRNG_MODULE
889 * - \ref ECAP0_MODULE
890 * - \ref ECAP1_MODULE
891 * - \ref ECAP2_MODULE
892 * - \ref ECAP3_MODULE
893 * - \ref TRNG_MODULE
894 * - \ref KPI_MODULE
895 * @return None
896 * @details This function is used to enable module clock.
897 */
CLK_EnableModuleClock(uint32_t u32ModuleIdx)898 void CLK_EnableModuleClock(uint32_t u32ModuleIdx)
899 {
900 uint32_t u32TmpVal = 0UL, u32TmpAddr = 0UL;
901
902 /* Index, 0x0:AHBCLK0, 0x1:APBCLK0, 0x2:APBCLK1, 0x3:APBCLK2, 0x4:AHBCLK1 */
903 uint32_t au32ClkEnTbl[5] = {0x0UL, 0x4UL, 0x8UL, 0x34UL, 0x54UL};
904
905 u32TmpVal = (1UL << MODULE_IP_EN_Pos(u32ModuleIdx));
906 u32TmpAddr = (uint32_t)&CLK->AHBCLK0 + au32ClkEnTbl[MODULE_APBCLK(u32ModuleIdx)];
907
908 *(volatile uint32_t *)u32TmpAddr |= u32TmpVal;
909 }
910
911 /**
912 * @brief Disable module clock
913 * @param[in] u32ModuleIdx is module index. Including :
914 * - \ref PDMA0_MODULE
915 * - \ref PDMA1_MODULE
916 * - \ref ISP_MODULE
917 * - \ref EBI_MODULE
918 * - \ref ST_MODULE
919 * - \ref EMAC0_MODULE
920 * - \ref SDH0_MODULE
921 * - \ref SDH1_MODULE
922 * - \ref CRC_MODULE
923 * - \ref CCAP_MODULE
924 * - \ref SEN_MODULE
925 * - \ref HSUSBD_MODULE
926 * - \ref HSOTG_MODULE
927 * - \ref HBI_MODULE
928 * - \ref CRPT_MODULE
929 * - \ref KS_MODULE
930 * - \ref SPIM_MODULE
931 * - \ref FMCIDLE_MODULE
932 * - \ref USBH_MODULE
933 * - \ref OTG_MODULE
934 * - \ref USBD_MODULE
935 * - \ref TRACE_MODULE
936 * - \ref GPA_MODULE
937 * - \ref GPB_MODULE
938 * - \ref GPC_MODULE
939 * - \ref GPD_MODULE
940 * - \ref GPE_MODULE
941 * - \ref GPF_MODULE
942 * - \ref GPG_MODULE
943 * - \ref GPH_MODULE
944 * - \ref GPI_MODULE
945 * - \ref GPJ_MODULE
946 * - \ref CANFD0_MODULE
947 * - \ref CANFD1_MODULE
948 * - \ref CANFD2_MODULE
949 * - \ref CANFD3_MODULE
950 * - \ref WDT_MODULE
951 * - \ref WWDT_MODULE
952 * - \ref RTC_MODULE
953 * - \ref TMR0_MODULE
954 * - \ref TMR1_MODULE
955 * - \ref TMR2_MODULE
956 * - \ref TMR3_MODULE
957 * - \ref CLKO_MODULE
958 * - \ref ACMP01_MODULE
959 * - \ref ACMP23_MODULE
960 * - \ref I2C0_MODULE
961 * - \ref I2C1_MODULE
962 * - \ref I2C2_MODULE
963 * - \ref I2C3_MODULE
964 * - \ref I2C4_MODULE
965 * - \ref QSPI0_MODULE
966 * - \ref QSPI1_MODULE
967 * - \ref SPI0_MODULE
968 * - \ref SPI1_MODULE
969 * - \ref SPI2_MODULE
970 * - \ref SPI3_MODULE
971 * - \ref SPI4_MODULE
972 * - \ref SPI5_MODULE
973 * - \ref SPI6_MODULE
974 * - \ref SPI7_MODULE
975 * - \ref SPI8_MODULE
976 * - \ref SPI9_MODULE
977 * - \ref SPI10_MODULE
978 * - \ref UART0_MODULE
979 * - \ref UART1_MODULE
980 * - \ref UART2_MODULE
981 * - \ref UART3_MODULE
982 * - \ref UART4_MODULE
983 * - \ref UART5_MODULE
984 * - \ref UART6_MODULE
985 * - \ref UART7_MODULE
986 * - \ref UART8_MODULE
987 * - \ref UART9_MODULE
988 * - \ref EADC0_MODULE
989 * - \ref EADC1_MODULE
990 * - \ref EADC2_MODULE
991 * - \ref I2S0_MODULE
992 * - \ref I2S1_MODULE
993 * - \ref SC0_MODULE
994 * - \ref SC1_MODULE
995 * - \ref SC2_MODULE
996 * - \ref USCI0_MODULE
997 * - \ref PSIO_MODULE
998 * - \ref DAC_MODULE
999 * - \ref EPWM0_MODULE
1000 * - \ref EPWM1_MODULE
1001 * - \ref BPWM0_MODULE
1002 * - \ref BPWM1_MODULE
1003 * - \ref EQEI0_MODULE
1004 * - \ref EQEI1_MODULE
1005 * - \ref EQEI2_MODULE
1006 * - \ref EQEI3_MODULE
1007 * - \ref TRNG_MODULE
1008 * - \ref ECAP0_MODULE
1009 * - \ref ECAP1_MODULE
1010 * - \ref ECAP2_MODULE
1011 * - \ref ECAP3_MODULE
1012 * - \ref TRNG_MODULE
1013 * - \ref KPI_MODULE
1014 * @return None
1015 * @details This function is used to disable module clock.
1016 */
CLK_DisableModuleClock(uint32_t u32ModuleIdx)1017 void CLK_DisableModuleClock(uint32_t u32ModuleIdx)
1018 {
1019 uint32_t u32TmpVal = 0UL, u32TmpAddr = 0UL;
1020
1021 /* Index, 0x0:AHBCLK0, 0x1:APBCLK0, 0x2:APBCLK1, 0x3:APBCLK2, 0x4:AHBCLK1 */
1022 uint32_t au32ClkEnTbl[5] = {0x0UL, 0x4UL, 0x8UL, 0x34UL, 0x54UL};
1023
1024 u32TmpVal = ~(1UL << MODULE_IP_EN_Pos(u32ModuleIdx));
1025 u32TmpAddr = (uint32_t)&CLK->AHBCLK0 + au32ClkEnTbl[MODULE_APBCLK(u32ModuleIdx)];
1026
1027 *(uint32_t *)u32TmpAddr &= u32TmpVal;
1028 }
1029
1030
1031 /**
1032 * @brief Set PLL frequency
1033 * @param[in] u32PllClkSrc is PLL clock source. Including :
1034 * - \ref CLK_PLLCTL_PLLSRC_HXT
1035 * - \ref CLK_PLLCTL_PLLSRC_HIRC
1036 * @param[in] u32PllFreq is PLL frequency. The range of u32PllFreq is 50 MHz ~ 500 MHz.
1037 * @return PLL frequency
1038 * @details This function is used to configure CLK_PLLCTL register to set specified PLL frequency. \n
1039 * The register write-protection function should be disabled before using this function.
1040 */
CLK_EnablePLL(uint32_t u32PllClkSrc,uint32_t u32PllFreq)1041 uint32_t CLK_EnablePLL(uint32_t u32PllClkSrc, uint32_t u32PllFreq)
1042 {
1043 uint32_t u32PllSrcClk, u32NR, u32NF, u32NO, u32PllClk;
1044 uint32_t u32Tmp, u32Tmp2, u32Tmp3, u32Min, u32MinNF, u32MinNR;
1045
1046 /* Check if HCLK is PLL before configure PLL */
1047 if( (CLK->CLKSEL0 & CLK_CLKSEL0_HCLKSEL_Msk) == CLK_CLKSEL0_HCLKSEL_PLL )
1048 {
1049 /* Return PLL frequency directly if HCLK is PLL */
1050 return CLK_GetPLLClockFreq();
1051 }
1052 else
1053 {
1054 /* Disable PLL first to avoid unstable when setting PLL */
1055 CLK->PLLCTL |= CLK_PLLCTL_PD_Msk;
1056 }
1057
1058 /* PLL source clock is from HXT */
1059 if(u32PllClkSrc == CLK_PLLCTL_PLLSRC_HXT)
1060 {
1061 /* Enable HXT clock */
1062 CLK->PWRCTL |= CLK_PWRCTL_HXTEN_Msk;
1063
1064 /* Wait for HXT clock ready */
1065 CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
1066
1067 /* Select PLL source clock from HXT */
1068 u32PllSrcClk = __HXT;
1069 }
1070
1071 /* PLL source clock is from HIRC */
1072 else
1073 {
1074 /* Enable HIRC clock */
1075 CLK->PWRCTL |= CLK_PWRCTL_HIRCEN_Msk;
1076
1077 /* Wait for HIRC clock ready */
1078 CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
1079
1080 /* Select PLL source clock from HIRC */
1081 u32PllSrcClk = __HIRC;
1082 }
1083
1084 /* Check PLL frequency range */
1085 /* Constraint 1: 50MHz < FOUT < 500MHz */
1086 if((u32PllFreq <= FREQ_500MHZ) && (u32PllFreq >= FREQ_50MHZ))
1087 {
1088 /* Select "NO" according to request frequency */
1089 if((u32PllFreq < FREQ_100MHZ) && (u32PllFreq >= FREQ_50MHZ))
1090 {
1091 u32NO = 3UL;
1092 u32PllFreq = u32PllFreq << 2;
1093 }
1094 else if((u32PllFreq < FREQ_200MHZ) && (u32PllFreq >= FREQ_100MHZ))
1095 {
1096 u32NO = 1UL;
1097 u32PllFreq = u32PllFreq << 1;
1098 }
1099 else
1100 {
1101 u32NO = 0UL;
1102 }
1103
1104 /* u32NR start from 3 to avoid calculation overflow */
1105 u32NR = 3UL;
1106
1107 /* Find best solution */
1108 u32Min = (uint32_t) - 1; /* initial u32Min to max value of uint32_t (0xFFFFFFFF) */
1109 u32MinNR = 0UL;
1110 u32MinNF = 0UL;
1111
1112 for(; u32NR <= 32UL; u32NR++) /* max NR = 32 since NR = INDIV+1 and INDIV = 0~31 */
1113 {
1114 u32Tmp = u32PllSrcClk / u32NR; /* FREF = FIN/NR */
1115 if((u32Tmp >= FREQ_4MHZ) && (u32Tmp <= FREQ_8MHZ)) /* Constraint 2: 4MHz < FREF < 8MHz. */
1116 {
1117 for(u32NF = 2UL; u32NF <= 513UL; u32NF++) /* NF = 2~513 since NF = FBDIV+2 and FBDIV = 0~511 */
1118 {
1119 u32Tmp2 = (u32Tmp * u32NF) << 1; /* FVCO = FREF*2*NF */
1120 if((u32Tmp2 >= FREQ_200MHZ) && (u32Tmp2 <= FREQ_500MHZ)) /* Constraint 3: 200MHz < FVCO < 500MHz */
1121 {
1122 u32Tmp3 = (u32Tmp2 > u32PllFreq) ? u32Tmp2 - u32PllFreq : u32PllFreq - u32Tmp2;
1123 if(u32Tmp3 < u32Min)
1124 {
1125 u32Min = u32Tmp3;
1126 u32MinNR = u32NR;
1127 u32MinNF = u32NF;
1128
1129 /* Break when get good results */
1130 if(u32Min == 0UL)
1131 {
1132 break;
1133 }
1134 }
1135 }
1136 }
1137 }
1138 }
1139
1140 /* Enable and apply new PLL setting. */
1141 CLK->PLLCTL = u32PllClkSrc |
1142 (u32NO << CLK_PLLCTL_OUTDIV_Pos) |
1143 ((u32MinNR - 1UL) << CLK_PLLCTL_INDIV_Pos) |
1144 ((u32MinNF - 2UL) << CLK_PLLCTL_FBDIV_Pos);
1145
1146 /* Actual PLL output clock frequency. FOUT = (FIN/NR)*2*NF*(1/NO) */
1147 u32PllClk = u32PllSrcClk / ((u32NO + 1UL) * u32MinNR) * (u32MinNF << 1);
1148 }
1149 else
1150 {
1151 /* Apply default PLL setting and return */
1152 CLK->PLLCTL = u32PllClkSrc | CLK_PLLCTL_192MHz_HXT;
1153
1154 /* Actual PLL output clock frequency */
1155 u32PllClk = FREQ_192MHZ;
1156 }
1157
1158 /* Wait for PLL clock stable */
1159 CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);
1160
1161 /* Return actual PLL output clock frequency */
1162 return u32PllClk;
1163 }
1164
1165
1166 /**
1167 * @brief Disable PLL
1168 * @param None
1169 * @return None
1170 * @details This function set PLL in Power-down mode. \n
1171 * The register write-protection function should be disabled before using this function.
1172 */
CLK_DisablePLL(void)1173 void CLK_DisablePLL(void)
1174 {
1175 CLK->PLLCTL |= CLK_PLLCTL_PD_Msk;
1176 }
1177
1178
1179 /**
1180 * @brief This function check selected clock source status
1181 * @param[in] u32ClkMask is selected clock source. Including :
1182 * - \ref CLK_STATUS_HXTSTB_Msk
1183 * - \ref CLK_STATUS_LXTSTB_Msk
1184 * - \ref CLK_STATUS_HIRCSTB_Msk
1185 * - \ref CLK_STATUS_LIRCSTB_Msk
1186 * - \ref CLK_STATUS_PLLSTB_Msk
1187 * - \ref CLK_STATUS_PLLFNSTB_Msk
1188 * - \ref CLK_STATUS_HIRC48MSTB_Msk
1189 * @retval 0 clock is not stable
1190 * @retval 1 clock is stable
1191 * @details To wait for clock ready by specified clock source stable flag or timeout (>500ms)
1192 */
CLK_WaitClockReady(uint32_t u32ClkMask)1193 uint32_t CLK_WaitClockReady(uint32_t u32ClkMask)
1194 {
1195 uint32_t u32TimeOutCnt = SystemCoreClock>>1; /* 500ms time-out */
1196 uint32_t u32Ret = 1U;
1197
1198 while((CLK->STATUS & u32ClkMask) != u32ClkMask)
1199 {
1200 if(--u32TimeOutCnt == 0)
1201 {
1202 u32Ret = 0U;
1203 break;
1204 }
1205 }
1206
1207 return u32Ret;
1208 }
1209
1210 /**
1211 * @brief Enable System Tick counter
1212 * @param[in] u32ClkSrc is System Tick clock source. Including:
1213 * - \ref CLK_CLKSEL0_STCLKSEL_HXT
1214 * - \ref CLK_CLKSEL0_STCLKSEL_LXT
1215 * - \ref CLK_CLKSEL0_STCLKSEL_HXT_DIV2
1216 * - \ref CLK_CLKSEL0_STCLKSEL_HCLK_DIV2
1217 * - \ref CLK_CLKSEL0_STCLKSEL_HIRC_DIV2
1218 * - \ref CLK_CLKSEL0_STCLKSEL_HCLK
1219 * @param[in] u32Count is System Tick reload value. It could be 0~0xFFFFFF.
1220 * @return None
1221 * @details This function set System Tick clock source, reload value, enable System Tick counter and interrupt. \n
1222 * The register write-protection function should be disabled before using this function.
1223 */
CLK_EnableSysTick(uint32_t u32ClkSrc,uint32_t u32Count)1224 void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count)
1225 {
1226 /* Set System Tick counter disabled */
1227 SysTick->CTRL = 0UL;
1228
1229 /* Set System Tick clock source */
1230 if( u32ClkSrc == CLK_CLKSEL0_STCLKSEL_HCLK )
1231 {
1232 /* Disable System Tick clock source from external reference clock */
1233 CLK->AHBCLK0 &= ~CLK_AHBCLK0_STCKEN_Msk;
1234
1235 /* Select System Tick clock source from core clock */
1236 SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
1237 }
1238 else
1239 {
1240 /* Enable System Tick clock source from external reference clock */
1241 CLK->AHBCLK0 |= CLK_AHBCLK0_STCKEN_Msk;
1242
1243 /* Select System Tick external reference clock source */
1244 CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_STCLKSEL_Msk) | u32ClkSrc;
1245
1246 /* Select System Tick clock source from external reference clock */
1247 SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
1248 }
1249
1250 /* Set System Tick reload value */
1251 SysTick->LOAD = u32Count;
1252
1253 /* Clear System Tick current value and counter flag */
1254 SysTick->VAL = 0UL;
1255
1256 /* Set System Tick interrupt enabled and counter enabled */
1257 SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
1258 }
1259
1260 /**
1261 * @brief Disable System Tick counter
1262 * @param None
1263 * @return None
1264 * @details This function disable System Tick counter.
1265 */
CLK_DisableSysTick(void)1266 void CLK_DisableSysTick(void)
1267 {
1268 /* Set System Tick counter disabled */
1269 SysTick->CTRL = 0UL;
1270 }
1271
1272
1273 /**
1274 * @brief Power-down mode selected
1275 * @param[in] u32PDMode is power down mode index. Including :
1276 * - \ref CLK_PMUCTL_PDMSEL_PD
1277 * - \ref CLK_PMUCTL_PDMSEL_LLPD
1278 * - \ref CLK_PMUCTL_PDMSEL_FWPD
1279 * - \ref CLK_PMUCTL_PDMSEL_SPD
1280 * - \ref CLK_PMUCTL_PDMSEL_DPD
1281 * @return None
1282 * @details This function is used to set power-down mode.
1283 * The register write-protection function should be disabled before using this function.
1284 */
1285
CLK_SetPowerDownMode(uint32_t u32PDMode)1286 void CLK_SetPowerDownMode(uint32_t u32PDMode)
1287 {
1288 CLK->PMUCTL = (CLK->PMUCTL & ~(CLK_PMUCTL_PDMSEL_Msk)) | u32PDMode;
1289 }
1290
1291
1292 /**
1293 * @brief Set Wake-up pin trigger type at Deep Power down mode
1294 *
1295 * @param[in] u32TriggerType Wake-up pin trigger type
1296 * - \ref CLK_DPDWKPIN_RISING
1297 * - \ref CLK_DPDWKPIN_FALLING
1298 * - \ref CLK_DPDWKPIN_BOTHEDGE
1299 * - \ref CLK_DPDWKPIN1_RISING
1300 * - \ref CLK_DPDWKPIN1_FALLING
1301 * - \ref CLK_DPDWKPIN1_BOTHEDGE
1302 * - \ref CLK_DPDWKPIN2_RISING
1303 * - \ref CLK_DPDWKPIN2_FALLING
1304 * - \ref CLK_DPDWKPIN2_BOTHEDGE
1305 * - \ref CLK_DPDWKPIN3_RISING
1306 * - \ref CLK_DPDWKPIN3_FALLING
1307 * - \ref CLK_DPDWKPIN3_BOTHEDGE
1308 * - \ref CLK_DPDWKPIN4_RISING
1309 * - \ref CLK_DPDWKPIN4_FALLING
1310 * - \ref CLK_DPDWKPIN4_BOTHEDGE
1311 * @return None
1312 *
1313 * @details This function is used to enable Wake-up pin trigger type.
1314 * The register write-protection function should be disabled before using this function.
1315 */
1316
CLK_EnableDPDWKPin(uint32_t u32TriggerType)1317 void CLK_EnableDPDWKPin(uint32_t u32TriggerType)
1318 {
1319 uint32_t u32Pin1, u32Pin2, u32Pin3, u32Pin4;
1320
1321 /* Get DPD wake-up pin configuration */
1322 u32Pin1 = ((u32TriggerType) & CLK_PMUCTL_WKPINEN1_Msk);
1323 u32Pin2 = ((u32TriggerType) & CLK_PMUCTL_WKPINEN2_Msk);
1324 u32Pin3 = ((u32TriggerType) & CLK_PMUCTL_WKPINEN3_Msk);
1325 u32Pin4 = ((u32TriggerType) & CLK_PMUCTL_WKPINEN4_Msk);
1326
1327 /* Set DPD wake-up pin configuration */
1328 if(u32Pin1)
1329 {
1330 CLK->PMUCTL = (CLK->PMUCTL & ~(CLK_PMUCTL_WKPINEN1_Msk)) | u32TriggerType;
1331 }
1332 else if(u32Pin2)
1333 {
1334 CLK->PMUCTL = (CLK->PMUCTL & ~(CLK_PMUCTL_WKPINEN2_Msk)) | u32TriggerType;
1335 }
1336 else if(u32Pin3)
1337 {
1338 CLK->PMUCTL = (CLK->PMUCTL & ~(CLK_PMUCTL_WKPINEN3_Msk)) | u32TriggerType;
1339 }
1340 else if(u32Pin4)
1341 {
1342 CLK->PMUCTL = (CLK->PMUCTL & ~(CLK_PMUCTL_WKPINEN4_Msk)) | u32TriggerType;
1343 }
1344 else
1345 {
1346 CLK->PMUCTL = (CLK->PMUCTL & ~(CLK_PMUCTL_WKPINEN0_Msk)) | u32TriggerType;
1347 }
1348
1349 }
1350
1351 /**
1352 * @brief Get power manager wake up source
1353 *
1354 * @param[in] None
1355 * @return None
1356 *
1357 * @details This function get power manager wake up source.
1358 */
1359
CLK_GetPMUWKSrc(void)1360 uint32_t CLK_GetPMUWKSrc(void)
1361 {
1362 return (CLK->PMUSTS);
1363 }
1364
1365 /**
1366 * @brief Set specified GPIO as wake up source at Stand-by Power down mode
1367 *
1368 * @param[in] u32Port GPIO port. It could be 0~3.
1369 * @param[in] u32Pin The pin of specified GPIO port. It could be 0 ~ 15.
1370 * @param[in] u32TriggerType Wake-up pin trigger type
1371 * - \ref CLK_SPDWKPIN_RISING
1372 * - \ref CLK_SPDWKPIN_FALLING
1373 * @param[in] u32DebounceEn Standby Power-down mode wake-up pin de-bounce function
1374 * - \ref CLK_SPDWKPIN_DEBOUNCEEN
1375 * - \ref CLK_SPDWKPIN_DEBOUNCEDIS
1376 * @return None
1377 *
1378 * @details This function is used to set specified GPIO as wake up source at Stand-by Power down mode.
1379 */
CLK_EnableSPDWKPin(uint32_t u32Port,uint32_t u32Pin,uint32_t u32TriggerType,uint32_t u32DebounceEn)1380 void CLK_EnableSPDWKPin(uint32_t u32Port, uint32_t u32Pin, uint32_t u32TriggerType, uint32_t u32DebounceEn)
1381 {
1382 uint32_t u32tmpAddr = 0UL;
1383 uint32_t u32tmpVal = 0UL;
1384
1385 /* GPx Stand-by Power-down Wake-up Pin Select */
1386 u32tmpAddr = (uint32_t)&CLK->PASWKCTL;
1387 u32tmpAddr += (0x4UL * u32Port);
1388
1389 u32tmpVal = inpw((uint32_t *)u32tmpAddr);
1390 u32tmpVal = (u32tmpVal & ~(CLK_PASWKCTL_WKPSEL_Msk | CLK_PASWKCTL_PRWKEN_Msk | CLK_PASWKCTL_PFWKEN_Msk | CLK_PASWKCTL_DBEN_Msk | CLK_PASWKCTL_WKEN_Msk)) |
1391 (u32Pin << CLK_PASWKCTL_WKPSEL_Pos) | u32TriggerType | u32DebounceEn | CLK_SPDWKPIN_ENABLE;
1392 outpw((uint32_t *)u32tmpAddr, u32tmpVal);
1393 }
1394
1395 /**
1396 * @brief Get PLL clock frequency
1397 * @param None
1398 * @return PLL frequency
1399 * @details This function get PLL frequency. The frequency unit is Hz.
1400 */
CLK_GetPLLClockFreq(void)1401 uint32_t CLK_GetPLLClockFreq(void)
1402 {
1403 uint32_t u32PllFreq = 0UL, u32PllReg;
1404 uint32_t u32FIN, u32NF, u32NR, u32NO;
1405 uint8_t au8NoTbl[4] = {1U, 2U, 2U, 4U};
1406
1407 u32PllReg = CLK->PLLCTL;
1408
1409 if(u32PllReg & (CLK_PLLCTL_PD_Msk | CLK_PLLCTL_OE_Msk))
1410 {
1411 u32PllFreq = 0UL; /* PLL is in power down mode or fix low */
1412 }
1413 else /* PLL is in normal mode */
1414 {
1415 /* PLL source clock */
1416 if(u32PllReg & CLK_PLLCTL_PLLSRC_Msk)
1417 {
1418 u32FIN = __HIRC; /* PLL source clock from HIRC */
1419 }
1420 else
1421 {
1422 u32FIN = __HXT; /* PLL source clock from HXT */
1423 }
1424
1425 /* Calculate PLL frequency */
1426 if(u32PllReg & CLK_PLLCTL_BP_Msk)
1427 {
1428 u32PllFreq = u32FIN; /* PLL is in bypass mode */
1429 }
1430 else
1431 {
1432 /* PLL is output enabled in normal work mode */
1433 u32NO = au8NoTbl[((u32PllReg & CLK_PLLCTL_OUTDIV_Msk) >> CLK_PLLCTL_OUTDIV_Pos)];
1434 u32NF = ((u32PllReg & CLK_PLLCTL_FBDIV_Msk) >> CLK_PLLCTL_FBDIV_Pos) + 2UL;
1435 u32NR = ((u32PllReg & CLK_PLLCTL_INDIV_Msk) >> CLK_PLLCTL_INDIV_Pos) + 1UL;
1436
1437 /* u32FIN is shifted 2 bits to avoid overflow */
1438 u32PllFreq = (((u32FIN >> 2) * (u32NF << 1)) / (u32NR * u32NO) << 2);
1439 }
1440 }
1441
1442 return u32PllFreq;
1443 }
1444
1445 /**
1446 * @brief Get selected module clock source
1447 * @param[in] u32ModuleIdx is module index.
1448 * - \ref SDH0_MODULE
1449 * - \ref SDH1_MODULE
1450 * - \ref SEN_MODULE
1451 * - \ref USBH_MODULE
1452 * - \ref OTG_MODULE
1453 * - \ref USBD_MODULE
1454 * - \ref CANFD0_MODULE
1455 * - \ref CANFD1_MODULE
1456 * - \ref CANFD2_MODULE
1457 * - \ref CANFD3_MODULE
1458 * - \ref WDT_MODULE
1459 * - \ref WWDT_MODULE
1460 * - \ref RTC_MODULE
1461 * - \ref TMR0_MODULE
1462 * - \ref TMR1_MODULE
1463 * - \ref TMR2_MODULE
1464 * - \ref TMR3_MODULE
1465 * - \ref CLKO_MODULE
1466 * - \ref QSPI0_MODULE
1467 * - \ref QSPI1_MODULE
1468 * - \ref SPI0_MODULE
1469 * - \ref SPI1_MODULE
1470 * - \ref SPI2_MODULE
1471 * - \ref SPI3_MODULE
1472 * - \ref SPI4_MODULE
1473 * - \ref SPI5_MODULE
1474 * - \ref SPI6_MODULE
1475 * - \ref SPI7_MODULE
1476 * - \ref SPI8_MODULE
1477 * - \ref SPI9_MODULE
1478 * - \ref SPI10_MODULE
1479 * - \ref UART0_MODULE
1480 * - \ref UART1_MODULE
1481 * - \ref UART2_MODULE
1482 * - \ref UART3_MODULE
1483 * - \ref UART4_MODULE
1484 * - \ref UART5_MODULE
1485 * - \ref UART6_MODULE
1486 * - \ref UART7_MODULE
1487 * - \ref UART8_MODULE
1488 * - \ref UART9_MODULE
1489 * - \ref EPWM0_MODULE
1490 * - \ref EPWM1_MODULE
1491 * - \ref BPWM0_MODULE
1492 * - \ref BPWM1_MODULE
1493 * - \ref EADC0_MODULE
1494 * - \ref EADC1_MODULE
1495 * - \ref EADC2_MODULE
1496 * - \ref I2S0_MODULE
1497 * - \ref I2S1_MODULE
1498 * - \ref SC0_MODULE
1499 * - \ref SC1_MODULE
1500 * - \ref SC2_MODULE
1501 * - \ref PSIO_MODULE
1502 * - \ref TRNG_MODULE
1503 * - \ref KPI_MODULE
1504 * @return Selected module clock source setting
1505 * @details This function get selected module clock source.
1506 */
CLK_GetModuleClockSource(uint32_t u32ModuleIdx)1507 uint32_t CLK_GetModuleClockSource(uint32_t u32ModuleIdx)
1508 {
1509 uint32_t u32TmpVal = 0UL, u32TmpAddr = 0UL;
1510 uint32_t au32SelTbl[5] = {0x0UL, 0x4UL, 0x8UL, 0xCUL, 0x4CUL}; /* CLK_CLKSEL0~4 */
1511 uint32_t u32RTCCKEN = CLK->APBCLK0 & CLK_APBCLK0_RTCCKEN_Msk;
1512
1513 /* Get clock source selection setting */
1514 if(u32ModuleIdx == RTC_MODULE)
1515 {
1516 if(u32RTCCKEN == 0UL)
1517 {
1518 /* Enable RTC clock to get LXT clock source */
1519 CLK->APBCLK0 |= CLK_APBCLK0_RTCCKEN_Msk;
1520 }
1521
1522 u32TmpVal = ((RTC->LXTCTL & RTC_LXTCTL_RTCCKSEL_Msk) >> RTC_LXTCTL_RTCCKSEL_Pos);
1523
1524 if(u32RTCCKEN == 0UL)
1525 {
1526 /* Disable RTC clock if it is disabled before */
1527 CLK->APBCLK0 &= (~CLK_APBCLK0_RTCCKEN_Msk);
1528 }
1529
1530 }
1531 else if(MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk)
1532 {
1533 /* Get clock select control register address */
1534 u32TmpAddr = (uint32_t)&CLK->CLKSEL0 + (au32SelTbl[MODULE_CLKSEL(u32ModuleIdx)]);
1535
1536 /* Get clock source selection setting */
1537 u32TmpVal = ((inpw((uint32_t *)u32TmpAddr) & (MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx))) >> MODULE_CLKSEL_Pos(u32ModuleIdx));
1538 }
1539
1540 return u32TmpVal;
1541
1542 }
1543
1544 /**
1545 * @brief Get selected module clock divider number
1546 * @param[in] u32ModuleIdx is module index.
1547 * - \ref SDH0_MODULE
1548 * - \ref SDH1_MODULE
1549 * - \ref SEN_MODULE
1550 * - \ref USBH_MODULE
1551 * - \ref OTG_MODULE
1552 * - \ref USBD_MODULE
1553 * - \ref CANFD0_MODULE
1554 * - \ref CANFD1_MODULE
1555 * - \ref CANFD2_MODULE
1556 * - \ref CANFD3_MODULE
1557 * - \ref UART0_MODULE
1558 * - \ref UART1_MODULE
1559 * - \ref UART2_MODULE
1560 * - \ref UART3_MODULE
1561 * - \ref UART4_MODULE
1562 * - \ref UART5_MODULE
1563 * - \ref UART6_MODULE
1564 * - \ref UART7_MODULE
1565 * - \ref UART8_MODULE
1566 * - \ref UART9_MODULE
1567 * - \ref EADC0_MODULE
1568 * - \ref EADC1_MODULE
1569 * - \ref EADC2_MODULE
1570 * - \ref I2S0_MODULE
1571 * - \ref I2S1_MODULE
1572 * - \ref SC0_MODULE
1573 * - \ref SC1_MODULE
1574 * - \ref SC2_MODULE
1575 * - \ref PSIO_MODULE
1576 * - \ref KPI_MODULE
1577 * @return Selected module clock divider number setting
1578 * @details This function get selected module clock divider number.
1579 */
CLK_GetModuleClockDivider(uint32_t u32ModuleIdx)1580 uint32_t CLK_GetModuleClockDivider(uint32_t u32ModuleIdx)
1581 {
1582 uint32_t u32DivVal = 0UL, u32DivAddr = 0UL;
1583 uint32_t au32DivTbl[6] = {0x0UL, 0x4UL, 0x8UL, 0xCUL, 0x10UL, 0x1C}; /* CLK_CLKDIV0~5 */
1584
1585 switch(u32ModuleIdx)
1586 {
1587 /* For 8 bits divider */
1588 case EADC0_MODULE: u32DivVal = (CLK->CLKDIV0 & CLK_CLKDIV0_EADC0DIV_Msk) >> CLK_CLKDIV0_EADC0DIV_Pos; break;
1589 case SDH0_MODULE: u32DivVal = (CLK->CLKDIV0 & CLK_CLKDIV0_SDH0DIV_Msk) >> CLK_CLKDIV0_SDH0DIV_Pos; break;
1590 case SC0_MODULE: u32DivVal = (CLK->CLKDIV1 & CLK_CLKDIV1_SC0DIV_Msk) >> CLK_CLKDIV1_SC0DIV_Pos; break;
1591 case SC1_MODULE: u32DivVal = (CLK->CLKDIV1 & CLK_CLKDIV1_SC1DIV_Msk) >> CLK_CLKDIV1_SC1DIV_Pos; break;
1592 case SC2_MODULE: u32DivVal = (CLK->CLKDIV1 & CLK_CLKDIV1_SC2DIV_Msk) >> CLK_CLKDIV1_SC2DIV_Pos; break;
1593 case PSIO_MODULE: u32DivVal = (CLK->CLKDIV1 & CLK_CLKDIV1_PSIODIV_Msk) >> CLK_CLKDIV1_PSIODIV_Pos; break;
1594 case KPI_MODULE: u32DivVal = (CLK->CLKDIV2 & CLK_CLKDIV2_KPIDIV_Msk) >> CLK_CLKDIV2_KPIDIV_Pos; break;
1595 case EADC1_MODULE: u32DivVal = (CLK->CLKDIV2 & CLK_CLKDIV2_EADC1DIV_Msk) >> CLK_CLKDIV2_EADC1DIV_Pos; break;
1596 case SEN_MODULE: u32DivVal = (CLK->CLKDIV3 & CLK_CLKDIV3_VSENSEDIV_Msk) >> CLK_CLKDIV3_VSENSEDIV_Pos; break;
1597 case SDH1_MODULE: u32DivVal = (CLK->CLKDIV3 & CLK_CLKDIV3_SDH1DIV_Msk) >> CLK_CLKDIV3_SDH1DIV_Pos; break;
1598 case EADC2_MODULE: u32DivVal = (CLK->CLKDIV5 & CLK_CLKDIV5_EADC2DIV_Msk) >> CLK_CLKDIV5_EADC2DIV_Pos; break;
1599
1600 /* Others */
1601 default:
1602 {
1603 /* Get clock divider control register address */
1604 u32DivAddr = (uint32_t)&CLK->CLKDIV0 + (au32DivTbl[MODULE_CLKDIV(u32ModuleIdx)]);
1605 /* Get clock divider number setting */
1606 u32DivVal = ((inpw((uint32_t *)u32DivAddr) & (MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx))) >> MODULE_CLKDIV_Pos(u32ModuleIdx));
1607 }
1608 break;
1609 }
1610
1611 return u32DivVal;
1612 }
1613
1614 /**
1615 * @brief Disable PLLFN
1616 * @param None
1617 * @return None
1618 * @details This function set PLLFN in Power-down mode. \n
1619 * The register write-protection function should be disabled before using this function.
1620 */
CLK_DisablePLLFN(void)1621 void CLK_DisablePLLFN(void)
1622 {
1623 CLK->PLLFNCTL1 |= CLK_PLLFNCTL1_PD_Msk;
1624 }
1625
1626 /**
1627 * @brief Set PLLFN frequency
1628 * @param[in] u32PllClkSrc is PLLFN clock source. Including :
1629 * - \ref CLK_PLLFNCTL1_PLLSRC_HXT
1630 * - \ref CLK_PLLFNCTL1_PLLSRC_HIRC
1631 * @param[in] u32PllFreq is PLLFN frequency. The range of u32PllFreq is 50 MHz ~ 500 MHz.
1632 * @return PLL frequency
1633 * @details This function is used to configure PLLFNCTL0 and PLLFNCTL1 register to set specified PLLFN frequency. \n
1634 * The register write-protection function should be disabled before using this function.
1635 */
CLK_EnablePLLFN(uint32_t u32PllClkSrc,uint32_t u32PllFreq)1636 uint32_t CLK_EnablePLLFN(uint32_t u32PllClkSrc, uint32_t u32PllFreq)
1637 {
1638 uint32_t u32FIN, u32FVCO, u32FREF, u32PllClk = 0UL;
1639 uint32_t u32NR = 0UL, u32NF = 0UL, u32NO, u32X = 0UL;
1640 float fNX_X = 0.0, fX = 0.0;
1641
1642 /* Disable PLLFN first to avoid unstable when setting PLLFN */
1643 CLK->PLLFNCTL1 |= CLK_PLLFNCTL1_PD_Msk;
1644
1645 /* PLLFN source clock is from HXT */
1646 if(u32PllClkSrc == CLK_PLLFNCTL1_PLLSRC_HXT)
1647 {
1648 /* Enable HXT clock */
1649 CLK->PWRCTL |= CLK_PWRCTL_HXTEN_Msk;
1650
1651 /* Wait for HXT clock ready */
1652 CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
1653
1654 /* Select PLLFN source clock from HXT */
1655 u32FIN = __HXT;
1656 }
1657
1658 /* PLL source clock is from HIRC */
1659 else
1660 {
1661 /* Enable HIRC clock */
1662 CLK->PWRCTL |= CLK_PWRCTL_HIRCEN_Msk;
1663
1664 /* Wait for HIRC clock ready */
1665 CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
1666
1667 /* Select PLLFN source clock from HIRC */
1668 u32FIN = __HIRC;
1669 }
1670
1671 /* Check PLL frequency range */
1672 /* Constraint 1: 50MHz < FOUT < 500MHz */
1673 if((u32PllFreq <= FREQ_500MHZ) && (u32PllFreq >= FREQ_50MHZ))
1674 {
1675 /* Select "NO" according to request frequency */
1676 if((u32PllFreq < FREQ_100MHZ) && (u32PllFreq >= FREQ_50MHZ))
1677 {
1678 u32NO = 3UL;
1679 u32FVCO = u32PllFreq << 2;
1680 }
1681 else if((u32PllFreq < FREQ_200MHZ) && (u32PllFreq >= FREQ_100MHZ))
1682 {
1683 u32NO = 1UL;
1684 u32FVCO = u32PllFreq << 1;
1685 }
1686 else
1687 {
1688 u32NO = 0UL;
1689 u32FVCO = u32PllFreq;
1690 }
1691
1692 /* u32NR start from 3 to avoid calculation overflow */
1693 u32NR = 3UL;
1694
1695 for(; u32NR <= 32UL; u32NR++) /* max NR = 32 since NR = INDIV+1 and INDIV = 0~31 */
1696 {
1697 u32FREF = u32FIN / u32NR; /* FREF = FIN/NR */
1698
1699 if((u32FREF >= FREQ_1MHZ) && (u32FREF <= FREQ_8MHZ)) /* Constraint 2: 1MHz <= FREF <= 8MHz. */
1700 {
1701 fNX_X = (float)((u32FVCO * u32NR)>>1)/u32FIN;
1702 u32NF = (uint32_t)fNX_X;
1703
1704 if((u32NF >= 12) && (u32NF <= 255)) /* Constraint 4: 12<= NF <= 255. */
1705 {
1706 fX = fNX_X - u32NF;
1707 u32X = (uint32_t)(fX*4096);
1708 break;
1709 }
1710 }
1711 }
1712
1713 if(u32NR <= 32UL)
1714 {
1715 /* Enable and apply new PLLFN setting. */
1716 CLK->PLLFNCTL0 = (u32X << CLK_PLLFNCTL0_FRDIV_Pos) |
1717 (u32NO << CLK_PLLFNCTL0_OUTDIV_Pos) |
1718 ((u32NR - 1UL) << CLK_PLLFNCTL0_INDIV_Pos) |
1719 ((u32NF - 2UL) << CLK_PLLFNCTL0_FBDIV_Pos);
1720 CLK->PLLFNCTL1 = u32PllClkSrc;
1721
1722 /* Actual PLL output clock frequency. FOUT = (FIN/NR)*2*(NF.X)*(1/NO) */
1723 u32PllClk = (uint32_t)((float)u32FIN / (((u32NO + 1UL) * u32NR)<<11) * ((u32NF<<12)+u32X));
1724 }
1725 }
1726
1727 if((u32PllFreq > FREQ_500MHZ) || (u32PllFreq < FREQ_50MHZ) || (u32NR==33) )
1728 {
1729 /* Apply default PLLFN setting and return */
1730 CLK->PLLFNCTL0 = CLK_PLLCTL_192MHz_HXT;
1731 CLK->PLLFNCTL1 = u32PllClkSrc;
1732
1733 /* Actual PLLFN output clock frequency */
1734 u32PllClk = FREQ_192MHZ;
1735 }
1736
1737 /* Wait for PLLFN clock stable */
1738 CLK_WaitClockReady(CLK_STATUS_PLLFNSTB_Msk);
1739
1740 /* Return actual PLLFN output clock frequency */
1741 return u32PllClk;
1742 }
1743
1744
1745 /**
1746 * @brief Get PLLFN clock frequency
1747 * @param None
1748 * @return PLLFN frequency
1749 * @details This function get PLLFN frequency. The frequency unit is Hz.
1750 */
CLK_GetPLLFNClockFreq(void)1751 uint32_t CLK_GetPLLFNClockFreq(void)
1752 {
1753 uint32_t u32PllFreq = 0UL, u32PllReg0, u32PllReg1;
1754 uint32_t u32FIN, u32NF, u32NR, u32NO, u32X;
1755 uint8_t au8NoTbl[4] = {1U, 2U, 2U, 4U};
1756
1757 /* Get PLLFN configuration */
1758 u32PllReg0 = CLK->PLLFNCTL0;
1759 u32PllReg1 = CLK->PLLFNCTL1;
1760
1761 if(u32PllReg1 & (CLK_PLLFNCTL1_PD_Msk|CLK_PLLFNCTL1_OE_Msk) )
1762 {
1763 u32PllFreq = 0UL; /* PLLFN is in power down mode or fix low */
1764 }
1765 else /* PLLFN is in normal mode */
1766 {
1767 /* PLLFN source clock */
1768 if(u32PllReg1 & CLK_PLLFNCTL1_PLLSRC_Msk)
1769 {
1770 u32FIN = __HIRC; /* PLLFN source clock from HIRC */
1771 }
1772 else
1773 {
1774 u32FIN = __HXT; /* PLLFN source clock from HXT */
1775 }
1776
1777 /* Calculate PLLFN frequency */
1778 if(u32PllReg1 & CLK_PLLFNCTL1_BP_Msk)
1779 {
1780 u32PllFreq = u32FIN; /* PLLFN is in bypass mode */
1781 }
1782 else
1783 {
1784 /* PLLFN is output enabled in normal work mode */
1785 u32NO = au8NoTbl[((u32PllReg0 & CLK_PLLFNCTL0_OUTDIV_Msk) >> CLK_PLLFNCTL0_OUTDIV_Pos)];
1786 u32NF = ((u32PllReg0 & CLK_PLLFNCTL0_FBDIV_Msk) >> CLK_PLLFNCTL0_FBDIV_Pos) + 2UL;
1787 u32NR = ((u32PllReg0 & CLK_PLLFNCTL0_INDIV_Msk) >> CLK_PLLFNCTL0_INDIV_Pos) + 1UL;
1788 u32X = ((u32PllReg0 & CLK_PLLFNCTL0_FRDIV_Msk) >> CLK_PLLFNCTL0_FRDIV_Pos);
1789
1790 u32PllFreq = (uint32_t)((float)u32FIN / ((u32NO * u32NR)<<11) * ( ((u32NF<<12)+u32X)));
1791 }
1792 }
1793
1794 return u32PllFreq;
1795 }
1796
1797
1798 /*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */
1799
1800 /*@}*/ /* end of group CLK_Driver */
1801
1802 /*@}*/ /* end of group Standard_Driver */
1803