[Nachgedruckt] Verwendung des TXE- und TC-Logos beim Senden von Daten von USART of STM32

Es gibt 2 Register am sendenden Ende von USART, eines ist das USART_DR-Register, das das Programm sehen kann, und das andere ist das Schieberegister, das das Programm nicht sehen kann. Es gibt zwei Flags, die der USART-Datenübertragung entsprechen, und eines ist TXE = Sendedatenregister ist leer Der andere ist TC = Ende der Übertragung.

Wenn die Daten in USART_DR in das Schieberegister übertragen werden, wird TXE gesetzt. Zu diesem Zeitpunkt beginnt das Schieberegister, Daten Stück für Stück an die TX-Signalleitung zu übertragen. Da TDR jedoch leer geworden ist, kann das Programm das nächste Byte senden USART_DR) wird in TDR geschrieben, ohne auf das Ende der Übertragung aller Bits im Schieberegister zu warten. Wenn alle Bits übertragen werden (nachdem das Stoppbit gesendet wurde), setzt die Hardware das TC-Flag.

  Wenn andererseits der USART gerade initialisiert wurde und keine Daten gesendet wurden, gibt es auch ein TXE-Flag, da das Sendedatenregister leer ist. Die Bedeutung von TXEIE und TCIE ist sehr einfach: Mit TXEIE können Interrupts generiert werden, wenn das TXE-Flag '1' ist, während mit TCIE Interrupts generiert werden können, wenn das TC-Flag '1' ist.

  Wann Sie welches Logo verwenden möchten, müssen Sie entsprechend Ihren Anforderungen entscheiden. Ich denke jedoch, dass TXE es Programmen ermöglicht, mehr Zeit zum Ausfüllen des TDR-Registers zu haben, um einen unterbrechungsfreien Datenfluss sicherzustellen. TC kann dem Programm den genauen Zeitpunkt mitteilen, zu dem die Übertragung endet. Dies ist hilfreich, damit das Programm den Zeitpunkt des externen Datenflusses steuern kann.

 

TXE - Schreibregister DR gelöscht

RXNE - Register DR zum Löschen lesen, kann auch manuell per Software gelöscht werden

TC - Das Lese- / Schreibregister DR wird gelöscht oder kann manuell per Software gelöscht werden

 

Lassen Sie mich zuerst über TC sprechen. Das ist Übertragung abgeschlossen. Der Interrupt wird nach dem Senden eines Bytes eingegeben, das als "Interrupt nach dem Senden" bezeichnet wird. Auf die gleiche Weise wie bei der ursprünglichen TI-Methode von 8051 werden Interrupts nach dem Senden gesendet. Sie müssen in der Sendefunktion ein Byte senden, um den Interrupt auszulösen. Die Sendefunktion lautet wie folgt

/ *******
Funktion: Interrupt-Modus zum Senden eines Strings. Verwenden Sie die Methode zur Beurteilung von TC. Das heißt, um das Interrupt-Bit nach der Übertragung zu beurteilen.
Eingabe: Die erste Adresse des String-
Ausgangs: Nein
****** /
void USART_SendDataString (u8 * pData)
{
    pDataByte = pData;
 
    USART_ClearFlag (USART1, USART_FLAG_TC); // Löschen Sie das Flag für den Abschluss der Übertragung, da sonst die Daten des ersten Bytes verloren gehen können.
    
    Von Internetnutzern bereitgestellt . USART_SendData (USART1, * (pDataBy ++) ); // Muss ++ sein, sonst wird das erste Zeichen t zweimal gesendet.
} Die


Interrupt-Handler-Funktion lautet wie folgt
/ ********
* Funktionsname: USART1_IRQHandler
* Beschreibung: Diese Funktion verarbeitet die globale Interrupt-Anforderung von USART1.
* Eingabe: Keine
* Ausgabe: Keine
* Rückgabe: Keine
********* /
void USART1_IRQHandler (void)
{
    if (USART_GetITStatus (USART1, USART_IT_TC) == SET)
    {
        if (* pDataByte == '\ 0') // TC muss SR lesen + DR schreiben, um 0 zu löschen 'Verwenden Sie ein if, um
            USART_ClearFlag (USART1, USART_FLAG_TC) zu deaktivieren. // Andernfalls ist TC immer gesetzt. TCIE ist ebenfalls geöffnet, was zu einer kontinuierlichen Unterbrechung führt. Löschen Sie es, Sie müssen TCIE nicht deaktivieren,
        sonst
            USART_SendData (USART1, * pDataByte ++);
    }

}

wobei u8 * pDataByte; eine externe Zeigervariable

im Interrupt-Handler ist. Nach dem Senden der Zeichenfolge müssen Sie den TC-Interrupt nicht schließen, um TCIE zu aktivieren. Sie müssen nur das Flag-Bit TC löschen. Dies kann vermieden werden TC == SET verursachte eine wiederholte Eingabeunterbrechung.

void USART_Config ()
{
 ........................................

 USART_ITConfig (USART1, USART_IT_TC, ENABLE); // Tramsimssion abgeschlossen, der Interrupt wird generiert. Der TC-Interrupt muss hier platziert werden, sonst geht das erste Byte weiterhin verloren.

 USART_Cmd (USART1, ENABLE); // USART1 aktivieren
}

.................................................. ....................

Lassen Sie uns über die Beurteilung von TXE sprechen. Das heißt, Tx DR leer, das Übertragungsregister ist leer. Wenn TXEIE aktiviert ist, wird ein Interrupt generiert, solange Tx DR leer ist. Daher muss es nach dem Senden des Strings ausgeschaltet werden, da es sonst zu einer wiederholten Unterbrechung der Eingabe kommt. Dies unterscheidet sich auch von TC.

Die Sendefunktion lautet wie folgt:
/ *******
Funktion: Zeichenfolge im Interrupt-Modus senden. Verwenden Sie die Methode zur Beurteilung von TC. Das heißt, beurteilen Sie das Interrupt-Bit nach dem Senden.
Eingabe: Die erste Adresse der Zeichenfolge
Ausgabe: Nein
****** /
void USART_SendDataString (u8 * pData)
{
    pDataByte = pData;
    USART_ITConfig (USART1, USART_IT_TXE, ENABLE); // Solange das Senderegister leer ist, gibt es immer einen Interrupt. Wenn Sie also keine Daten senden, deaktivieren Sie nur den Sendeinterrupt Es wird nur geöffnet, wenn der Versand beginnt.
    
} Die

Interrupt-Handler-Funktionen lauten wie folgt:

/ ********
* Funktionsname: USART1_IRQHandler
* Beschreibung: Diese Funktion verarbeitet die globale Interrupt-Anforderung von USART1.
* Eingabe: Keine
* Ausgabe: Keine
* Rückgabe: Keine
******* * /
void USART1_IRQHandler (void)
{
    if (USART_GetITStatus (USART1, USART_IT_TXE) == SET)
    {
        if (* pDataByte == '\ 0') // Die an das Ende zu sendenden Bytes sind NULL
            USART_ITConfig (USART1, USART_IT_TXE, DISABLE); // Weil es gesendet wird registrieren leer Interrupt, so muss das fertige String abgeschaltet werden, oder so lange leer, es in brechen
        die sonst
            USART_SendData (die USART1, pDataByte * ++);
    }

}

serielle Schnittstelle Initialisierungsfunktion nicht offen TXE unterbrochen würde (in In der Sendefunktion öffnen)

Übertragung von: Verwendung der TXE- und TC-Flags, wenn der USART von STM32 Daten sendet

Veröffentlicht 91 Originalarbeiten · erntete Lob 17 · Ansichten 50000 +

Ich denke du magst

Origin blog.csdn.net/qq_23327993/article/details/105494939
Empfohlen
Rangfolge