44 static boolean IfxScuCcu_isOscillatorStable(
void);
50 static void IfxScuCcu_wait(
float32 timeSec);
86 {(1 - 1), (24 - 1), (6 - 1), 0}
96 uint8 deviationAllowed = 2;
105 const uint32 fPllMax = 200000000;
106 const uint32 fRefMax = 24000000;
107 const uint32 fRefMin = 8000000;
108 const uint32 fVcoMin = 400000000;
109 const uint32 fVcoMax = 800000000;
110 const uint8 pMin = 1;
111 const uint8 pMax = 16;
112 const uint8 k2Min = 1;
113 const uint8 k2Max = 128;
114 const uint8 nMin = 1;
115 const uint8 nMax = 128;
121 uint32 bestK2 = 0, bestN = 0, bestP = 0;
126 fPllLeastError = fPllMax;
131 if (fPll > 240000000)
136 for (p = pMax; p >= pMin; p--)
140 if ((fRef >= fRefMin) && (fRef <= fRefMax))
142 for (k2 = k2Min; k2 <= k2Max; k2 += k2Steps)
144 fVco = ((
uint64)fPll) * k2;
146 if ((fVco >= fVcoMin) && (fVco <= fVcoMax))
148 for (n = nMin; n <= nMax; n++)
151 fPllError = ((((n) / (p * k2)) * fOsc) - fPll);
155 fPllLeastError = fPllError;
163 if (fPllLeastError > fPllError)
165 fPllLeastError = fPllError;
178 if ((fPllLeastError) < ((fPll * deviationAllowed) / 100))
199 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
201 if (ccucon0.B.BAUD1DIV == 0)
217 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
219 if (ccucon0.B.BAUD2DIV == 0)
238 switch (SCU_CCUCON0.B.LPDIV)
242 if (SCU_CCUCON2.B.BBBDIV == 0)
248 bbbFrequency = sourceFrequency / SCU_CCUCON2.B.BBBDIV;
253 bbbFrequency = sourceFrequency / 30;
256 bbbFrequency = sourceFrequency / 60;
259 bbbFrequency = sourceFrequency / 120;
262 bbbFrequency = sourceFrequency / 240;
281 cpuDiv = SCU_CCUCON6.U;
284 cpuDiv = SCU_CCUCON7.U;
287 cpuDiv = SCU_CCUCON8.U;
297 frequency = frequency * (cpuDiv / 64);
307 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
309 if (ccucon0.B.FSI2DIV == 0)
317 if ((ccucon0.B.SRIDIV == 1) || (ccucon0.B.SRIDIV == 2))
319 frequency = frequency / ccucon0.B.FSI2DIV;
330 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
332 if (ccucon0.B.FSIDIV == 0)
340 if ((ccucon0.B.SRIDIV == 1) || (ccucon0.B.SRIDIV == 2))
342 frequency = frequency / ccucon0.B.FSIDIV;
356 switch (SCU_CCUCON0.B.LPDIV)
360 if (SCU_CCUCON5.B.MAXDIV == 0)
362 maxFrequency = sourceFrequency;
366 maxFrequency = sourceFrequency / SCU_CCUCON5.B.MAXDIV;
371 maxFrequency = sourceFrequency / 15;
374 maxFrequency = sourceFrequency / 30;
377 maxFrequency = sourceFrequency / 60;
380 maxFrequency = sourceFrequency / 120;
399 if (scuFdr.B.DM == 1)
401 moduleFreq = spbFreq / (1024 - scuFdr.B.STEP);
403 else if (scuFdr.B.DM == 2)
405 moduleFreq = (spbFreq * scuFdr.B.STEP) / 1024;
418 return (
float32)IfxScuCcu_xtalFrequency;
432 freq = (
float32)IfxScuCcu_xtalFrequency;
446 Ifx_SCU *scu = &MODULE_SCU;
452 if (scu->PLLERAYSTAT.B.VCOBYST == 1)
455 freq = oscFreq / (scu->PLLERAYCON1.B.K1DIV + 1);
457 else if (scu->PLLERAYSTAT.B.FINDIS == 1)
465 freq = (oscFreq * (scu->PLLERAYCON0.B.NDIV + 1)) / (scu->PLLERAYCON1.B.K2DIV + 1);
476 if (SCU_PLLERAYSTAT.B.FINDIS == 1)
493 Ifx_SCU *scu = &MODULE_SCU;
499 if (scu->PLLSTAT.B.VCOBYST == 1)
502 freq = oscFreq / (scu->PLLCON1.B.K1DIV + 1);
504 else if (scu->PLLSTAT.B.FINDIS == 1)
512 freq = (oscFreq * (scu->PLLCON0.B.NDIV + 1)) / ((scu->PLLCON1.B.K2DIV + 1) * (scu->PLLCON0.B.PDIV + 1));
523 if (SCU_PLLSTAT.B.FINDIS == 1)
542 switch (SCU_CCUCON0.B.CLKSEL)
565 switch (SCU_CCUCON0.B.LPDIV)
569 if (SCU_CCUCON0.B.SPBDIV == 0)
575 spbFrequency = sourceFrequency / SCU_CCUCON0.B.SPBDIV;
580 spbFrequency = sourceFrequency / 30;
583 spbFrequency = sourceFrequency / 60;
586 spbFrequency = sourceFrequency / 120;
589 spbFrequency = sourceFrequency / 240;
606 switch (SCU_CCUCON0.B.LPDIV)
610 if (SCU_CCUCON0.B.SRIDIV == 0)
616 sriFrequency = sourceFrequency / SCU_CCUCON0.B.SRIDIV;
621 sriFrequency = sourceFrequency / 30;
624 sriFrequency = sourceFrequency / 60;
627 sriFrequency = sourceFrequency / 120;
630 sriFrequency = sourceFrequency / 240;
644 uint16 endinit_pw, endinitSfty_pw;
655 smuTrapEnable = SCU_TRAPDIS.B.SMUT;
656 SCU_TRAPDIS.B.SMUT = 1U;
664 while (SCU_CCUCON0.B.LCK != 0U)
670 SCU_CCUCON0.B.CLKSEL = 0;
671 SCU_CCUCON0.B.UP = 1;
674 SCU_PLLCON0.B.SETFINDIS = 1;
678 while (SCU_CCUCON0.B.LCK != 0U)
684 SCU_CCUCON1.B.INSEL = 1;
685 SCU_CCUCON1.B.UP = 1;
687 status |= IfxScuCcu_isOscillatorStable();
703 while (SCU_PLLSTAT.B.K2RDY == 0U)
718 SCU_PLLCON0.B.OSCDISCDIS = 1;
720 SCU_PLLCON0.B.PLLPWD = 0;
722 SCU_PLLCON0.B.CLRFINDIS = 1;
723 SCU_PLLCON0.B.PLLPWD = 1;
726 SCU_PLLCON0.B.RESLD = 1;
728 IfxScuCcu_wait(0.000050F);
730 while (SCU_PLLSTAT.B.VCOLOCK == 0U)
736 SCU_PLLCON0.B.VCOBYP = 0;
738 while (SCU_CCUCON0.B.LCK != 0U)
744 SCU_CCUCON0.B.CLKSEL = 0x01;
747 while (SCU_CCUCON0.B.LCK != 0U)
757 Ifx_SCU_CCUCON0 ccucon0;
761 ccucon0.B.CLKSEL = 0x01;
763 SCU_CCUCON0 = ccucon0;
766 while (SCU_CCUCON1.B.LCK != 0U)
774 Ifx_SCU_CCUCON1 ccucon1;
780 SCU_CCUCON1 = ccucon1;
783 while (SCU_CCUCON2.B.LCK != 0U)
791 Ifx_SCU_CCUCON2 ccucon2;
796 SCU_CCUCON2 = ccucon2;
799 while (SCU_CCUCON5.B.LCK != 0U)
805 Ifx_SCU_CCUCON5 ccucon5;
810 SCU_CCUCON5 = ccucon5;
814 Ifx_SCU_CCUCON6 ccucon6;
818 SCU_CCUCON6 = ccucon6;
823 Ifx_SCU_CCUCON7 ccucon7;
827 SCU_CCUCON7 = ccucon7;
832 Ifx_SCU_CCUCON8 ccucon8;
836 SCU_CCUCON8 = ccucon8;
865 while (SCU_PLLSTAT.B.K2RDY == 0U)
889 SCU_PLLCON0.B.OSCDISCDIS = 0U;
895 SCU_TRAPCLR.B.SMUT = 1U;
896 SCU_TRAPDIS.B.SMUT = smuTrapEnable;
912 uint16 endinit_pw, endinitSfty_pw;
920 smuTrapEnable = SCU_TRAPDIS.B.SMUT;
921 SCU_TRAPDIS.B.SMUT = 1U;
927 if (!SCU_PLLERAYCON0.B.PLLPWD || SCU_PLLERAYCON0.B.VCOPWD || SCU_PLLERAYSTAT.B.PWDSTAT)
930 SCU_PLLERAYCON0.B.PLLPWD = 1;
931 SCU_PLLERAYCON0.B.VCOPWD = 0;
933 while (SCU_PLLERAYSTAT.B.PWDSTAT)
942 if (!SCU_PLLERAYSTAT.B.VCOBYST)
944 while (!SCU_PLLERAYSTAT.B.K1RDY)
947 SCU_PLLERAYCON1.B.K1DIV = 3;
950 SCU_PLLERAYCON0.B.VCOBYP = 1;
953 while (!SCU_PLLERAYSTAT.B.K2RDY)
966 SCU_PLLERAYCON0.B.RESLD = 1U;
967 SCU_PLLERAYCON0.B.CLRFINDIS = 1U;
972 uint32 time_out_ctr = 50000;
974 while (--time_out_ctr && !SCU_PLLERAYSTAT.B.VCOLOCK)
985 SCU_PLLERAYCON0.B.VCOBYP = 0U;
988 while (SCU_PLLERAYSTAT.B.VCOBYST)
991 if (!SCU_PLLERAYSTAT.B.VCOLOCK)
1000 SCU_TRAPCLR.B.SMUT = 1U;
1001 SCU_TRAPDIS.B.SMUT = smuTrapEnable;
1014 static boolean IfxScuCcu_isOscillatorStable(
void)
1022 SCU_OSCCON.B.MODE = 0U;
1028 SCU_OSCCON.B.OSCVAL = ((
uint32)IfxScuCcu_xtalFrequency / 2500000) - 1;
1030 SCU_OSCCON.B.OSCRES = 1U;
1033 while ((SCU_OSCCON.B.PLLLV == 0) || (SCU_OSCCON.B.PLLHV == 0))
1037 if (TimeoutCtr == 0)
1047 SCU_TRAPCLR.B.SMUT = 1U;
1048 SCU_TRAPDIS.B.SMUT = 1U;
1063 if (cpuFreq >= sriFreq)
1069 cpuDiv = (
uint32)((cpuFreq * 64) / sriFreq);
1080 SCU_CCUCON6.U = cpuDiv;
1083 SCU_CCUCON7.U = cpuDiv;
1086 SCU_CCUCON8.U = cpuDiv;
1097 sriFreq = sriFreq * (cpuDiv / 64);
1107 Ifx_SCU_CCUCON1 ccucon1 = SCU_CCUCON1;
1111 gtmDiv =
__maxu(gtmDiv, 1);
1114 if ((gtmDiv >= 7) && (gtmDiv < 14) && ((gtmDiv & 1) == 1))
1116 gtmDiv = gtmDiv - 1;
1126 ccucon1.B.GTMDIV = gtmDiv;
1128 SCU_CCUCON1.U = ccucon1.U;
1142 SCU_PLLERAYCON1.B.K3DIV = pll2Div;
1155 SCU_PLLCON1.B.K3DIV = pll2Div;
1167 Ifx_SCU_CCUCON0 ccucon0;
1170 spbDiv =
__maxu(spbDiv, 2);
1172 if ((spbDiv >= 7) && (spbDiv < 14) && ((spbDiv & 1) == 1))
1174 spbDiv = spbDiv - 1;
1186 SCU_TRAPDIS.U = SCU_TRAPDIS.U | 0x3E0U;
1190 ccucon0.U = SCU_CCUCON0.U;
1191 ccucon0.B.SPBDIV = spbDiv;
1193 SCU_CCUCON0.U = ccucon0.U;
1197 SCU_TRAPDIS.U = SCU_TRAPDIS.U & (
uint32)~0x3E0UL;
1200 while (SCU_CCUCON0.B.LCK != 0U)
1211 Ifx_SCU_CCUCON0 ccucon0;
1214 sriDiv =
__maxu(sriDiv, 1);
1216 if ((sriDiv >= 7) && (sriDiv < 14) && ((sriDiv & 1) == 1))
1218 sriDiv = sriDiv - 1;
1229 ccucon0.U = SCU_CCUCON0.U;
1230 ccucon0.B.SRIDIV = sriDiv;
1232 SCU_CCUCON0.U = ccucon0.U;
1236 while (SCU_CCUCON0.B.LCK != 0U)
1246 uint16 endinit_pw, endinitSfty_pw;
1248 uint8 smuTrapEnable;
1250 if (SCU_CCUCON0.B.CLKSEL == 0)
1265 while (SCU_PLLSTAT.B.K2RDY == 0U)
1283 smuTrapEnable = SCU_TRAPDIS.B.SMUT;
1284 SCU_TRAPDIS.B.SMUT = 1U;
1292 while (SCU_CCUCON0.B.LCK != 0U)
1298 SCU_CCUCON0.B.CLKSEL = 0;
1299 SCU_CCUCON0.B.UP = 1;
1301 while (SCU_CCUCON0.B.LCK != 0U)
1308 SCU_PLLCON0.B.SETFINDIS = 1;
1311 SCU_PLLCON0.B.OSCDISCDIS = 0U;
1317 SCU_TRAPCLR.B.SMUT = 1U;
1318 SCU_TRAPDIS.B.SMUT = smuTrapEnable;
1324 static void IfxScuCcu_wait(
float32 timeSec)
1327 uint32 stmCountBegin = STM0_TIM0.U;
1329 while ((
uint32)(STM0_TIM0.U - stmCountBegin) < stmCount)