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
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...
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.
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.
> 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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.