USART2_write

OP #6346664
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
Gast #6346672
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...
Gast #6346696
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.
Gast #6346908
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?
Gast #6347029
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren