void pll(int freq) { sbi(AVR32_PM.oscctrl0, 0); //Taktquelle externer Quarz > 8MHz sbi(AVR32_PM.oscctrl0, 1); sbi(AVR32_PM.oscctrl0, 2); cbi(AVR32_PM.oscctrl0, 8); //Startup-Time Quarz 4096 Zyklen des RC-Oszillators 0 (115 kHz --> 36ms) cbi(AVR32_PM.oscctrl0, 9); sbi(AVR32_PM.oscctrl0, 10); sbi(AVR32_PM.mcctrl, 2); // Osc0 enable while(bit_is_clear(AVR32_PM.poscsr, 7)) //Warten bis Osc0 stabil ist { } cbi(AVR32_PM.pll[0], 1); // PLL Source = Osc0 sbi(AVR32_PM.pll[0], 8); // PLL Division Factor int mul = (freq / (QUARZ_FREQ / 2)) - 1; AVR32_PM.pll[0] = mul << 16; // PLL Multiply Factor sbi(AVR32_PM.pll[0], 2); // 80MHz < fvco < 180MHz sbi(AVR32_PM.pll[0], 4); // Wide Bandwith Mode disabled sbi(AVR32_PM.cksel, 7); // CPU clock = MainClock / 2^(CPUSEL + 1) = MainClock / 2 sbi(AVR32_PM.cksel, 15); // HSB clock = MainClock / 2^(HSBSEL + 1) = MainClock / 2 sbi(AVR32_PM.cksel, 23); // PBA clock = MainClock / 2^(PBASEL + 1) = MainClock / 2 sbi(AVR32_PM.cksel, 31); // PBB clock = MainClock / 2^(PBBSEL + 1) = MainClock / 2 sbi(AVR32_PM.pll[0], 0); // Enable PLL while(bit_is_clear(AVR32_PM.poscsr, 0)) // Wait until PLL0 is stable { } if(freq > 30) { sbi(AVR32_FLASHC.fcr, 6); // Flash wait state = 1 } sbi(AVR32_PM.mcctrl, 1); // Select PLL0 as ClockSource }