Datum:
Hallo zusammen, ich Arbeite gerade an einem LPC1766-STK Board und habe eine Frage zur eingestellten Frequenz.
void InitClock(void) { // 1. Init OSC SCS_bit.OSCRANGE = 0; SCS_bit.OSCEN = 1; // 2. Wait for OSC ready while(!SCS_bit.OSCSTAT); // 3. Disconnect PLL PLL0CON_bit.PLLC = 0; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 4. Disable PLL PLL0CON_bit.PLLE = 0; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 5. Select source clock for PLL CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source. PCLKSEL0 = PCLKSEL1 = 0x55555555; // other peripherals kein Teiler = 50MHz // 6. Set PLL settings 300 MHz PLL0CFG_bit.MSEL = 25-1; PLL0CFG_bit.NSEL = 2-1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 7. Enable PLL PLL0CON_bit.PLLE = 1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 8. Wait for the PLL to achieve lock while(!PLL0STAT_bit.PLOCK); // 9. Set clk divider settings CCLKCFG = 3-1; // 1/3 Fpll // 10. Connect the PLL PLL0CON_bit.PLLC = 1; PLL0FEED = 0xAA; PLL0FEED = 0x55; } |
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
Datum:
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.
Datum:
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.
Datum:
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...
Datum:
Es gab doch auch die Möglichkeit den Takt über einen Portpin nach aussen zu schalten. Damit lässt sich die Frequenz dann ordentlich messen :)
Datum:
Der CMSIS ist sogar so nett, die Variable SystecmCoreClock zu liefern ...