31 #include "IfxStm_reg.h"
32 #include "IfxFlash_reg.h"
46 static boolean IfxScuCcu_isOscillatorStable(
void);
52 static void IfxScuCcu_wait(
float32 timeSec);
81 {(1 - 1), (24 - 1), (6 - 1), 0}
91 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
93 if (ccucon0.B.BAUD1DIV == 0)
109 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
111 if (ccucon0.B.BAUD2DIV == 0)
130 switch (SCU_CCUCON0.B.LPDIV)
134 if (SCU_CCUCON2.B.BBBDIV == 0)
140 bbbFrequency = sourceFrequency / SCU_CCUCON2.B.BBBDIV;
145 bbbFrequency = sourceFrequency / 30;
148 bbbFrequency = sourceFrequency / 60;
151 bbbFrequency = sourceFrequency / 120;
154 bbbFrequency = sourceFrequency / 240;
173 cpuDiv = SCU_CCUCON6.U;
176 cpuDiv = SCU_CCUCON7.U;
179 cpuDiv = SCU_CCUCON8.U;
188 frequency = frequency * (cpuDiv / 64);
198 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
200 if (ccucon0.B.FSIDIV == 0)
208 if ((ccucon0.B.FSIDIV == 1) || (ccucon0.B.SRIDIV == 1) || (ccucon0.B.SRIDIV == 2))
210 frequency = frequency / ccucon0.B.FSIDIV;
221 Ifx_SCU_CCUCON0 ccucon0 = SCU_CCUCON0;
223 if (ccucon0.B.FSIDIV == 0)
231 if ((ccucon0.B.FSIDIV == 1) || (ccucon0.B.SRIDIV == 1) || (ccucon0.B.SRIDIV == 2))
233 frequency = frequency / ccucon0.B.FSIDIV;
247 switch (SCU_CCUCON0.B.LPDIV)
251 if (SCU_CCUCON5.B.MAXDIV == 0)
253 maxFrequency = sourceFrequency;
257 maxFrequency = sourceFrequency / SCU_CCUCON5.B.MAXDIV;
262 maxFrequency = sourceFrequency / 15;
265 maxFrequency = sourceFrequency / 30;
268 maxFrequency = sourceFrequency / 60;
271 maxFrequency = sourceFrequency / 120;
290 if (scuFdr.B.DM == 1)
292 moduleFreq = spbFreq / (1024 - scuFdr.B.STEP);
294 else if (scuFdr.B.DM == 2)
296 moduleFreq = (spbFreq * scuFdr.B.STEP) / 1024;
309 Ifx_SCU *scu = &MODULE_SCU;
315 if (scu->PLLERAYSTAT.B.VCOBYST == 1)
318 freq = oscFreq / (scu->PLLERAYCON1.B.K1DIV + 1);
320 else if (scu->PLLERAYSTAT.B.FINDIS == 1)
328 freq = (oscFreq * (scu->PLLERAYCON0.B.NDIV + 1)) / (scu->PLLERAYCON1.B.K2DIV + 1);
339 if (SCU_PLLERAYSTAT.B.FINDIS == 1)
356 Ifx_SCU *scu = &MODULE_SCU;
362 if (scu->PLLSTAT.B.VCOBYST == 1)
365 freq = oscFreq / (scu->PLLCON1.B.K1DIV + 1);
367 else if (scu->PLLSTAT.B.FINDIS == 1)
375 freq = (oscFreq * (scu->PLLCON0.B.NDIV + 1)) / ((scu->PLLCON1.B.K2DIV + 1) * (scu->PLLCON0.B.PDIV + 1));
386 if (SCU_PLLSTAT.B.FINDIS == 1)
405 switch (SCU_CCUCON0.B.CLKSEL)
428 switch (SCU_CCUCON0.B.LPDIV)
432 if (SCU_CCUCON0.B.SPBDIV == 0)
438 spbFrequency = sourceFrequency / SCU_CCUCON0.B.SPBDIV;
443 spbFrequency = sourceFrequency / 30;
446 spbFrequency = sourceFrequency / 60;
449 spbFrequency = sourceFrequency / 120;
452 spbFrequency = sourceFrequency / 240;
469 switch (SCU_CCUCON0.B.LPDIV)
473 if (SCU_CCUCON0.B.SRIDIV == 0)
479 sriFrequency = sourceFrequency / SCU_CCUCON0.B.SRIDIV;
484 sriFrequency = sourceFrequency / 30;
487 sriFrequency = sourceFrequency / 60;
490 sriFrequency = sourceFrequency / 120;
493 sriFrequency = sourceFrequency / 240;
507 uint16 endinit_pw, endinitSfty_pw;
515 smuTrapEnable = SCU_TRAPDIS.B.SMUT;
516 SCU_TRAPDIS.B.SMUT = 1U;
523 while (SCU_CCUCON0.B.LCK != 0U)
528 SCU_CCUCON0.B.CLKSEL = 0;
529 SCU_CCUCON0.B.UP = 1;
532 SCU_PLLCON0.B.SETFINDIS = 1;
536 while (SCU_CCUCON0.B.LCK != 0U)
541 SCU_CCUCON1.B.INSEL = 1;
542 SCU_CCUCON1.B.UP = 1;
544 status |= IfxScuCcu_isOscillatorStable();
558 while (SCU_PLLSTAT.B.K2RDY == 0U)
574 SCU_PLLCON0.B.OSCDISCDIS = 1;
576 SCU_PLLCON0.B.CLRFINDIS = 1;
578 IfxScuCcu_wait(0.000050F);
581 SCU_PLLCON0.B.RESLD = 1;
583 while (SCU_PLLSTAT.B.VCOLOCK == 0U)
588 SCU_PLLCON0.B.VCOBYP = 0;
590 while (SCU_CCUCON0.B.LCK != 0U)
595 SCU_CCUCON0.B.CLKSEL = 0x01;
598 while (SCU_CCUCON0.B.LCK != 0U)
607 Ifx_SCU_CCUCON0 ccucon0;
611 ccucon0.B.CLKSEL = 0x01;
613 SCU_CCUCON0 = ccucon0;
616 while (SCU_CCUCON1.B.LCK != 0U)
622 Ifx_SCU_CCUCON1 ccucon1;
628 SCU_CCUCON1 = ccucon1;
631 while (SCU_CCUCON2.B.LCK != 0U)
637 Ifx_SCU_CCUCON2 ccucon2;
642 SCU_CCUCON2 = ccucon2;
645 while (SCU_CCUCON5.B.LCK != 0U)
651 Ifx_SCU_CCUCON5 ccucon5;
656 SCU_CCUCON5 = ccucon5;
660 Ifx_SCU_CCUCON6 ccucon6;
664 SCU_CCUCON6 = ccucon6;
668 Ifx_SCU_CCUCON7 ccucon7;
672 SCU_CCUCON7 = ccucon7;
676 Ifx_SCU_CCUCON8 ccucon8;
680 SCU_CCUCON8 = ccucon8;
709 while (SCU_PLLSTAT.B.K2RDY == 0U)
732 SCU_PLLCON0.B.OSCDISCDIS = 0U;
737 SCU_TRAPCLR.B.SMUT = 1U;
738 SCU_TRAPDIS.B.SMUT = smuTrapEnable;
754 uint16 endinit_pw, endinitSfty_pw;
763 smuTrapEnable = SCU_TRAPDIS.B.SMUT;
764 SCU_TRAPDIS.B.SMUT = 1U;
770 if (!SCU_PLLERAYCON0.B.PLLPWD || SCU_PLLERAYCON0.B.VCOPWD || SCU_PLLERAYSTAT.B.PWDSTAT)
773 SCU_PLLERAYCON0.B.PLLPWD = 1;
774 SCU_PLLERAYCON0.B.VCOPWD = 0;
776 while (SCU_PLLERAYSTAT.B.PWDSTAT)
785 if (!SCU_PLLERAYSTAT.B.VCOBYST)
787 while (!SCU_PLLERAYSTAT.B.K1RDY)
790 SCU_PLLERAYCON1.B.K1DIV = 3;
793 SCU_PLLERAYCON0.B.VCOBYP = 1;
796 while (!SCU_PLLERAYSTAT.B.K2RDY)
810 SCU_PLLERAYCON0.B.RESLD = 1U;
811 SCU_PLLERAYCON0.B.CLRFINDIS = 1U;
816 uint32 time_out_ctr = 50000;
818 while (--time_out_ctr && !SCU_PLLERAYSTAT.B.VCOLOCK)
829 SCU_PLLERAYCON0.B.VCOBYP = 0U;
832 while (SCU_PLLERAYSTAT.B.VCOBYST)
835 if (!SCU_PLLERAYSTAT.B.VCOLOCK)
843 for (i = 0; i < 100; i++)
848 SCU_TRAPCLR.B.SMUT = 1U;
849 SCU_TRAPDIS.B.SMUT = smuTrapEnable;
862 static boolean IfxScuCcu_isOscillatorStable(
void)
871 SCU_OSCCON.B.MODE = 0U;
875 SCU_OSCCON.B.OSCVAL = 2;
879 SCU_OSCCON.B.OSCVAL = 7;
883 SCU_OSCCON.B.OSCRES = 1U;
886 while ((SCU_OSCCON.B.PLLLV == 0) || (SCU_OSCCON.B.PLLHV == 0))
899 SCU_TRAPCLR.B.SMUT = 1U;
900 SCU_TRAPDIS.B.SMUT = 1U;
915 if (cpuFreq >= sriFreq)
921 cpuDiv = (
uint32)((cpuFreq * 64) / sriFreq);
932 SCU_CCUCON6.U = cpuDiv;
935 SCU_CCUCON7.U = cpuDiv;
938 SCU_CCUCON8.U = cpuDiv;
949 sriFreq = sriFreq * (cpuDiv / 64);
962 SCU_PLLERAYCON1.B.K3DIV = pll2Div;
975 SCU_PLLCON1.B.K3DIV = pll2Div;
989 spbDiv =
__maxu(spbDiv, 2);
990 spbDiv = spbDiv & 0x2U;
996 SCU_TRAPDIS.U = SCU_TRAPDIS.U | 0x3E0U;
1000 SCU_CCUCON0.B.SPBDIV = spbDiv;
1004 SCU_TRAPDIS.U = SCU_TRAPDIS.U & (
uint32)~0x3E0UL;
1011 static void IfxScuCcu_wait(
float32 timeSec)
1014 uint32 stmCountBegin = STM0_TIM0.U;
1016 while ((
uint32)(STM0_TIM0.U - stmCountBegin) < stmCount)
1031 Ifx_SCU_CCUCON1 ccucon1 = SCU_CCUCON1;
1035 gtmDiv =
__maxu(gtmDiv, 1);
1038 if ((gtmDiv >= 7) && (gtmDiv < 14) && ((gtmDiv & 1) == 1))
1040 gtmDiv = gtmDiv - 1;
1050 ccucon1.B.GTMDIV = gtmDiv;
1052 SCU_CCUCON1.U = ccucon1.U;