Ich versuche, an UART für AVR zu arbeiten. Nachdem ich die Baudratenregister UBRRnX eingestellt habe, versuche ich, das UCSRnA-Register zu konfigurieren.
Ich versuche, das 2. Bit U2XO zu setzen. Welches ist der richtige Weg?UCSR0A = (1 << U2X0)
oder
UCSR0A = UCSR0A | (1 << U2X0)
( Beachten Sie den OR-Operator in der 2. Anweisung )
In diesem Fall:
UCSR0A = (1 << U2X0);
1<<U2XO = 00000010
, 1 wird nach links in die U2XO-Position verschoben. Wenn Sie also diesen Wert an UCSR0A übergeben, lautet der Inhalt des Registers:
UCSR0A = 00000010
Diese Operation setzt alle Bits auf 0 , aber U2X0, wenn beispielsweise RXC0 auf 1 gesetzt worden wäre , dann würde diese Operation es auf 0 löschen . Wenn Sie sich dessen nicht bewusst sind, kann dies später zu Kopfschmerzen führen.
In diesem:
UCSR0A = UCSR0A | (1 << U2X0);
was gleich ist:
UCSR0A |= (1<<U2X0);
Hier setzen Sie nur das zweite Bit auf eins und lassen den Rest unverändert, was vorzuziehen ist, da Sie nicht versehentlich etwas ändern. Der Inhalt wird sein:
// UCSRA0 = xxxxxxxx before operation something is in the register
UCSR0A = UCSR0A | (1 << U2X0); // OR current with 00000010
// UCSRA0 = xxxxxx1x something OR 1 will be 1
wobei x
der unveränderte/vorherige Wert des Bits ist. Wenn 1 x
ist , bleibt 1 ODER 0 1 und wenn 0 x
ist , bleibt 0 ODER 0 0 .
Daher schlage ich den zweiten Weg vor, weil es so einfacher ist, nachzuverfolgen, welches Bit gesetzt ist und welches nicht, und Sie die zuvor angewendete Konfiguration nicht versehentlich ändern.
am3
Bence Kaulics
Ignacio Vazquez-Abrams
Bence Kaulics