Ich habe den STM32CubeMx / HAL jetzt in einigen Projekten verwendet und festgestellt, dass die von ihm generierte UART-Handhabungssoftware auf der Empfangsseite deutliche Mängel aufweist.
Beim Senden möchten Sie normalerweise einen Datenblock oder eine Textzeile senden. In diesem Fall wissen Sie im Voraus, wie lange die Datenübertragung dauert, und daher ist die Verwendung des DMA eine naheliegende Lösung. Sobald die Übertragung abgeschlossen ist, erhalten Sie eine Unterbrechung und können mithilfe der UART TX-Rückruffunktion Ihrem Hauptcode anzeigen, dass die Übertragung abgeschlossen ist, und Sie können einen weiteren Datenblock senden.
Wenn es um den Datenempfang geht, setzen alle von ST bereitgestellten Funktionen voraus, dass Sie wissen, wie viele Zeichen das sendende Gerät Ihnen geben wird, bevor es mit dem Senden beginnt. Normalerweise ist dies nicht bekannt. Die Interrupt-Funktion legt die empfangenen Daten in einem Puffer ab und zeigt nur an, dass Daten verfügbar sind, wenn die vordefinierte Anzahl von Zeichen empfangen wurde. Wenn Sie versuchen, die DMA- oder Interrupt-Funktion zum Empfangen von Daten zu verwenden, indem Sie sequentielle Einzelzeichenübertragungen einrichten, bedeutet die Einrichtungszeit für jede dieser Funktionen, dass Sie Zeichen mit einer anderen als der langsamsten Datenrate (der Baudrate, die Sie erhalten) verlieren Der Beginn des Datenverlusts hängt von der Taktrate Ihres Prozessors ab und lädt den Prozessor übermäßig, sodass keine Befehlszyklen für eine andere Verarbeitung verbleiben
Um dies zu umgehen, habe ich meine eigene Interrupt-Handler-Funktion geschrieben, die die Daten in einem kleinen lokalen Ringpuffer speichert und eine Anzahl festlegt, die vom Hauptcode (einem RTOS-Zählsemaphor) gelesen wird, um anzuzeigen, dass empfangene Daten bereit sind. Der Hauptcode kann dann die Daten aus diesem Puffer nach Belieben erfassen. Es spielt keine Rolle, ob sich die Erfassung der Daten verzögert, vorausgesetzt, der lokale Puffer läuft nicht über, bevor die Daten erfasst werden.