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.
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.
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....
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.