Hi,
Also Die Fuses sind hauptsächlich dafür gedacht um Speicher zu sperren
und zu schützen. Die CPU stellst du mit ganz normalen Registern ein.
Hier ist eine einfache Funktion (Ist selbst geschrieben). Im define
steht drin wieviel MHZ dein quarz hat, eigentlich sind 12Mhz üblich beim
AVR32 aber naja mit 10 geht es auch :). Soweit ich weiß funktioniert die
Funktion bei allen AVR32 (UC3A, UC3B, UC3C(noch nicht getestet)).
Kannst aber nur Freqenzen die durch 5 Teilbar sind einstellen. z.B.
10Mhz, 15Mhz, 20Mhz ...
1 | #define crystal_quarz 10
|
2 |
|
3 | void cpu_set_clk(int cclock)
|
4 | {
|
5 | int clockh = (cclock/(crystal_quarz/2)) - 1;
|
6 |
|
7 | AVR32_PM.oscctrl0 = (AVR32_PM.oscctrl0 | 0x00000407); // Startup time / Oscillator Mode
|
8 |
|
9 | AVR32_PM.mcctrl = AVR32_PM_OSC0EN_MASK; // Enable Oscillator 0
|
10 |
|
11 | while((AVR32_PM.poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)== 0); // Oscillator 0 is ready
|
12 |
|
13 |
|
14 | AVR32_PM.pll[0] = 0 << AVR32_PM_PLLOSC_OFFSET | // Oscillator 0 is the source for the PLL
|
15 | 1 << AVR32_PM_PLLDIV_OFFSET | // div = 1
|
16 | clockh << AVR32_PM_PLLMUL_OFFSET | // multi clock z.b. if clockh = 10 (10+1)*10=110/2Fvc = 55Mhz
|
17 | 5 << AVR32_PM_PLLOPT_OFFSET; // 80MHz<fvco<180MHz / fPLL = fvco / Wide Bandwidth Mode disabled
|
18 |
|
19 |
|
20 | AVR32_PM.cksel = 0x80808080;
|
21 |
|
22 | AVR32_PM.pll[0] |= AVR32_PM_PLLEN_MASK; // PLL enable
|
23 |
|
24 | while(!(AVR32_PM.poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); // PLL 0 is locked, and ready to be selected as clock source
|
25 |
|
26 |
|
27 | AVR32_FLASHC.fcr |= 1 << AVR32_FLASHC_FWS_OFFSET; // The flash is read with 1 wait state.
|
28 |
|
29 | AVR32_PM.mcctrl |= 2 << AVR32_PM_MCSEL_OFFSET; // PLL0 as main oscillator
|
30 | }
|