I have tried using PSEL of PLL1 to change divider, I have tried using IDIVA / 2, then changing IDIVA to /1 after a delay and I have tried IDIVA / 2, then switching to PLL1 direct as below:-
// Setup PLL1 (CPU ETC)
LPC_CGU->XTAL_OSC_CTRL = 1 | (1<<1);
LPC_CGU->XTAL_OSC_CTRL = (1<<1); // External OSC, <15MHz
localTemp32 = 0;
while(localTemp32 < 50000) // Wait for Xtal to stabilize
{
LPC_WWDT->FEED = 0xAA;
LPC_WWDT->FEED = 0x55; // Watchdog
localTemp32++;
}
// LPC_CGU->PLL1_CTRL = 1|(1<<6)|(17<<16)|(6<<24);//|(1<<11); // 199.0656MHz
LPC_CGU->PLL1_CTRL = (1<<6)|(17<<16)|(6<<24);//|(1<<11); // 199.0656MHz
localTemp32 = 0;
while((LPC_CGU->PLL1_STAT & 1) == 0x0 && localTemp32 < 100000) // Wait for PLL to lock
{
LPC_WWDT->FEED = 0xAA;
LPC_WWDT->FEED = 0x55; // Watchdog
// localTemp32++;
}
LPC_CGU->IDIVA_CTRL = (1<<2)|(9<<24);//|(1<<11); // IDIVA = PLL1 / 2 (99.5328MHz)
LPC_WWDT->FEED = 0xAA;
LPC_WWDT->FEED = 0x55; // Watchdog
LPC_CGU->BASE_M4_CLK = (0x0C<<24);//|(1<<11); // Set to IDIVA (99.5328MHz)
LPC_CGU->BASE_PERIPH_CLK = (0x0C<<24);//|(1<<11); // Set to IDIVA (99.5328MHz)
LPC_CGU->BASE_APB1_CLK = (0x0C<<24);//|(1<<11); // Set to IDIVA (99.5328MHz) // CAN1, I2C0, PWM
LPC_CGU->BASE_APB3_CLK = (0x0C<<24);//|(1<<11); // Set to IDIVA (99.5328MHz) // CAN0, I2C1, DAC, ADC
LPC_CGU->BASE_SPIFI_CLK = (0x0C<<24);//|(1<<11); // Set to IDIVA (99.5328MHz)
localTemp32 = 0;
while(localTemp32 < 50000) // Wait for CPU
{
LPC_WWDT->FEED = 0xAA;
LPC_WWDT->FEED = 0x55; // Watchdog
localTemp32++;
}
LPC_CGU->BASE_M4_CLK = (9<<24);//|(1<<11); // Set to PLL1 (199MHz)
LPC_CGU->BASE_PERIPH_CLK = (9<<24);//|(1<<11); // Set to PLL1 (199MHz)
LPC_CGU->BASE_APB1_CLK = (9<<24);//|(1<<11); // Set to PLL1 (199MHz) // CAN1, I2C0, PWM
LPC_CGU->BASE_APB3_CLK = (9<<24);//|(1<<11); // Set to PLL1 (199MHz) // CAN0, I2C1, DAC, ADC
LPC_CGU->BASE_SPIFI_CLK = (9<<24);//|(1<<11); // Set to PLL1 (199MHz)