UART-Frequenz in Mikrocontrollern [geschlossen]

Ich habe im Buch "Serial Port Complete, 2nd Edition" gelesen, dass der Takt des UART das 16-fache der Baudrate sein sollte , aber ich habe noch nie einen Mikrocontroller gesehen, bei dem wir die Frequenz des UART einstellen, bevor wir ihn für ein bestimmtes Baud konfigurieren Rate. So:

1) Warum sollte die Frequenz das 16-fache der Baudrate sein?

2) Können Sie mir ein Beispiel für einen Mikrocontroller geben, bei dem wir die UART-Frequenz einstellen?

3) Was ist der Zweck der Einstellung der Taktfrequenz des UART, wenn wir Timer haben? So erzeugen wir die Baudrate in einem einfachen 89c52 durch Timer 1 und stellen keine Frequenz ein.

4) Was ist die Idee, die Baudrate mit einem Timer einzustellen, wie wir es in 89c5x tun. Wie ist es mit der UART-Frequenz verknüpft?

5) RS-232 ist "empfohlener Standard 232" und ein UART ist physisch. Die Hardware führt Parallel-Seriell- und Seriell-Parallel-Konvertierungen durch. Habe ich recht?

6) Enthält der UART einen Zähler, so dass er nach dem Startbit 8 Zyklen wartet und dann nach jeweils 16 Zyklen die Proben von der RX-Leitung genommen werden, um das Bit zu erkennen?

UARTs verwenden Oversampling, typischerweise 8- bis 16-mal, um Daten mit ungenau bekannter Rate zu erfassen, beginnend zu einem beliebigen Zeitpunkt; Dies steht im Gegensatz zu synchronen Schnittstellen, bei denen der Sender eine Sperre bereitstellt. So ziemlich jeder konfigurierbare UART erfordert, dass Sie seine "Frequenz" einstellen, indem Sie einen Taktteiler einstellen, um einen Takt mit der überabgetasteten Rate zu erzeugen. Dieser Taktteiler ähnelt in gewisser Weise einem Zeitgeberblock, ist jedoch in seinen Fähigkeiten weitaus eingeschränkter, da er nur diesen einen Zweck hat.
Nun, ich weiß, dass UART Proben in der Mitte des Bits nimmt, ich habe UART viele Male verwendet, aber nie seine Frequenz durch eine PLL usw. eingestellt. Auch die Baudrate geändert, ich habe die UART-Frequenz nie auf 8/16 Mal geändert.
Das Einstellen der Baudrate ändert genau die Frequenz des Oversampling-Takts. Dies erfolgt im Allgemeinen eher durch Herunterteilen eines noch schnelleren Takts (MCU-Kerntakt oder peripherer Bustakt) als durch eine eindeutige PLL, so dass es auf Faktoren dieser Taktrate beschränkt ist. Natürlich wird der MCU-Kerntakt heute im Allgemeinen von einer PLL bezogen. Die Auswahl zwischen 8-fachem und 16-fachem Oversampling-Modus, falls eine Auswahl erlaubt ist, befindet sich typischerweise in einem Konfigurationsregisterbit.
Ergänzend zu der guten Erklärung von @ChrisStratton (CS pls in eine Antwort eingefügt) bilden viele UARTs einen empfangenen Bitpegel aus 3 Abtastungen um die Mitte des Bits. 8051 verwendete die 7./8./9. Abtastung und nahm den Durchschnitt, so dass Ihr 89C52 mit ziemlicher Sicherheit dasselbe tut (sehen Sie es nach). Meine VHDL-UARTs tun dies zuverlässig. Das (16-fache) Oversampling (a) richtet den Empfänger innerhalb von +/-3 % der Vorderflanke des Startbits aus und (b) macht Bit-Oversampling/Filterung proportional zur Bitrate einfach. Die Mehrheit der BRGs über 10 Jahre basiert auf 16x, siehe fclk->baud calcs. Viele neuere verwenden "fraktionierte" BRGs. Sie können dies leicht im Internet finden und nachlesen.
AVRs können in dieser Hinsicht etwas expliziter dokumentiert werden. Siehe zB Abschnitt 20.3 „Clock Generation“ im Datenblatt des ATMega328 .
Weitere Informationen zum UART-Protokoll, Startbit, Stoppbit und 16-fachem Abtasttakt finden Sie unter electronic.stackexchange.com/a/42240/4512 und electronic.stackexchange.com/a/91453/4512 .
Zum Senden könnten Sie Ihre Logik problemlos 1: 1 mit Baudrate takten, der asynchrone Empfang erfordert einen höheren Takt. Im Wesentlichen bietet es Ihnen Phasendiversität für die Startbitsynchronisierung.
RS-232 ist ein elektrischer und Pin-Standard, kein Protokollstandard, daher ist RS-232 sehr spezifisch für den Stecker und die Spannungen. Sie können uart/seriell ohne RS-232 haben und mit einem Mikrocontroller, den Sie haben, haben sie normalerweise keine eingebauten RS232-Transceiver (wenn überhaupt?).

Antworten (3)

1) Warum sollte die Frequenz das 16-fache der Baudrate sein?

Wie Chris bereits in den Kommentaren darauf hingewiesen hat, gibt es kein Taktsignal, RS-232-UARTs sind asynchrone Systeme. Das bedeutet, dass wir keine Ahnung haben, wann die eingehenden Daten beginnen, und es ist ziemlich sicher, dass die Senderuhr mit einer etwas anderen Rate läuft als die Empfänger. Um dies zu bewältigen, überabtastet der UART die eingehenden Daten, sodass er ein vernünftiges Maß dafür finden kann, wo sich die Übergänge in den Daten befinden. Für Oversampling benötigen Sie eine Clock, die deutlich schneller läuft als die Datenrate.

2) Können Sie mir ein Beispiel für einen Mikrocontroller geben, bei dem wir die UART-Frequenz einstellen?

Praktisch alle enthalten verschiedene Register, um dies einzustellen. zB auf dem LPC1768 gibt es das Fractional Divider Register um den Clock Prescaler auf die UART Logik einzustellen. Im Allgemeinen stellt das Einstellen der Taktfrequenz für die UART-Logik auch die Baudrate für den Ausgang ein, und daher ist es möglicherweise nicht offensichtlich, dass Sie eine Uhr auf das 16-fache der Baudrate einstellen.

3) Was ist der Zweck, die Taktfrequenz auf UART einzustellen, wenn wir Timer haben? Als würden wir die Baudrate in einfachem 89c52 durch Timer 1 erzeugen und keine Frequenz einstellen.

Damit Sie jeden UART mit einer anderen Baudrate betreiben können, ohne alle Ihre Timer zu verbrauchen?

4) Was ist die Idee, die Baudrate mit einem Timer einzustellen, wie wir es in 89c5x tun. Wie ist es mit der UART-Frequenz verknüpft?

Keine Ahnung, habe das Teil nicht benutzt, aber das kommt mir etwas seltsam vor.

5) RS-232 wird als Standard 232 empfohlen und UART ist physikalisch. Die Hardware führt Parallel-Seriell- und Seriell-Parallel-Konvertierungen durch. Habe ich recht?

Ja, der UART hat einen 8-Bit-Sende- und Empfangspuffer, der Prozessor verarbeitet nur Datenbytes, die UART-Hardware verarbeitet die Konvertierung zu seriell und zurück.

6) Enthält UART einen Zähler, so dass er nach dem Startbit 8 Zyklen wartet und dann nach jeweils 16 Zyklen die Proben von der RX-Leitung genommen werden, um das Bit zu erkennen?

Es enthält eine Zustandsmaschine, die den aktuellen Punkt im Sende-/Empfangszyklus verfolgt. Diese Zustandsmaschine enthält sowohl Zähler als auch Logik zum Erkennen von Übergängen, Start- und Stoppbits und zum Erzeugen/Prüfen von Paritätsbits. Wenn Sie nicht Ihren eigenen UART entwerfen möchten, müssen Sie sich keine Gedanken darüber machen, was genau in dieser Zustandsmaschine vor sich geht. Wenn Sie Ihren eigenen UART entwerfen möchten, ist das ein ganz neues Thema.

Die Frage und einige der Antworten verwirren "Uhr", "Frequenz" und "Baudrate".

Wie bereits erläutert, befindet sich im UART eine Uhr, die normalerweise das 16-fache der gewünschten Baudrate beträgt. Damals, als ich Haare hatte, wurde diese Uhr dem UART von einem Hardware-Teiler bereitgestellt, der normalerweise von DIP-Schaltern von einem Quarzoszillator eingestellt wird.

Aber ein UART wie ein 16550 oder der UART in einem Mikrocontroller enthält die Teilerschaltung. Wenn Sie durch Schreiben in ein UART-Register "die Baudrate einstellen", stellen Sie den Teiler ein. Die Eingabe ist ein Hochfrequenztakt, häufig der Prozessortakt.

Ein 16550 hat also oft einen Eingang von einem 1,8432-MHz-Quarzoszillator. Teilen Sie das durch 16, und Sie erhalten 115200 Baud, die schnellste verfügbare Geschwindigkeit mit diesem UART, der diesen Eingang verwendet. Um diese Baudrate zu erhalten, würden Sie den Baudratendivisor des UART auf 1 setzen. Setzen Sie den Divisor auf 2, und Sie erhalten 57600 Baud. Stellen Sie es auf drei und Sie erhalten 38400 Baud usw.

Fancier-UARTS haben eine "Bruchteiler" -Logik, mit der Sie Standard-Baudraten (oder nahe daran) von einem Eingangsoszillator erhalten können, der kein ganzzahliges Vielfaches der Baudrate ist.

Was Sie in Ihrer Antwort erwähnt haben, hat mir sehr gut gefallen. dh "die schnellste verfügbare Geschwindigkeit mit diesem UART, der diesen Eingang verwendet." Es macht wirklich Sinn ... Danke.

Einige der Konstruktionsprinzipien von UARTs gehen auf die Zeit zurück, als die kombinierten Kosten eines Kristalls, einer Schaltung zum Teilen durch drei und eines Zweierpotenz-Frequenzteilers niedriger waren als die Kosten eines vollständig programmierbaren Frequenzteilers.

Die vielseitigste Art, einen UART zu entwerfen, wäre die Verwendung separater programmierbarer Frequenzteiler für Senden und Empfangen, die jeweils auf die 1-fache Baudrate eingestellt sind, und jeweils mit einer programmierbaren Zählung "stauen", wenn die entsprechende Seite des UART im Leerlauf ist. Um die Dinge auf diese Weise zu tun, müssten jedoch zwei separate, vollständig programmierbare Frequenzteiler verwendet werden. Es ist billiger, einen programmierbaren Teiler zu haben, der zwischen Senden und Empfangen geteilt wird, aber er muss schnell genug laufen, damit sowohl der Sender als auch der Empfänger ihn unabhängig voneinander weiter unterteilen können.