Ich sehe HAL die folgende Funktion zum Empfangen von seriellen Daten mit Unterbrechungen liefert aktiviert.
HAL_UART_RxCpltCallback()
wird aufgerufen, sobald die Anzahl der empfangenen Bytes Size
erreicht.
HAL deaktiviert rx Interrupts kurz vor diesem Rückruf
Problem ausführen: Variable seine
Die Menge des ankommenden Bytes (von 1 bis ~ 100), und ich brauche sie in einen Ringpuffer zu setzen.
So stelle ich Size
-1 und rufen HAL_UART_Receive_IT()
wieder in den Callback auf Interrupts wieder zu aktivieren, und es funktioniert gut, wenn die Platte 1 oder 2 Bytes hin gesendet wird und dann, aber Bytes jenseits diesesWie uart RX halten Interrupt für immer mit HAL-Bibliothek auf einem STM32F1
verpasst Meine Vermutung ist, sie sind verpasst, weil sie zwischen Interrupt-Deaktivierung ankommen - Aktivieren
Gibt es eine Möglichkeit, Interrupts für immer zu halten, ohne HAL Cube generierten Code zu überschreiben?
Wenn nicht, was wäre eine saubere Möglichkeit, die beteiligten Funktionen zu überschreiben?
Gibt es etwas, das ich vermisse, das die Notwendigkeit, diese Lösung zu finden, vermeiden würde?
Dies ist ein bekanntes Problem, ohne eine einfache Lösung zu sein scheint: http://stackoverflow.com/questions/24875873/stm32f4-uart-hal-driver –
wie DMA scheint, ist die Sache Schreiben von Daten von einem beliebigen Peripheriegerät in einen beliebigen Speicherpuffer einschließlich Ringpuffer (DMA-Einstellungen). Und DMA Interrupts ist der einfache Weg, um alle Daten, oder sogar seine Hälfte, im Moment des Empfangs zu behandeln. – Yuriy
Es hängt nicht wirklich von Ihrer Frage ab. Aber ich denke, dass es sich lohnt, keil io-Fahrer zu testen. Hier ist der Link, wo Sie sie für Ihre MCU finden können https://www.keil.com/dd2/pack/ –