2015-06-10 36 views
5

Próbuję komunikować się z urządzeniem peryferyjnym UART, używając DMA zarówno dla RX, jak i TX. Używam biblioteki HAL, która jest dostarczana przez ST (generowane za pomocą STCubeMX).STM32F4 Obsługa błędu urządzenia peryferyjnego podczas wykonywania transferu DMA (RX)

Mam do czynienia z kanałem UART z 1,5MBaud - więc aby nie stracić żadnych danych, skonfigurowałem DMA w trybie bezpośrednim, z okrągłym buforem i obsłużyłem przerwań half-transfer, aby zająć się danymi i utrzymuj DMA online, aby uzyskać więcej danych.

Problem polega na tym, że czasami widzę w rejestrze stanu UART, że bit Frame Error jest włączony, a czasami jest również włączona flaga błędu Overrun.

Potrafię obsłużyć utracone bajty (używając crc na pakietach strukturalnych), ale problem polega na tym, że urządzenie peryferyjne przestaje odbierać dane - ale DMA nie powoduje błędów ani nie zatrzymuje transferu.

Więc jeśli próbuję odebrać dane, a flaga jest w systemie zawiesza się.

Zobaczyłem, że HAL udostępnia funkcję __weak, która powinna obsługiwać UART_Error, ale nigdy nie jest wywoływana - a status w uchwycie HAL pozostaje normalny. tylko spojrzenie na rejestr może stwierdzić, że jest problem.

Jak wykrywać/obsługiwać tego typu błędy?

Dzięki

Odpowiedz

2

I nie korzystają z HAL ze względu na wydajność, ponieważ jest bardzo niezdarny i - imo również nie zapewnia dużo abstrakcji, aby uzasadnić, że. Obsługa sprzętu bezpośrednio nie jest dużo bardziej skomplikowana; jeszcze bardziej, ponieważ wciąż bardzo dobrze rozumiesz, co się dzieje. I jak już wykryłeś, HAL wspiera tylko pewne podejście; gdy podążysz własną ścieżką, zgubisz się.

Najwyraźniej masz podobne problemy, jak ustawiono flagę przepełnienia. Po takim błędzie, musisz ponownie zsynchronizować odbiornik z bytestream nadajnika po ogólnym błędzie. Wymagałoby to sygnalizacji poza pasmem przy użyciu symbolu lub warunku linii, który nie występuje w pakiecie. Błędy ramek są dobrym wskaźnikiem, że występują problemy z synchronizacją z początkiem symbolu (bit startowy).

Jeśli linia jest czysta (nie ma problemów z kompatybilnością elektromagnetyczną), nie powinny występować błędy ramkowania lub uszkodzenia danych (chyba że parametry czasowe nie pasują do siebie).

Jeśli używasz prostego ping-ponga, limit czasu może być wystarczający. Jednak właściwe rozwiązanie zależy od protokołu. Dobry projekt protokołu uwzględnia błędy transmisji i przepełnienia.

Należy pamiętać o tym, że oprócz przekazywania DMA należy włączyć powiadomienia o błędzie odbioru, aby zostać poinformowanym. Jednakże, jeśli używasz limitu czasu (i protokołu ping-pong), możesz po prostu usunąć flagi, ponieważ dane najwyraźniej nie dotarły w czasie. Jeśli faktycznie używasz przerwania błędów, bądź świadomy warunków wyścigu.