STM32 Nucleo32 - FREERTOS mit UART-Rx

OP #7043550
Lesenswert?
• ▲
▼
Hallo,

Ich verwende einen STM32 Nucleo32 mit FREERTOS und gebe über einen Task 
im Sekundentakt eine Nachricht über UART auf Putty aus und möchte 
zusätzlich wenn ich ein Zeichen eingebe, dass die 
"HAL_UART_RxCpltCallback" aufgerufen wird und anschließend wieder in den 
Task gesprungen wird.

Task:
void monitoringFunction(void *argument)
{
  printf("Test\n");
  osDelay(1000);
}

Callback:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  printf("CpltCallback\n");
  HAL_UART_Receive_IT(&huart2, RxBuffer, RxBuffer_SIZE);
}

Habe vor dem osKernelInitialize() den UART2-Interrupt-Receive aktiviert
HAL_UART_Receive_IT(&huart2, RxBuffer, RxBuffer_SIZE);

Wenn ich das Programm starte tut sich mal nichts.
Wenn ich eine Taste drücke wird in die Callback gesprungen und 
"CpltCallback" ausgegeben.
Wenn ich wieder eine Taste drücke wird wieder in die Callback gesprungen 
und "CpltCallback" ausgegeben.

ABER es wird nicht in den Task gesprungen.

Wenn ich die HAL_UART_Receive_IT(&huart2, RxBuffer, RxBuffer_SIZE) in 
der Callback entferne, komme ich nur ein einziges mal in die Callback 
und der Task läuft ständig ohne Interruptfunktion.

Wenn ich den Interrupt anstatt eines Zeichens über UART mit einem 
Externen Interrupt mache funktioniert das kurzzeitige unterbrechen des 
Tasks.

Weiß wer warum das mit UART_IT nicht funktioniert?
Gast #7043560
Lesenswert?
• ▲
▼
Ich habe vor Wochen das gleiche gemacht, war nicht so leicht.
Die Sourcen sind auf der Arbeit, komme ich jetzt am WE nicht ran.

Es muss der Interrupt für UartXX aktiviert werden.
In der Interrupt-Routine, muss dann der richtige Callback-Handler 
angesprungen werden.
Die Callbacks müssen global aktiviert werden, das ist so ein #define in 
einen STM Include.
Der eigene Callback muss dann auch in dem Uart-Handle noch aktiviert 
werden.

Dann kam auch ein Zeichen in meinem Callback an.
#7056740
Lesenswert?
• ▲
▼
Roman R. schrieb:
> Callback:
> void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
> {
>   printf("CpltCallback\n");
>   HAL_UART_Receive_IT(&huart2, RxBuffer, RxBuffer_SIZE);
> }

HAL_UART_RxCpltCallback() wird von einem Interrupt aufgerufen, das 
heisst, dort drin sollte man es unbedingt vermeiden, eine zeitraubende 
printf() funktion aufzurufen, ansonsten kann es megamässige Probleme 
geben.
Am besten für das printf einen eigenen FreeRTOS Task aufsetzen und darin 
beispielsweise auf eine Semaphore warten (xSemaphoreTake), die man im 
HAL_UART_RxCpltCallback freigibt (xSemaphoreGiveFromISR).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.