Forum: Mikrocontroller und Digitale Elektronik Baudrate des UART0 im LPC2214


von Herbert Wagner (Gast)


Lesenswert?

Ich versuche mit hilfe dieses Codes:
http://www.mikrocontroller.net/articles/ARM-elf-GCC-Tutorial#UART
den UART0 im LPC2214 zu verwenden, um einzelne Zeichen an einen PC zu
senden und im Terminalfenster darzustellen. Dabei erscheinen statt der
gewünschten Zeichen meist 'x' oder selten Hieroglyphen.

Die Oszillatorfrequenz ist 12 MHz (als "#define FOSC  12000000"
angepaßt), die Baudrate sollte 9600 betragen. Allerdings lese ich am
Oszilloskop eine tatsächliche Baudrate von ca. einem Viertel der
gewünschten 9600 Baud ab.

Dies erklärt sich wohl dadurch, dass der PCLK defaultmäßig PCLK=CCLK/4
beträgt. Aber auch PCLK=CCLK zu setzen (mit "SCB_VPBDIV = 1;") oder
den Faktor 4 im divisor latch register zu berücksichtigen:
  // Untere 8 bit des Teilers
  UART0_DLL = (CCLK / (4*baud*16)) & 0xFF;
  // Obere 8 bit des Teilers
  UART0_DLM = ((CCLK / (4*baud*16)) & 0xFF00)>>8;
ändert die Baudrate nicht.

Was mache ich falsch?
Ist es möglich, dass 9600 Baud für gewisse Kombinationen von
CCLK/PCLK/FCCO nicht erreicht werden können, so dass der Wert im
UART0_DLx nicht akzeptiert wird?
Spielen die UART Interrupts eine Rolle (sollten defaultmäßig disabled
sein)?

Herbert

von Dietmar (Gast)


Lesenswert?

Nein nein, das geht sehr gut mit 12 MHz Quarz. Verwende das Keil
MCB2100, ebenfalls 12 MHz.

Aber, wo ist in deiner Beschreibung eigentlich der PLL Multiplier?

Gruß

Dietmar

von Herbert Wagner (Gast)


Lesenswert?

Laut User Manual ist die PLL nach dem Reset disabled, und daran ändere
ich auch nichts.

Selbst wenn ich mit dem PLL etwas falsch mache, sollten doch die
Änderungen in SCB_VPBDIV oder UART0_DLL die Baudrate um den Faktor 4
erhöhen, aber es ändert sich gar nichts?

Hast du ein komplettes (möglichst kurzes) Codebeispiel, das den UART0
erfolgreich benutzt?

Gerade sehe ich, dass sämtliche UART0 Register in der Headerdatei als
REG32, also 4-Byte-Register definiert sind, z.B.
#define U0THR       (*(REG32 (0xE000C000)))
obwohl sie laut Manual nur 8 Bit enthalten. Immerhin starten sie
jeweils an 4-Byte-Grenzen, so dass keine Überschreibungen stattfinden
sollten.

Herbert

von Dietmar (Gast)


Lesenswert?

An deiner Initialisierung kann ich sonst weiter nichts unstimmiges
finden, das scheint OK.

Hier ein ganz einfaches Beispiel, daß ich gerade auf meinem Keil
MCB2100 mit LPC2129 und Quarz 12MHz und Windows HyperTerminal getestet
habe. Die PLL darf nicht initialisiert sein. An der Tastatur
eingegebene Zeichen werden vom Controller zurück gesendet und im
HyperTerminal Fenster ausgegeben.

Es funktioniert einwandfrei.

Kopiere den Teil unterhalb der Trennlinie in ein leeres File und nenne
es Main.c.

Gruß

Dietmar

-------------------------------------------

// RS232 Kommunikation
#define CR 0x0D
#include <LPC21xx.H>

void init_serial (void);
int putchar (int ch);
int getchar (void);

// Hauptprogramm
int main (void)
{
  VPBDIV = 0x01;
  init_serial();

  while(1)
  {
    putchar(getchar());  // Echo
  }
}

// Initialisierung
void init_serial (void)
{
  PINSEL0 |= 0x00000005; // P0.0, P0.1 = TxD0, RxD0 von UART0
  U0LCR    = 0x00000083; // DLAB = 1, 8 bit, no Parity, 1 Stop bit
  U0DLL    = 78;         // 9600 Baud bei 12MHz VPB Clock
  U0DLM    = 0;          // 9600 Baud bei 12MHz VPB Clock
  U0LCR    = 0x00000003; // DLAB = 0
}

// sende Zeichen
int putchar (int ch)
{
  if (ch == '\n')
  {
    while (!(U0LSR & 0x20));
    U0THR = CR;          // gebe CR aus
  }
  while (!(U0LSR & 0x20));
  return (U0THR = ch);
}

// lese Zeichen von Tastatur
int getchar (void)
{
  while (!(U0LSR & 0x01)); // warte auf Zeichen
  return (U0RBR);
}

von Herbert Wagner (Gast)


Lesenswert?

Vielen Dank! Mit hilfe deines Programms konnte ich den Fehler aufspüren.
Letztlich war es eine Zeile in der Mitte meines Programms, die einige
der Initialisierungen wieder aufhob! Blöd, sowas...

Herbert

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.