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