Hallo, wenn ich ein 100Mhz getakteten LPC1768 nehme und ein Port Pin ein und aus schalte, welch eine Frequenz erzeuge ich damit?
@: Siegfried Schrader Wie wäre es mit einem Blick ins Datenblatt? Ich hab nicht nachgesehen, aber ich wette da gibts was von wegen "rise time bzw. "fall time" - das sollte deine Frage beantworten. Gruß Rainer
1 | while(1) { |
2 | (LPC_GPIO1->FIOSET) = (1<<(21)); |
3 | (LPC_GPIO1->FIOCLR) = (1<<(21)); |
4 | }
|
1 | 51:src/main.c **** while(1) { |
2 | 341 .L2: |
3 | 52:src/main.c **** (LPC_GPIO1->FIOSET) = (1<<(21)); |
4 | 345 0064 9361 str r3, [r2, #24] |
5 | 53:src/main.c **** (LPC_GPIO1->FIOCLR) = (1<<(21)); |
6 | 347 0066 D361 str r3, [r2, #28] |
7 | 348 0068 FCE7 b .L2 |
Dauert 15 Takte, was 6,67MHz bei einem 100MHz Takt ergibt. Kommt mir gerade etwas träge vor aber das zeigt mir das Scope an. CCLK = PCLK = 100MHZ. Ist ein LPC1766.
@Rainer: Ich schaetze mit Rise Time / Fall Time wird man dies nicht beantworten koennen, da die CPU die Pins nur langsamer schalten kann, als die GPIO Pins ihre Zustaende wechseln. @Michael: Danke fuer die konstruktive Antwort ! Kannst Du noch folgende 3 Versuche ausprobieren: (vielleicht wird man noch etwas schneller, wenn man die (1 << 21) vor der Schleife in eine Variable packt ???) while(1) { /* 2 x toggeln */ (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); } while(1) { /* 3 x toggeln */ (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); } while(1) { /* 100 x toggeln (aber nicht mit for-next-Schleife !) */ (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); (LPC_GPIO1->FIOSET) = (1<<(21)); (LPC_GPIO1->FIOCLR) = (1<<(21)); ....einfach 100 x kopieren... } Ich habe sowas mal mit dem alten LPC2106 o.ae. gemacht, da konnte man (soweit ich mich erinnern kann) durch "entrollen" der Schleife einen hoeheren Takt erzielen. Danke !
Hallo, von NXP gibt es ein Forum, wo sich viele leute mit solchen Fragen zu den LPC17xx etc. beschäftigen . Wenn ich es nicht ganz falsch verstanden habe, gibt es 2 unterschiedliche Methoden den Port zu setzten. Die herkömmliche Methode habt ihr oben beschrieben, damit es schneller geht, gibt es aber noch einen anderen Weg. Damit war es möglich den Pin in 6 Takten zu setzen (meine mich so zu entsinnen). Wie genau man dafür vorgeht, kann ich nicht sagen. Schau mal im NXP Forum nach, da wirst du deine Antwort finden, du must nur der englischen Sprache mächtg sein. Gruß Carsten
Martin Maurer schrieb: > while(1) { > /* 2 x toggeln */ > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > } 10MHz > while(1) { > /* 3 x toggeln */ > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > } 12MHz > while(1) { > /* 100 x toggeln (aber nicht mit for-next-Schleife !) */ > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > ....einfach 100 x kopieren... > } 20MHz Der Wert für die FIO Register steht schon in R3. Wüsste nicht wie man das weiter optimieren könnte. Das die Frequenz doch recht stark ansteigt könnte vielleicht mit dem Cache zusammenhängen. Könnte ich ausprobieren indem ich den Takt runterfahre und die Zugriffszeiten für das Flash auf 1 Takt umstelle. Aber nicht jetzt. Die Pulsebreite verringert sich jedenfalls von 50ns auf 20ns.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.