Forum: Mikrocontroller und Digitale Elektronik USART2_write


von Richard W. (richard00)


Lesenswert?

Hallo Leute,

ich hab mal eine Verständnisfrage, weil ich mir nicht sicher bin ob ich 
das richtig verstanden habe. Ich hab das Board, STM32f411 und wollte den 
UART bzw. USART verwenden. Ich hab mein Code geschrieben aber eine Zeile 
im Code verstehe ich nicht so ganz bzw. kann es nicht nachvollziehen.

#include "stm32f4xx.h"  // Device header


int main(void)
{

}

void USART2_Init(void)
{
  RCC->APB1ENR |= 0x20000;  // Bit 17, enable USART2 Clock
  RCC->AHB1ENR |=1;       // Bit 1, enable GPIOA Clock
  GPIOA->AFR[0] = 0x0700;    // alternate Function low register (AFRL2 
with AF7, because AF7 connected with USART2)
  GPIOA->MODER |= 0x0020;    // Set PA2 to alternate function

  USART2->BRR = 0x0683;    // baud rate 9600 @16MHz
  USART2->CR1 = 0x0008;    // enable Tx (Bit 4) (Tranmitter->Sender)
  USART2->CR1 |= 0x2000;    // enable UE (Bit 13) (USART)

void USART_write(int ch)
{
  while(!(USART2->SR & 0x0080)){}  // wait while Tx-Buffer is empty
    USART2-DR = (ch & 0xFF);
}

Es geht um die Zeile hier:

void USART_write(int ch)
{
  while(!(USART2->SR & 0x0080)){}  // wait while Tx-Buffer is empty
    USART2-DR = (ch & 0xFF);
}

Im SR, kann ich meinen Status Register abfragen ob mein TX (Bit 7) 
Sendet oder nicht. Aber wie genau funktioniert das? Wenn ich das mal 
jetzt nachrechnen möchte. Mit "!" wir gesagt, dass was in der Klammer 
steht soll nicht zu treffen. Jetzt würde ich gerne den Wert in der 
Klammer berechnen. Hat mein USART2->SR einen Wert oder bedeutet die 
Zeile nur, überprüfe ob SR 0x0080 ist?

Mich verwirrt die "&" Verknüpfung. Ich muss ja zwei Werte haben, damit 
ich die "&" anwenden kann, oder? In der Klammer würde 0x000 raus kommen 
und mit "!" es soll nicht 0x0000 raus kommen.

Kann mir das mal bitte jemand erklären?

LG
RW

von Träne (Gast)


Lesenswert?

Richard W. schrieb:
> Im SR, kann ich meinen Status Register abfragen ob mein TX (Bit 7)
> Sendet oder nicht. Aber wie genau funktioniert das? Wenn ich das mal
> jetzt nachrechnen möchte. Mit "!" wir gesagt, dass was in der Klammer
> steht soll nicht zu treffen. Jetzt würde ich gerne den Wert in der
> Klammer berechnen. Hat mein USART2->SR einen Wert oder bedeutet die
> Zeile nur, überprüfe ob SR 0x0080 ist?
>
> Mich verwirrt die "&" Verknüpfung. Ich muss ja zwei Werte haben, damit
> ich die "&" anwenden kann, oder? In der Klammer würde 0x000 raus kommen
> und mit "!" es soll nicht 0x0000 raus kommen.
>
> Kann mir das mal bitte jemand erklären?

ach du scheiße...

von Guest (Gast)


Lesenswert?

In einer besseren Welt enthält ein Register einen Wert, den man 
selbstverständlich mit logischen Bitoperationen verwenden kann.....

Vielleicht machst du dich mal mit Pointern, dereferenzierung und 
Bitoperationen vertraut und überlegst nochmal.

Bis dahin, wenn man etwas bitweise mit 0x0080 verundet kommt eine 1 raus 
wenn Bit 7 1 ist und 0 wenn es 0 ist. Alle anderen Bits in dem Register 
sind egal.

Das ! sorgt dafür, dass die Schleife ausgeführt wird solange der 
Vergleich 0 liefert, also Bit 7 null ist, da er das ergebnis invertiert.

von Stefan F. (Gast)


Lesenswert?

Natürlich hat USART2->SR einen Wert, das ist schließlich ein Register.

Stelle Dir Register als eine Reihe von 16 oder 32 Schaltern vor, die man 
wie RAM Zellen ändern und auslesen kann.

von S. Landolt (Gast)


Lesenswert?

> Ich hab mein Code geschrieben aber eine Zeile
> im Code verstehe ich nicht so ganz
Diesen Satz nun verstehe ich nicht, auch nicht beim besten Willen - 
wie kann man etwas schreiben, ohne es zu verstehen?

von W.S. (Gast)


Lesenswert?

Richard W. schrieb:
> // wait while Tx-Buffer is empty

Ähm... meinst du das ernst? Zum Senden willst du warten, solange der 
Tx leer ist? oder doch lieber 'until' ?

Und:
> while(!(USART2->SR & 0x0080)){}...
> ..Mich verwirrt die "&" Verknüpfung.

Tja, hätte C einen echten boolean Typ.. hat's aber nicht, deswegen gibt 
es zwei Und's und nicht jammern:
 A & B  verknüpft bitweise. Also 0xAA & 0x55 ergibt 0
 A && B verknüpft "logisch", also A bzw. B werden als "1" angesehen, 
wenn sie nicht 0 sind.

GANZ EINFACH... gelle?   ;-)

W.S.

von Richard W. (richard00)


Lesenswert?

Super, danke für eure Hilfe. ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.