LPC 2138 ARM Taktung

OP #870504
Lesenswert?

Hi,
ich betreibe ein Olimex Board mit 14,7456 Mhz und PLL *4 Einstellung.
Folgendes Programm:
while(1) {
    IO0CLR|=IO_LED_Y; //Yellow LED on  (P0.12)
    IO0SET|=IO_LED_Y; //Yellow LED off
    }
erzeugt ein Rechtecksignal von ca. 1 Mhz. Müsste das nicht erheblich 
schneller sein?
In dem CrossStudio von Rowley muss für den Olimex Tiny der JTAG Clock 
Divider auf 2 oder höher stehen, sonst tut sich nix, ist das so richtig? 
Habe bisher leider keine Doku dazu gefunden.
Gruß Fried
OP #870517
Lesenswert?

Nachtrag, zugehöriger .h file Auszug:

#define REG(x) (*((volatile unsigned int *)(x)))
#define IO0DIR      REG(0xE0028008)  // I/O direction control
#define IO0CLR      REG(0xE002800C)  // output clear
#define IO0SET      REG(0xE0028004)  // output set

#define IO_LED_Y    (1<<12)
#define IO_LED_G    (1<<13)

Thx, Fried
#870581
Lesenswert?

Was für dein LPC2138 ist denn da drauf? LPC2138FBD64 oder 
LPC2138FBD64/01 ?
Ansprechen tust du die Pins zumindest im langsamen Modus. Damit sind bei 
60Mhz max. etwa 4Mhz möglich. Die schnellen IOs des LPC2138FBD64/01 
können das etwa 3.5x schneller.

Ein Grund, dass du nur etwa 1MHz erreichst liegt darin, dass du die 
Register falsch anspricht! Die IOxCLR bzw. IOxSET Register sollten nur 
geschrieben werden, da sie selbst rückstellend sind, d.h. wenn du deinen 
Code durch den nachfolgenden ersetzt solltest du die volle 
Geschwindigkeit erreichen:

while(1)
{
    IO0CLR = IO_LED_Y;
    IO0SET = IO_LED_Y;
}
Gast #870801
Lesenswert?

@Fried,

das Stichwort Fast I/O ist schon mehrfach genannt worden. Wenn I/O ueber 
die traditionelle Art gemacht wird, dann sind da mehrere Teiler drin zur 
Synchronisation des Peripheral Busses.
Fast I/O haengt am sogenannten Local Bus und hat keine Teiler, kann also 
deutlich schneller laufen.
Beim urspruenglichen Design der ARM Prozessoren wurde nicht in Betracht 
gezogen, dass sie eines Tages zur schnellen Bitmanipulation hergenommen 
wuerden, in den Telefonen der 90er Jahre war das nicht so notwendig. Das 
Anwendungsgebiet hat sich geaendert, die Preise fuer die Chips auch.
p.s. Du brauchst keinen 14.756 MHz Takt falls eigentlich ein "gerader 
Takt" besser waere. Es kann also ein 12 MHz Quartz genommen werden. Der 
213x/01 hat einen Fractional Baudrate Generator (im original 213x ist 
der noch nicht drin), d.h. es wird eine sehr genaue Baudrate auch dann 
erreicht, wenn der Takt kein vielfaches von 115200 ist.

Gruss, Robert Teufel
#870830
Lesenswert?

Da du den LPC2138FBD64/01 hast kannst du auch die Fast-IOs (FIO) nutzen.
Für FIOs mußt du gleich am Programmanfang folgende Zeile einfügen:

SCS = 0x00000003;

Danach DARFST du aber nicht mehr auf die normalen IOxxx-Register 
zugreifen, sondern nurnoch auf die FIOxxx. Für jedes IOxxx-Register gibt 
es ein FIOxxx Pendant und noch ein paar weitere, die einem das Leben 
leichter machen. Dann solltest du den 3.5 fachen Wert erreichen. Für 
maximale Geschwindigkeit sind vermutlich ein paar Zeilen Assembler 
notwendig.

Der von Robert erwähnte Fractional Baudrate Generator ist auch eine 
feine Sache und funktioniert bestens. Auf der Seite von NXP existiert 
auch eine Excel-Datei, die die Berechnung der Werte für das 
UxFDR-Register erleichtert.

Eine weitere, sehr nützliche Neuerung sind auch die erweiterten Register 
der A/D-Wandler, die die CPU-Auslastung drastisch reduzieren können.

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