LPC1768 GPIO Port Speed

Gast #2186858
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
#2186885
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.
#2186893
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 !
Gast #2186926
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
#2186942
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren