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
InformationsquelleAutor Gerard Vuyk | 2016-04-15
Schreibe einen Kommentar