LPC1766 frage zur Frequenz

Gast #2654188
Lesenswert?
• ▲
▼
Hallo zusammen,

ich Arbeite gerade an einem LPC1766-STK Board und habe eine Frage zur 
eingestellten Frequenz.
1
void InitClock(void)
2
{
3
  // 1. Init OSC
4
  SCS_bit.OSCRANGE = 0;
5
  SCS_bit.OSCEN = 1;
6
  // 2.  Wait for OSC ready
7
  while(!SCS_bit.OSCSTAT);
8
  // 3. Disconnect PLL
9
  PLL0CON_bit.PLLC = 0;
10
  PLL0FEED = 0xAA;
11
  PLL0FEED = 0x55;
12
  // 4. Disable PLL
13
  PLL0CON_bit.PLLE = 0;
14
  PLL0FEED = 0xAA;
15
  PLL0FEED = 0x55;
16
  // 5. Select source clock for PLL
17
  CLKSRCSEL_bit.CLKSRC = 1;   // Selects the main oscillator as a PLL clock source.
18
  PCLKSEL0 = PCLKSEL1 = 0x55555555;   // other peripherals kein Teiler = 50MHz
19
  // 6. Set PLL settings 300 MHz
20
  PLL0CFG_bit.MSEL = 25-1;
21
  PLL0CFG_bit.NSEL = 2-1;
22
  PLL0FEED = 0xAA;
23
  PLL0FEED = 0x55;
24
  // 7. Enable PLL
25
  PLL0CON_bit.PLLE = 1;
26
  PLL0FEED = 0xAA;
27
  PLL0FEED = 0x55;
28
  // 8. Wait for the PLL to achieve lock
29
  while(!PLL0STAT_bit.PLOCK);
30
  // 9. Set clk divider settings
31
  CCLKCFG   = 3-1;            // 1/3 Fpll
32
  // 10. Connect the PLL
33
  PLL0CON_bit.PLLC = 1;
34
  PLL0FEED = 0xAA;
35
  PLL0FEED = 0x55;
36
}

Die Frequenz der Peripherie habe ich ohne Teiler auf 50Mhz gestellt.

Aber auf welcher Herzzahl steht die normale Frequenz?
Ich verstehe zwar das ich die Frequenz mit MSEL und NSEL einstellen 
kann, aber ich verstehe bei besten Willen nicht wie...
Auf was ist sie denn im Moment eingestellt?

Ich hoffe Ihr könnt mir helfen.

Gruß

Christian
Gast #2654500
Lesenswert?
• ▲
▼
Da hilft das berühmte Datenblatt UM10360 weiter:
Fcco = (2* M * Fin) / N
Fcco = (2* 25 * Fin) / 2
Fcco = 25 * Fin
Fcpu = Fcco / 3    wg. CCLKCFG   = 3-1;

Fin ist die Quarzfrequenz, wenn auf dem Board vermutlich ein 12 MHz 
Quarz ist dann rennt die CPU mit 25 * 12 / 3 MHz = 100 MHz.
Gast #2654655
Lesenswert?
• ▲
▼
Ok, erst einmal vielen Dank!

Vllt ist meine Denkweise auch falsch ( oder wahrscheinlich...).
Bei einer Frequenz von 100Mhz ist die Zeit für einen Vorgang dann 10ns ( 
1/100000000) oder?

Ich habe im EINT1 eine Schleife die mir einen Ausgang schalten soll.

            FIO0CLR |= (1UL<<25);             // output turn on
            for(cnt=0;cnt<0x250;cnt++)  {  }
            FIO0SET |= (1UL<<25);             // output turn off

Müsste der Ausgang dann nicht für knappe 6µs (10ns*592) eingeschaltet 
sein?

Laut Oszibild ist er nämlich ca. 100µs lang.
Gast #2654731
Lesenswert?
• ▲
▼
Eine Zeile C-Code wird ja in mehrere Zeilen Assembler übersetzt, je nach 
gewählter Optimierungsstufe auch in verschiedene. Und ein 
Maschinenbefehl kann auch mehrere Takte für die Ausführung brauchen, so 
einfach kann man also nicht rechnen.
Du kannst versuchen dich jetzt an die gewünschte Zeit anzunähern, also 
wenn die Schleife jetzt 16,7 mal zu lange dauert dann wäre die Konstante 
eher 36 (wenn man die Optimierung nicht ändert).
Aber so einen schönen Prozessoren mit vielen Timern und Interrupts in 
NOP Schleifen warten zu lassen ist eine Schande...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.