Wie halten uart-RX-interrupt aktiviert für immer mit HAL-Bibliothek auf einem STM32F1
Sehe ich HAL bietet die folgende Funktion für das empfangen von seriellen Daten mit interrupts: HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
was im Grunde setups rx-interrupts und zurück.
HAL_UART_RxCpltCallback()
wird aufgerufen, wenn die Menge der empfangenen bytes erreicht Size
.
HAL deaktiviert rx-interrupts kurz vor der Ausführung dieser Rückruf
Problem:
Die Anzahl der eingehenden bytes werden variable (von 1 bis ~100) und ich muss Sie in einen ring-buffer.
Also ich Size
1 und call HAL_UART_Receive_IT()
wieder innerhalb der callback zur re-enable interrupts, und es funktioniert gut, wenn das board gesendet wird, 1 oder 2 bytes jedes jetzt und dann, aber bytes sind verpasste darüber hinaus
Meine Vermutung ist, dass Sie fehlen, denn Sie kommen zwischen interrupt deaktivieren - aktivieren
Gibt es einen Weg, um interrupts läuft ewig ohne überschreiben HAL Cube generierten code?
Wenn nicht, was wäre eine saubere Art und Weise zu überschreiben, die beteiligten Funktionen?
Gibt es etwas, das mir fehlt, dass würde die Notwendigkeit vermeiden, finden diese Lösung?
- Dies scheint ein bekanntes problem ohne einfache Lösung: stackoverflow.com/questions/24875873/stm32f4-uart-hal-driver
- Scheint, wie DMA ist das Ding zum schreiben von Daten von den peripheren zu jedem Speicher-Puffer inklusive ring-Puffer (DMA-Einstellungen). Und DMA-interrupts ist der einfache Weg, um alle Daten, oder sogar die Hälfte, bei den empfangenden moment.
- Es ist nicht wirklich angewiesen auf Ihre Frage. Aber ich denke, es könnte würdig sein, zu versuchen, keil io-Treiber. Hier ist der link, wo Sie finden können, die Sie für Ihre mcu - keil.com/dd2/pack
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, UART ziehen Weg, statt der interrupt Weg.
Ziehen Weg: UART nicht zurück erhalten, bis die Menge der Daten, angegeben durch die parameter "Size".
UART_Receive_IT
so eingehende bytes gehen Sie direkt zu dem ring-buffer und interrupts nicht deaktiviertIch denke, Sie haben, um ein Sonderzeichen an das Ende der massage, oder Sie machen Ihr eigenes Protokoll z.B. die Nachricht Kopfzeile, Nachricht, Länge , Inhalt , Prüfsumme
und Sie machen den interrupt aktiviert, der für ein byte und im interrupt-handler, den Sie speichern den empfangenen Puffer, bis das Letzte byte der Nachricht und klicken Sie senden, um die wichtigste Aufgabe im Falle der RTOS, oder legen Sie ein globales flag.
Durch die Art und Weise stellen Sie sicher, dass die entsprechenden receive-bytes Größe in
innen
bitte überprüfen Sie die Rückkehr von
HAL_UART_Receive_IT
es möglicherweise Fehler zurückgeben und auchUmsetzung der
und prüfen, ob es ein Fehler in der UART-bus.
Versuchen, diese
Zirkulären Puffer mit DMA(für den Empfang)scheint zu sein, eine Lösung für Ihre Anforderung. Dies wird immer geben RX-interrupt(Sie müssen nur konfigurieren Sie es einmal).
Für ähnliche Anforderungen, in der Regel bin ich mit einer 1-byte-kreisförmigen Puffer, um Daten zu behandeln. Erhalten Sie die Verarbeitung erfolgt in der ISR.