LPC1110-Verwirrung über Standard-Systemuhr und UART-Baudrate

Ich versuche, mich mit ARMs am Beispiel des LPC1110-Geräts vertraut zu machen. Und es gibt einige Verwirrung über die Auswahl der Baudrate für UART.

Ich nehme an, es läuft 12MHznach dem Zurücksetzen. Das LPC111x-Handbuch ( pdf ) sagt, dass ich zuerst einstellen sollte UARTCLKDIV(wie ich es verstehe, ist es ein Vordivisor für die UART-Uhr). Ich habe es auf eingestellt 1. Also denke ich UART_PCLK = 12MHz

Jetzt muss ich divisor in 16-Bit-Latch laden U0DLM:U0DLL. Handbuch sagt das

baud rate = UART_PCLK / (16 * divisor)

Es gibt auch einen Bruchteiler-Einsteller, aber ich glaube, ich benutze ihn nicht.

Der Code sieht also so aus:

int divisor = 12000000 / (16 * 9600);
UARTCLKDIV = 1;
U0LCR = 0x83; // enable divisor loading
U0DLM = divisor >> 8; // divisor high byte
U0DLL = divisor & 0xFF; // divisor low byte
U0LCR = 0x03; // disable divisor loading
U0FCR = 0x07;

Und wunderbarerweise funktioniert das nicht , dh ich sehe das Durcheinander im Terminal. Nach einigem Googeln und Experimentieren habe ich festgestellt, dass es gut funktioniert, wenn ich die erste Zeile ändere in 48MHz:

int divisor = 48000000 / (16 * 9600);

Ich nahm also an, dass PLL aktiviert werden könnte - aber als ich das Handbuch las, kam ich zu dem Schluss, dass dies nicht der Fall ist. Nach dem Zurücksetzen sollte die Hauptuhr direkt vom internen RC-Oszillator funktionieren. Und ich verwende den Wert 12000000 MHz beim Brennen der Firmware mit mxlidem Tool.

Was darf ich hier verpassen?

PS Code-Beispiel Nr. 3 von hier verwendet keinen 16-Bit-Divisor, sondern lädt 0x9B(155) in UARTCLKDIV. Sie sagen, dass dies eine Baudrate von 19200 erreicht, was bedeutet, dass sie auch ungefähr laufen 47.6 MHz(wie ich verstehe).

Antworten (1)

Tut mir leid, das war mein Fehler. Nach dem Debuggen von Steueradressenwerten habe ich festgestellt, dass PLL eingeschaltet ist. Nach einigen weiteren Recherchen habe ich festgestellt, dass es im Initialisierungsmodul aktiviert war, das ich an mein Projekt angehängt habe. Ich habe es ausgeschaltet und alles funktioniert wie erwartet.