Forum: Mikrocontroller und Digitale Elektronik LPC1768 GPIO Port Speed


von Siegfried S. (rieselkalk)


Lesenswert?

Hallo,
wenn ich ein 100Mhz getakteten LPC1768 nehme und ein Port Pin ein und 
aus schalte, welch eine Frequenz erzeuge ich damit?

von FredFerkel (Gast)


Lesenswert?

Hängt davon ab, wie schnell Du ihn ein- und ausschaltest.

von Siegfried S. (rieselkalk)


Lesenswert?

Hallo FredFerkel,
Natürlich nur mit 0Hz.

von Siegfried S. (rieselkalk)


Lesenswert?

Ich möchte gerne wissen, wie schnell ein Port Pin maximal sein kann.

von H.Joachim S. (crazyhorse)


Lesenswert?

Warum?

von GrunzGrunz (Gast)


Lesenswert?

Wer will das wissen?

von Ich (Gast)


Lesenswert?

Ich hol dann mal das Popcorn raus...

von Rainer (Gast)


Lesenswert?

@: 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

von Michael G. (let)


Lesenswert?

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.

von Martin M. (capiman)


Lesenswert?

@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 !

von Carsten (Gast)


Lesenswert?

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

von Michael G. (let)


Lesenswert?

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
Noch kein Account? Hier anmelden.