Hallo, ich habe mir den Artikel https://www.mikrocontroller.net/articles/AT32UC3C_-_Einstieg_in_die_Programmierung angeguckt und wollte die Init mal compilieren und auf einen AT32UC3C2512C flashen. Leider erhalte ich Fehler: Zeile 22: Error 5 multiple definition of `CPU_set_clk' C:\Users\.././cpu.c Zeile 1: Error 6 undefined reference to `barrier' C:\Users ... AT32UC3C2_ErsteTest.c Restlichen Meldungen sind nur Warnungen. Mehrere Definitionen von der Funktion CPU_set_clk() sind auf jeden Fall nicht vorhanden. Habe versucht die Fehler zu googlen, leider ohne Erfolg. Würde mich über einen Tipp freuen! Gruß
In cpu.c gibts gibts CPU_set_clk in der cpu.h ein CPU_set_clk2. Du rufst in der AT32UC3C2_ErsteTest.c also etwas auf was in der cpu.h nicht deklariert wurde, jedoch in der cpu.c und damit zweimal.
:
Bearbeitet durch User
Error 6 undefined reference to `barrier' C:\Users ... AT32UC3C2_ErsteTest.c habe ich gefunden. Hier ist die Fkt. barrier nicht definiert. Denke es müsste die CPU_barrier() Fkt. sein.
1 | #define CPU_barrier() asm volatile("" ::: "memory")
|
Timmo H. schrieb: > In cpu.c gibts gibts CPU_set_clk in der cpu.h ein CPU_set_clk2. > Du rufst in der AT32UC3C2_ErsteTest.c also etwas auf was in der cpu.h > nicht deklariert wurde, jedoch in der cpu.c und damit zweimal. Habe ich nur zum Testen mal umbenannt. Habe ich dummer weise vergessen wieder Rückgängig zu machen... Error 5 multiple definition of `CPU_set_clk' erhalte ich auch, wenn ich die Fkt. CPU_set_clk() in der main nicht aufrufe
:
Bearbeitet durch User
Hat vielleicht jemand einen funktionierenden Code um den AT32UC3C2 mit einem 12MHz Quarz auf 66 MHz zu takten?
Habe das hier gefunden
1 | void UsePLL(unsigned int clock) |
2 | {
|
3 | int clockh = (clock/6) - 1; |
4 | |
5 | AVR32_PM.oscctrl0 = (AVR32_PM.oscctrl0 | 0x00000407); // Startup time / Oscillator Mode |
6 | |
7 | AVR32_PM.mcctrl = AVR32_PM_OSC0EN_MASK; // Enable Oscillator 0 |
8 | |
9 | while((AVR32_PM.poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)== 0); // Oscillator 0 is ready |
10 | |
11 | |
12 | AVR32_PM.pll[0] = 0 << AVR32_PM_PLLOSC_OFFSET | // Oscillator 0 is the source for the PLL |
13 | 1 << AVR32_PM_PLLDIV_OFFSET | // div = 1 |
14 | clockh << AVR32_PM_PLLMUL_OFFSET | // multi clock z.b. if clockh = 10 (10+1)*12=132/2Fvc = 66Mhz |
15 | 5 << AVR32_PM_PLLOPT_OFFSET; // 80MHz<fvco<180MHz / fPLL = fvco / Wide Bandwidth Mode disabled |
16 | |
17 | AVR32_PM.cksel = 0x80808080; |
18 | |
19 | AVR32_PM.pll[0] |= AVR32_PM_PLLEN_MASK; // PLL enable |
20 | |
21 | while(!(AVR32_PM.poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); // PLL 0 is locked, and ready to be selected as clock source |
22 | |
23 | |
24 | AVR32_FLASHC.fcr |= 0 << AVR32_FLASHC_FWS_OFFSET; // The flash is read with 0 wait state. (write 1 otherwise) |
25 | |
26 | AVR32_PM.mcctrl |= 2 << AVR32_PM_MCSEL_OFFSET; // PLL0 as main oscillator |
27 | |
28 | }
|
AVR32_PM.oscctrl0 gibt es bei mir nicht laut AVR Studio. Das Register OSCCTRL ist bei mir unter System Control Interface also AVR_SCIF.oscctrl AVR32_PM.mcctrl wiederum ist unter Power Manager... Ist das bei den AVR32 unterschiedlich? Macht für mich nicht so richtig Sinn. Kann mir hier jemand was zu erklären?