- Grundlagen der UART-Kommunikation
- Hardwareanforderung und Einrichtung
- Schaltplan für die Nuvoton N76E003 UART-Kommunikation
- UART-Pins am Nuvoton N76E003-Mikrocontroller
- UART-Register im Nuvoton N76E003-Mikrocontroller
- UART-Betriebsmodi in N76E003
- Programmierung von Nuvoton N76E003 für die UART-Kommunikation
UART steht für Universal Asynchronous Receiver / Transmitter und ist eine nützliche Hardwarefunktion in jeder Mikrocontroller-Einheit. Ein Mikrocontroller muss Daten empfangen, verarbeiten und an die anderen Geräte senden. Es gibt verschiedene Arten von Kommunikationsprotokollen im Mikrocontroller. UART ist jedoch das am häufigsten verwendete unter den anderen Kommunikationsprotokollen wie SPI und I2C. Wenn jemand Daten seriell empfangen oder senden muss, ist UART immer die einfachste und häufigste Option. Der Vorteil von UART besteht darin, dass nur zwei Drähte erforderlich sind, um Daten zwischen Geräten zu übertragen. In diesem Artikel erfahren Sie, wie Sie mit dem N76E003-Mikrocontroller eine serielle Kommunikation durchführen.
Grundlagen der UART-Kommunikation
Da wir nun wissen, was UART ist, ist es wichtig, die zugehörigen Parameter des UART zu kennen.
Zwei UART-Geräte empfangen und senden Daten mit derselben Frequenz. Wenn das empfangende UART-Gerät ein Startbit erkennt, beginnt es, die eingehenden Bits mit einer bestimmten Frequenz zu lesen, die als Baudrate bekannt ist. Die Baudrate ist eine wichtige Sache für die UART-Kommunikation und wird verwendet, um die Geschwindigkeit der Datenübertragung in Bit pro Sekunde (bps) zu messen. Diese Baudratengeschwindigkeit für Senden und Empfangen muss dieselbe Baudrate haben. Die Geschwindigkeitsdifferenz der Baudrate zwischen den sendenden und empfangenden UARTs kann nur etwa 10% betragen, bevor das Timing der Bits zu weit entfernt ist. Die beliebtesten Baudratengeschwindigkeiten sind 4800, 9600, 115200 Bit / s usw. Zuvor haben wir die UART-Kommunikation auch in vielen anderen Mikrocontrollern verwendet, die unten aufgeführt sind.
- UART-Kommunikation zwischen ATmega8 und Arduino Uno
- UART-Kommunikation zwischen zwei ATmega8-Mikrocontrollern
- UART-Kommunikation mit PIC-Mikrocontrollern
- UART-Kommunikation auf dem STM8S-Mikrocontroller
Der N76E003 verfügt über zwei UARTs - UART0 und UART1. In diesem Tutorial verwenden wir das UART-Peripheriegerät auf der Mikrocontrollereinheit N76E003. Lassen Sie uns ohne viel Zeitverschwendung bewerten, welche Art von Hardware-Setup wir für diese Anwendung benötigen.
Hardwareanforderung und Einrichtung
Die Hauptkomponente, die für dieses Projekt benötigt wird, ist das USB-zu-UART- oder TTL-Konvertermodul, das die erforderliche Schnittstelle zwischen dem PC oder Laptop mit dem Mikrocontrollermodul herstellt. Für dieses Projekt verwenden wir ein CP2102- basiertes USB-zu-UART-Modul, das unten gezeigt wird.
Abgesehen von der oben genannten Komponente benötigen wir das auf einem Mikrocontroller basierende Entwicklungsboard N76E003 sowie den Nu-Link-Programmierer. Ein zusätzliches 5-V-Netzteil kann erforderlich sein, wenn der Programmierer nicht als Stromquelle verwendet wird.
Schaltplan für die Nuvoton N76E003 UART-Kommunikation
Wie wir im folgenden Schema der Entwicklungsplatine sehen können, wird der 2. und 3. Pin der Mikrocontrollereinheit als UART0 Tx bzw. Rx verwendet. Ganz links ist der Anschluss der Programmierschnittstelle dargestellt.
UART-Pins am Nuvoton N76E003-Mikrocontroller
Der N76E003 verfügt über 20 Pins, von denen 4 für die UART-Kommunikation verwendet werden können. Das folgende Bild zeigt die UART-Pins, die in einem roten Quadrat (Rx) und einem blauen Quadrat (Tx) hervorgehoben sind.
Für den UART0 werden Pin 2 und 3 für die UART-Kommunikation verwendet, und für den UART1 werden Pin 8 und Pin 18 für die Kommunikation verwendet.
UART-Register im Nuvoton N76E003-Mikrocontroller
Der N76E003 verfügt über zwei erweiterte Vollduplex-UARTs mit automatischer Adresserkennung und Framing-Fehlererkennung - UART0 und UART1. Diese beiden UARTs werden mithilfe von Registern gesteuert, die in zwei verschiedene UARTs unterteilt sind. In N76E003 stehen zwei Paare von RX- und TX-Pins für UART-Operationen zur Verfügung. Daher besteht der erste Schritt darin, den gewünschten UART-Port für Operationen auszuwählen.
In diesem Tutorial verwenden wir UART0, daher wird die Konfiguration nur für UART0 angezeigt. UART1 hat dieselbe Konfiguration, aber die Register sind unterschiedlich.
Nach Auswahl eines UART (in diesem Fall UART0) müssen die E / A-Pins, die für die RX- und TX-Kommunikation verwendet werden müssen, als Ein- und Ausgang konfiguriert werden. Der RX-Pin von UART0 ist Pin 3 des Mikrocontrollers, der Port 0.7 ist. Da dies ein serieller Port-Empfangspin ist, muss Port 0.7 als Eingang eingestellt werden. Andererseits ist der Port 0.6, der der 2. Pin des Mikrocontrollers ist, ein Sende- oder Ausgangspin. Es muss als quasi bidirektionaler Modus eingestellt werden. Diese können mit den Registern PxM1 und PxM2 ausgewählt werden. Diese beiden Register legen die E / A-Modi fest, in denen x für die Portnummer steht (Beispiel: Port P1.0, das Register ist P1M1 und P1M2, für P3.0 ist es P3M1 und P3M2 usw.). Die Konfiguration kann im folgenden Bild zu sehen-
UART-Betriebsmodi in N76E003
Der nächste Schritt besteht dann darin, den Modus der UART-Operationen zu bestimmen. Die beiden UARTs können in 4 Modi betrieben werden. Die Modi sind:
Wie wir sehen können, wählen SM0 und SM1 (7. und 6. Bit des SCON-Registers) den Modus der UART-Operationen. Modus 0 ist die synchrone Operation und die anderen drei Modi sind asynchrone Operationen. Der Baudratengenerator und die Frame-Bits unterscheiden sich jedoch für jeden seriellen Port-Modus. Jeder der Modi kann gemäß den Anwendungsanforderungen ausgewählt werden. Dies gilt auch für den UART1. In diesem Lernprogramm wird eine 10-Bit-Operation mit einer Überlaufrate von Timer 3 geteilt durch 32 oder 16 verwendet.
Jetzt ist es Zeit, Informationen abzurufen und das SCON-Register (SCON_1 für UART1) für UART0 zu konfigurieren.
Das 6. und 7. Bit setzen den UART-Modus wie zuvor beschrieben. Bit 5 wird verwendet, um den Multiprozessor-Kommunikationsmodus einzustellen, um Optionen zu aktivieren. Der Prozess hängt jedoch davon ab, welcher UART-Modus ausgewählt ist. Anders als diese wird das REN-Bit auf 1 gesetzt, um den Empfang zu ermöglichen, und das TI-Flag wird auf 1 gesetzt, damit die printf- Funktion anstelle der benutzerdefinierten UART0-Sendefunktion verwendet wird.
Das nächste wichtige Register ist das PCON-Register ( Timer 3 Bit 7 und 6 für UART1). Wenn Sie mit Timern noch nicht vertraut sind, lesen Sie das Tutorial zum Nuvoton N76E003-Timer, um zu erfahren, wie Timer auf dem N76E003-Mikrocontroller verwendet werden.
Das SMOD-Bit ist wichtig, um die doppelte Baudrate im UART0-Modus 1 auszuwählen. Da wir nun den Timer 3 verwenden, muss das Timer 3-Steuerregister T3CON konfiguriert werden. Das Bit 7 und 6 ist jedoch für die Einstellung der doppelten Datenrate für UART1 reserviert.
Und der Timer 3 Pre-Scaler-Wert-
Das 5. Bit BRCK setzt den Timer 3 als Baudratentaktquelle für UART1. Das Datenblatt von N76E003 enthält nun die Formel zur Berechnung der gewünschten Baudrate sowie den Abtastsatzwert für die High- und Low-Register von Timer 3 (16 Bit).
Abtastwert für 16 MHz Taktquelle-
Daher muss die Baudrate im Timer 3-Register unter Verwendung der obigen Formel konfiguriert werden. In unserem Fall handelt es sich um die Formel 4. Wenn Sie den Timer 3 durch Setzen des TR3-Registers auf 1 starten, wird der UART0-Initialisierungs-Timer 3 beendet. Um die UART0-Daten zu empfangen und zu senden, verwenden Sie das folgende Register:
Das SBUF-Register wird automatisch für Empfangen und Senden konfiguriert. Um Daten vom UART zu empfangen, warten Sie, bis das RI-Flag 1 gesetzt und das SBUF-Register gelesen hat, und senden Sie die Daten an UART0, senden Sie die Daten an SBUF und warten Sie, bis das TI-Flag 1 erhält, um die erfolgreiche Datenübertragung zu bestätigen.
Programmierung von Nuvoton N76E003 für die UART-Kommunikation
Der Codierungsteil ist einfach und der vollständige Code, der in diesem Tutorial verwendet wird, befindet sich unten auf dieser Seite. Die Erklärung des Codes lautet wie folgt: Der UART0 wird mit 9600 Baudraten unter Verwendung der Anweisung in der Hauptfunktion initialisiert.
InitialUART0_Timer3 (9600);
Die obige Funktion ist in der Datei common.c definiert und konfiguriert den UART0 mit Timer 3 als Baudratenquelle im Modus 1 und mit einer Baudrate von 9600. Die Funktionsdefinition lautet wie folgt:
void InitialUART0_Timer3 (UINT32 u32Baudrate) // benutze timer3 als Baudrate-Generator { P06_Quasi_Mode; // UART-Pin als Quasi-Modus für die Übertragung einstellen P07_Input_Mode; // UART-Pin als Eingangsmodus für den Empfang einstellen SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate Enable T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // UART0-Baudratentaktquelle = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); 16 / * * MHz / #endif #ifdef FOSC_166000 RH3 HIBYTE = (65536 - (1.037.500 / u32Baudrate)); / * 16,6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); / * 16,6 MHz * / endif set_TR3; // Trigger Timer3 set_TI; // Für die Funktion printf muss TI = 1 gesetzt werden }
Die Deklaration erfolgt wie zuvor beschrieben Schritt für Schritt und die Register werden entsprechend konfiguriert. In der BSP-Bibliothek des N76E003 gibt es jedoch einen Fehler anstelle von P07_Input_Mode. Es gibt P07_Quasi_Mode . Aus diesem Grund funktioniert die UART-Empfangsfunktion nicht.
Die Baudrate wird auch gemäß der Eingabe der Baudrate und unter Verwendung der im Datenblatt angegebenen Formel konfiguriert. Jetzt wird in der Hauptfunktion oder der while-Schleife die printf-Funktion verwendet. Um die printf- Funktion verwenden zu können, muss der TI auf 1 gesetzt werden. Ansonsten wird in der while-Schleife ein Schaltfall verwendet und gemäß den empfangenen UART-Daten wird der Wert gedruckt.
while (1) { printf ("\ r \ nDrücken Sie 1 oder drücken Sie 2 oder drücken Sie 3 oder drücken Sie 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 wird gedrückt"); Unterbrechung; Fall '2': printf ("\ r \ n2 wird gedrückt"); Unterbrechung; Fall '3': printf ("\ r \ n3 wird gedrückt"); Unterbrechung; Fall '4': printf ("\ r \ n4 wird gedrückt"); Unterbrechung; Standard: printf ("\ r \ n Falsche Taste gedrückt"); } Timer0_Delay1ms (300); } }
Nun, für den UART0 erhalten Sie die Receive_Data_From_UART0 (); Funktion wird verwendet. Es ist auch in der Bibliothek common.c definiert.
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; während (! RI); c = SBUF; RI = 0; return (c); }}
Es wartet, bis das RI-Flag 1 erhält, und gibt die Empfangsdaten unter Verwendung der Variablen c zurück.
Code und Ausgabe blinken
Der Code gab 0 Warnungen und 0 Fehler zurück und blitzte mit der Standard-Blinkmethode des Keil. Wenn Sie sich nicht sicher sind, wie Sie Code kompilieren und hochladen sollen, lesen Sie den Artikel Erste Schritte mit nuvoton. Die folgenden Zeilen bestätigen, dass unser Code erfolgreich hochgeladen wurde.
Neuerstellung gestartet: Projekt: printf_UART0 Ziel 'GPIO' neu erstellen Kompilieren von PUTCHAR.C… Kompilieren von Print_UART0.C… Kompilieren von Delay.c… Kompilieren von Common.c… Zusammenstellen von STARTUP.A51… Verknüpfen… Programmgröße: data = 54.2 xdata = 0 code = 2341 Erstellen einer Hex-Datei aus ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Fehler, 0 Warnung (en). Verstrichene Erstellungszeit: 00:00:02 Laden Sie "G: \\ n76E003 \\ Software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Beispielcode \\ UART0_Printf \\ Ausgabe \\ Printf_UART1" Flash Erase Done. Flash Write Done: 2341 Bytes programmiert. Flash Verify Done: 2341 Bytes verifiziert. Das Laden des Flashs wurde um 15:48:08 Uhr beendet
Die Entwicklungsplatine wird über den Programmierer und den Laptop über das USB-UART-Modul an die Stromquelle angeschlossen. Zum Anzeigen oder Senden der UART-Daten ist eine serielle Überwachungssoftware erforderlich. Ich benutze Tera Term für diesen Prozess.
Wie Sie im folgenden Bild sehen können, konnte ich die von unserem Nuvoton-Controller gesendeten Zeichenfolgen anzeigen und auf der Software für den seriellen Monitor anzeigen. Auch konnte Werte vom seriellen Monitor lesen.
Sie können das unten verlinkte Video ansehen, um eine vollständige Demonstration dieses Tutorials zu erhalten. Ich hoffe, Ihnen hat der Artikel gefallen und Sie haben etwas Nützliches gelernt. Wenn Sie Fragen haben, können Sie diese im Kommentarbereich unten hinterlassen oder in unseren Foren andere technische Fragen stellen.