www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Cortex-M UART im Polling-Betrieb


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich möchte den UART eines Cortex-M im Polling-Betrieb ansprechen. Der 
UART ist weitgehend zum 16550-UART kompatibel.

Was mich jetzt ein wenig verwirrt ist das LineStatus-Register. Dort sind 
einerseits die Statusbits für das im Rx-FIFO enthaltene Byte (sofern ein 
gültiges drin ist) drin, also beispielsweise ParityError, etc. und für 
den Tx-FIFO die Angabe, ob noch Platz im FIFO ist (THRE-Flag bzw. 
TEMT-Flag).

Wenn ich nun für das Senden mithilfe der THRE/TEMT-Flags ermitteln will 
ob der Tx-FIFO noch Platz hat, muss ich das LS-Register lesen. Das Lesen 
des Registers löscht aber gleichzeitig die Statusflags für das nächste 
Byte im Rx-FIFO, womit die Funktion für's Lesen des Rx-FIFOs die 
Status-Codes verliert.

Heisst dass jetzt, dass ich den UART nur per Interrupt sinnvoll bedienen 
kann oder gibt's doch ne Polling-Variante?
Das einzige was mir bisher einfiel war in der Sende-Funktion 
auszuwerten, ob ein Byte im Rx-FIFO ist (steht ebenfalls im LS-Register) 
und dies über eine globale Variable der Empfangs-Funktion zugänglich zu 
machen. Wenn was da war, liest die Empfangsroutine das LS-Register 
nicht, sondern nimmt den Wert aus der globalen Variablen.

Kann mir jemand auf die Sprünge helfen? :)

Ralf

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich möchte den UART eines Cortex-M im Polling-Betrieb ansprechen.

Wie schön das es nur einen Cortex-M gibt.
Auf der Frage wirst du wohl sitzen bleiben.

Autor: Ralf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Wie schön das es nur einen Cortex-M gibt.
> Auf der Frage wirst du wohl sitzen bleiben.
Auweia, stimmt ja, sorry!
NxP LPC1114 (M0), LPC1343 (M3), LPC1768 (M3).

Anbei auch mal der UserGuide des LPC11xx, auf dem probier ich's aktuell.

Ralf

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zustandsbits vom FIFO verändert sich erst durch Lesen/Schreiben vom 
FIFO. In der Annahme, dass die LPC1000 von den LPC2000 nicht weit weg 
sind:
void
UARTbase::put(char c)
{
    while (!(uart->lsr & UART_LSR_THRE)) {
        ;
    }
    uart->thr = c;
}
Wenn es darum geht, die übrigen Bits über Parityfehler etc. nicht zu 
verlieren, dann musst du die mit jedem Auslesen vom LSR in einer 
gemeinsamen Variable akkumulieren und im Receiver-Code auswerten. Die 
PC-UART hat eben ein paar konzeptionelle Macken.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@prx:
> Wenn es darum geht, die übrigen Bits über Parityfehler etc. nicht zu
> verlieren, dann musst du die mit jedem Auslesen vom LSR in einer
> gemeinsamen Variable akkumulieren und im Receiver-Code auswerten.
Okay, also so wie ich oben dachte :)

Besten Dank und gute Nacht.

Ralf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.