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
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
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
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); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.