void InitPll(Uint16 val, Uint16 clkindiv) { volatile Uint16 iVol; // Make sure the PLL is not running in limp mode if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) { // Missing external clock has been detected // Replace this line with a call to an appropriate // SystemShutdown(); function. asm(" ESTOP0"); } // CLKINDIV MUST be 0 before PLLCR can be changed from // 0x0000. It is set to 0 by an external reset XRSn if (SysCtrlRegs.PLLSTS.bit.CLKINDIV != 0) { EALLOW; SysCtrlRegs.PLLSTS.bit.CLKINDIV = 1; EDIS; } // Change the PLLCR if (SysCtrlRegs.PLLCR.bit.DIV != val) { EALLOW; // Before setting PLLCR turn off missing clock detect logic SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; SysCtrlRegs.PLLCR.bit.DIV = val; EDIS; // Optional: Wait for PLL to lock. // During this time the CPU will switch to OSCCLK/2 until // the PLL is stable. Once the PLL is stable the CPU will // switch to the new PLL value. // // This time-to-lock is monitored by a PLL lock counter. // // Code is not required to sit and wait for the PLL to lock. // However, if the code does anything that is timing critical, // and requires the correct clock be locked, then it is best to // wait until this switching has completed. // Wait for the PLL lock bit to be set. // Note this bit is not available on 281x devices. For those devices // use a software loop to perform the required count. // The watchdog should be disabled before this loop, or fed within // the loop via ServiceDog(). // Uncomment to disable the watchdog DisableDog(); while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1) { // Uncomment to service the watchdog // ServiceDog(); } EALLOW; SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; SysCtrlRegs.PLLSTS.bit.CLKINDIV = clkindiv; EDIS; } EALLOW; SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; SysCtrlRegs.PLLSTS.bit.CLKINDIV = clkindiv; EDIS; }