Hallo,
ich hab mir vor kurzem das Olimex-Dev-Board LPC-P2148 zugelegt. Nun hab
ich mir folgenden PLL-Init-Code zusammengestellt, der aber leider nicht
funktioniert, da bei meinem Testprogramm (siehe unten) nicht wie
vorgesehen die LEDs im Sekundentakt, sondern nur etwa alle 5 Sekunden,
wechseln. Ich schließe daraus, dass der PLL nicht aktiviert wird, kann
aber leider keinen Fehler in meinem Code finden. Für eure Hilfe bedanke
ich mich schon einmal im voraus.
PLL-INIT:
1 | #define FOSC 12000000
|
2 | #define PLL_M 5
|
3 | #define PLL_P 2
|
4 | #define CCLK (PLL_M * FOSC)
|
5 |
|
6 | void arch_init(void) {
|
7 |
|
8 | // CCLK = FOSC*PLL_M = 12000000*5 = 60000000
|
9 | PLL0->CFG = (PLL_M-1)|((PLL_P-1)<<5);
|
10 | // PLL aktivieren
|
11 | PLL0->CON = 0x01;
|
12 | PLL0->FEED = 0xAA; //PLL Feed-Sequenz
|
13 | PLL0->FEED = 0x55;
|
14 | // Änderungen werden übernommen
|
15 | while ( !( PLL0->STAT & PLOCK ) );
|
16 |
|
17 | // PLL aktivieren/mit Taktgeber verbinden
|
18 | PLL0->CON = 0x03;
|
19 | PLL0->FEED = 0xAA; //PLL Feed Sequence
|
20 | PLL0->FEED = 0x55;
|
21 |
|
22 |
|
23 | MAMCR=0x0;
|
24 |
|
25 | #if CCLK < 20000000
|
26 | MAMTIM = 1;
|
27 | #elif CCLK < 40000000
|
28 | MAMTIM = 2;
|
29 | #elif CCLK >= 40000000
|
30 | MAMTIM = 3;
|
31 | #endif
|
32 |
|
33 | MAMCR=0x2;
|
34 |
|
35 |
|
36 | VPBDIV=0x1;
|
37 |
|
38 | }
|
Test-Programm:
1 | int main(void) {
|
2 |
|
3 | uin32_t i = 0;
|
4 |
|
5 | arch_init();
|
6 |
|
7 | GPIO0->DIR |= (1<<10);
|
8 | GPIO0->SET = (1<<10);
|
9 | GPIO0->DIR |= (1<<11);
|
10 | GPIO0->SET = (1<<11);
|
11 |
|
12 | while(1) {
|
13 | GPIO0->SET = (1<<11);
|
14 | GPIO0->CLR = (1<<10);
|
15 | for(i = 60000000;i>0;i--)
|
16 | NOP();
|
17 | GPIO0->SET = (1<<10);
|
18 | GPIO0->CLR = (1<<11);
|
19 | for(i = 60000000;i>0;i--)
|
20 | NOP();
|
21 | }
|
22 |
|
23 | return 0;
|
24 | }
|