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?
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.
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.
Chris Stratton
Ziel
Chris Stratton
Lior Kogan
Toni M
JimmyB
Olin Lathrop
stobbe
Oldtimer