STM32 hängt bei UART Overrun

Gast #4810548
Lesenswert?

Hallo,

Ich benutze die HAL Bibliothek von STM32 und habe jetzt einen UART zum 
Laufen bekommen. Bei einem Fehler werden (zunächst für Debugzwecke) 
diese Funktionen aufgerufen. Dabei löscht die HAL Bibliothek selbständig 
die Flags und ruft HAL_UART_ErrorCallback im Falle eines Fehlers auf.

void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle)
{
    Error_Handler();
}

void Error_Handler(void)
{
  /* Turn LED2 on */
  BSP_LED_On(LED2);
  while(1)
  {
    /* Error if LED2 is slowly blinking (1 sec. period) */
    BSP_LED_Toggle(LED2);
    HAL_Delay(1000);
  }
}

Wenn ich einen Overrun provoziere, bleibt das Programm aber im HAL_Delay 
stecken. Die LED blinkt nicht; der uwTick Counter zählt nicht hoch. Wenn 
ich den ErrorHandler nicht aufrufe und einfach nichts mache (in der 
Callback Funktion) läuft das Programm normal weiter.
Woran könnte es liegen, dass der ErrorHandler nicht funktioniert? Wenn 
ich diesen zB in der main aufrufe funktioniert die Funktion.
Gast #4810551
Lesenswert?

Marcel schrieb:
> Woran könnte es liegen, dass der ErrorHandler nicht funktioniert? Wenn
> ich diesen zB in der main aufrufe funktioniert die Funktion.

HAL_Delay läuft vermutlich über einen Timer Interrupt, dessen Priorität 
scheinbar niedriger ist als die des UART Interrupts.
Somit kommt der Timerinterrupt nicht mehr dran und dein delay 
funktioniert nicht mehr.
Gast #4810561
Lesenswert?

Ich arbeite nicht mit der HAL-Lib, sonder mit der Standard-Lib. Da mache 
ich das folgendermassen:


    if (USART_GetFlagStatus(USART1, USART_FLAG_ORE)) // on overrun
    {
        USART_ReceiveData(USART1);                   // clear flag
    }
    else
    {
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
          .....
        }
    }


Vielleicht hilft's....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren